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
Cmd instead of
Ctrl .
import Std.Data.Int.Lemmas
import Std.Data.Rat.Basic
/-! # Additional lemmas about the Rational Numbers -/
namespace Rat
@[ simp ] theorem maybeNormalize_eq { num den g } ( den_nz reduced ) :
maybeNormalize num den g den_nz reduced =
{ num := num . div g , den := den / g , den_nz , reduced } := by
unfold maybeNormalize ; split
ยท subst g ; simp
ยท rfl
theorem normalize.reduced' { num : Int } { den g : Nat } ( den_nz : den โ 0 )
( e : g = num . natAbs . gcd den ) : ( num / g ). natAbs . coprime ( den / g ) := by
rw [ โ Int.div_eq_ediv_of_dvd ( e โธ Int.ofNat_dvd_left . 2 : โ {a b : Prop }, (a โ b ) โ b โ a 2 ( Nat.gcd_dvd_left ..)) ]
exact normalize.reduced den_nz e
theorem normalize_eq { num den } ( den_nz ) : normalize num den den_nz =
{ num := num / num . natAbs . gcd den
den := den / num . natAbs . gcd den
den_nz := normalize.den_nz den_nz rfl : โ {ฮฑ : Sort ?u.1057} {a : ฮฑ }, a = a rfl
reduced := normalize.reduced' den_nz rfl : โ {ฮฑ : Sort ?u.1076} {a : ฮฑ }, a = a rfl } := by
simp only [ normalize , maybeNormalize_eq ,
Int.div_eq_ediv_of_dvd ( Int.ofNat_dvd_left . 2 : โ {a b : Prop }, (a โ b ) โ b โ a 2 ( Nat.gcd_dvd_left ..))]
@[ simp ] theorem normalize_zero ( nz ) : normalize 0 d nz = 0 := by
simp [ normalize , Int.zero_div , Int.natAbs_zero , Nat.div_self : โ {n : Nat }, 0 < n โ n / n = 1 Nat.div_self ( Nat.pos_of_ne_zero : โ {n : Nat }, n โ 0 โ 0 < n Nat.pos_of_ne_zero nz )] ; rfl
theorem mk_eq_normalize ( num den nz c ) : โจ num , den , nz , c โฉ = normalize num den nz := by
simp [ normalize_eq , c . gcd_eq_one ]
theorem normalize_self ( r : Rat ) : normalize r . num r . den r . den_nz : โ (self : Rat ), self .den โ 0 den_nz = r := ( mk_eq_normalize ..). symm : โ {ฮฑ : Sort ?u.2002} {a b : ฮฑ }, a = b โ b = a symm
theorem normalize_mul_left { a : Nat } ( d0 : d โ 0 ) ( a0 : a โ 0 ) :
normalize (โ a * n ) ( a * d ) ( Nat.mul_ne_zero : โ {n m : Nat }, n โ 0 โ m โ 0 โ n * m โ 0 Nat.mul_ne_zero a0 d0 ) = normalize n d d0 := by
simp [ normalize_eq , mk'.injEq , Int.natAbs_mul , Nat.gcd_mul_left ,
Nat.mul_div_mul_left : โ {m : Nat } (n k : Nat ), 0 < m โ m * n / (m * k ) = n / k Nat.mul_div_mul_left _ _ ( Nat.pos_of_ne_zero : โ {n : Nat }, n โ 0 โ 0 < n Nat.pos_of_ne_zero a0 ), Int.ofNat_mul : โ (n m : Nat ), โ(n * m ) = โn * โm Int.ofNat_mul,
Int.mul_ediv_mul_of_pos : โ {a : Int } (b c : Int ), 0 < a โ a * b / (a * c ) = b / c Int.mul_ediv_mul_of_pos _ _ ( Int.ofNat_pos . 2 : โ {a b : Prop }, (a โ b ) โ b โ a 2 <| Nat.pos_of_ne_zero : โ {n : Nat }, n โ 0 โ 0 < n Nat.pos_of_ne_zero a0 )]
theorem normalize_mul_right { a : Nat } ( d0 : d โ 0 ) ( a0 : a โ 0 ) :
normalize ( n * a ) ( d * a ) ( Nat.mul_ne_zero : โ {n m : Nat }, n โ 0 โ m โ 0 โ n * m โ 0 Nat.mul_ne_zero d0 a0 ) = normalize n d d0 := by
rw [ โ normalize_mul_left (d0 := d0 ) a0 ] ; congr 1 <;> [ apply Int.mul_comm : โ (a b : Int ), a * b = b * a Int.mul_comm; apply Nat.mul_comm : โ (n m : Nat ), n * m = m * n Nat.mul_comm]
theorem normalize_eq_iff ( zโ : dโ โ 0 : unknown metavariable '?_uniq.3326'
0) ( zโ : dโ โ 0 ) :
normalize nโ dโ zโ = normalize nโ dโ zโ โ nโ * dโ = nโ * dโ := by
dโ, dโ : Nat nโ, nโ : Int zโ : dโ โ 0 zโ : dโ โ 0 constructor dโ, dโ : Nat nโ, nโ : Int zโ : dโ โ 0 zโ : dโ โ 0 mp dโ, dโ : Nat nโ, nโ : Int zโ : dโ โ 0 zโ : dโ โ 0 mpr dโ, dโ : Nat nโ, nโ : Int zโ : dโ โ 0 zโ : dโ โ 0 <;> dโ, dโ : Nat nโ, nโ : Int zโ : dโ โ 0 zโ : dโ โ 0 mp dโ, dโ : Nat nโ, nโ : Int zโ : dโ โ 0 zโ : dโ โ 0 mpr dโ, dโ : Nat nโ, nโ : Int zโ : dโ โ 0 zโ : dโ โ 0 intro h dโ, dโ : Nat nโ, nโ : Int zโ : dโ โ 0 zโ : dโ โ 0 h : nโ * โdโ = nโ * โdโ mpr
dโ, dโ : Nat nโ, nโ : Int zโ : dโ โ 0 zโ : dโ โ 0 ยท mp nโ * โdโ = nโ * โdโ mp nโ * โdโ = nโ * โdโ dโ, dโ : Nat nโ, nโ : Int zโ : dโ โ 0 zโ : dโ โ 0 h : nโ * โdโ = nโ * โdโ mpr simp only [ normalize_eq , mk'.injEq ] at h mp nโ * โdโ = nโ * โdโ
mp nโ * โdโ = nโ * โdโ have' hnโ := Int.ofNat_dvd_left . 2 : โ {a b : Prop }, (a โ b ) โ b โ a 2 <| Nat.gcd_dvd_left nโ . natAbs dโ mp nโ * โdโ = nโ * โdโ
mp nโ * โdโ = nโ * โdโ have' hnโ := Int.ofNat_dvd_left . 2 : โ {a b : Prop }, (a โ b ) โ b โ a 2 <| Nat.gcd_dvd_left nโ . natAbs dโ mp nโ * โdโ = nโ * โdโ
mp nโ * โdโ = nโ * โdโ have' hdโ := Int.ofNat_dvd . 2 : โ {a b : Prop }, (a โ b ) โ b โ a 2 <| Nat.gcd_dvd_right nโ . natAbs dโ mp nโ * โdโ = nโ * โdโ
mp nโ * โdโ = nโ * โdโ have' hdโ := Int.ofNat_dvd . 2 : โ {a b : Prop }, (a โ b ) โ b โ a 2 <| Nat.gcd_dvd_right nโ . natAbs dโ mp nโ * โdโ = nโ * โdโ
mp nโ * โdโ = nโ * โdโ rw [ mp nโ * โdโ = nโ * โdโ โ Int.ediv_mul_cancel : โ {a b : Int }, b โฃ a โ a / b * b = a Int.ediv_mul_cancel ( Int.dvd_trans : โ {a b c : Int }, a โฃ b โ b โฃ c โ a โฃ c Int.dvd_trans hdโ ( Int.dvd_mul_left : โ (a b : Int ), b โฃ a * b Int.dvd_mul_left ..)),
mp nโ * โdโ = nโ * โdโ Int.mul_ediv_assoc : โ (a : Int ) {b c : Int }, c โฃ b โ a * b / c = a * (b / c ) Int.mul_ediv_assoc _ hdโ , mp nโ * โdโ = nโ * โdโ โ Int.ofNat_ediv : โ (m n : Nat ), โ(m / n ) = โm / โn Int.ofNat_ediv, mp nโ * โdโ = nโ * โdโ โ h . 2 , mp nโ * โdโ = nโ * โdโ Int.ofNat_ediv : โ (m n : Nat ), โ(m / n ) = โm / โn Int.ofNat_ediv,
mp nโ * โdโ = nโ * โdโ โ Int.mul_ediv_assoc : โ (a : Int ) {b c : Int }, c โฃ b โ a * b / c = a * (b / c ) Int.mul_ediv_assoc _ hdโ , mp nโ * โdโ = nโ * โdโ Int.mul_ediv_assoc' : โ (b : Int ) {a c : Int }, c โฃ a โ a * b / c = a / c * b Int.mul_ediv_assoc' _ hnโ ,
mp nโ * โdโ = nโ * โdโ Int.mul_right_comm : โ (a b c : Int ), a * b * c = a * c * b Int.mul_right_comm, mp nโ * โdโ = nโ * โdโ h . 1 , mp nโ * โdโ = nโ * โdโ Int.ediv_mul_cancel : โ {a b : Int }, b โฃ a โ a / b * b = a Int.ediv_mul_cancel hnโ mp nโ * โdโ = nโ * โdโ ]
dโ, dโ : Nat nโ, nโ : Int zโ : dโ โ 0 zโ : dโ โ 0 ยท dโ, dโ : Nat nโ, nโ : Int zโ : dโ โ 0 zโ : dโ โ 0 h : nโ * โdโ = nโ * โdโ mpr dโ, dโ : Nat nโ, nโ : Int zโ : dโ โ 0 zโ : dโ โ 0 h : nโ * โdโ = nโ * โdโ mpr rw [ dโ, dโ : Nat nโ, nโ : Int zโ : dโ โ 0 zโ : dโ โ 0 h : nโ * โdโ = nโ * โdโ mpr โ normalize_mul_right _ zโ , dโ, dโ : Nat nโ, nโ : Int zโ : dโ โ 0 zโ : dโ โ 0 h : nโ * โdโ = nโ * โdโ mpr dโ, dโ : Nat nโ, nโ : Int zโ : dโ โ 0 zโ : dโ โ 0 h : nโ * โdโ = nโ * โdโ mpr โ normalize_mul_left zโ zโ , dโ, dโ : Nat nโ, nโ : Int zโ : dโ โ 0 zโ : dโ โ 0 h : nโ * โdโ = nโ * โdโ mpr dโ, dโ : Nat nโ, nโ : Int zโ : dโ โ 0 zโ : dโ โ 0 h : nโ * โdโ = nโ * โdโ mpr Int.mul_comm : โ (a b : Int ), a * b = b * a Int.mul_comm dโ , dโ, dโ : Nat nโ, nโ : Int zโ : dโ โ 0 zโ : dโ โ 0 h : nโ * โdโ = nโ * โdโ mpr dโ, dโ : Nat nโ, nโ : Int zโ : dโ โ 0 zโ : dโ โ 0 h : nโ * โdโ = nโ * โdโ mpr h dโ, dโ : Nat nโ, nโ : Int zโ : dโ โ 0 zโ : dโ โ 0 h : nโ * โdโ = nโ * โdโ mpr ]
theorem maybeNormalize_eq_normalize { num : Int } { den g : Nat } ( den_nz reduced )
( hn : โ g โฃ num ) ( hd : g โฃ den ) :
maybeNormalize num den g den_nz reduced = normalize num den ( mt : โ {a b : Prop }, (a โ b ) โ ยฌ b โ ยฌ a mt ( : den = 0 โ den / g = 0 (by : den = 0 โ den / g = 0 by simp [ยท]) : den = 0 โ den / g = 0 simp [ยท]) : den = 0 โ den / g = 0 simp simp [ยท]) : den = 0 โ den / g = 0 [ยท]) den_nz ) := by
simp only [ maybeNormalize_eq , mk_eq_normalize , Int.div_eq_ediv_of_dvd hn ]
have : g โ 0 := mt : โ {a b : Prop }, (a โ b ) โ ยฌ b โ ยฌ a mt ( by : g = 0 โ den / g = 0 by simp [ยท]) : g = 0 โ den / g = 0 simp [ยท]) : g = 0 โ den / g = 0 simp simp [ยท]) : g = 0 โ den / g = 0 [ยท]) den_nz
rw [ โ normalize_mul_right _ this , Int.ediv_mul_cancel : โ {a b : Int }, b โฃ a โ a / b * b = a Int.ediv_mul_cancel hn ]
congr 1 ; exact Nat.div_mul_cancel : โ {n m : Nat }, n โฃ m โ m / n * n = m Nat.div_mul_cancel hd
@[ simp ] theorem normalize_eq_zero ( d0 : d โ 0 : unknown metavariable '?_uniq.4805'
0) : normalize n d d0 = 0 โ n = 0 := by
have' := normalize_eq_iff d0 Nat.one_ne_zero refine'_3 refine'_1 refine'_2
rw [ refine'_3 refine'_1 refine'_2 normalize_zero (d := 1 ) refine'_3 refine'_1 refine'_1 ] refine'_3 refine'_1 refine'_1 at this refine'_3 refine'_1 refine'_1 ; refine'_3 refine'_1 refine'_1 rw [ refine'_3 refine'_1 refine'_1 this ] ; simp
theorem normalize_num_den' ( num den nz ) : โ d : Nat , d โ 0 โง
num = ( normalize num den nz ). num * d โง den = ( normalize num den nz ). den * d := by
refine โจ num . natAbs . gcd den , Nat.gcd_ne_zero_right nz , ?_ โฉ
simp [ normalize_eq , Int.ediv_mul_cancel : โ {a b : Int }, b โฃ a โ a / b * b = a Int.ediv_mul_cancel ( Int.ofNat_dvd_left . 2 : โ {a b : Prop }, (a โ b ) โ b โ a 2 <| Nat.gcd_dvd_left ..),
Nat.div_mul_cancel : โ {n m : Nat }, n โฃ m โ m / n * n = m Nat.div_mul_cancel ( Nat.gcd_dvd_right ..)]
theorem normalize_num_den ( h : normalize n d z = โจ n' , d' , z' , c โฉ) :
โ m : Nat , m โ 0 โง n = n' * m โง d = d' * m := by
have := normalize_num_den' n d z ; rwa [ h ] at this
theorem normalize_eq_mkRat { num den } ( den_nz ) : normalize num den den_nz = mkRat num den := by
simp [ mkRat , den_nz ]
theorem mkRat_num_den ( z : d โ 0 ) ( h : mkRat n d = โจ n' , d' , z' , c โฉ) :
โ m : Nat , m โ 0 โง n = n' * m โง d = d' * m :=
normalize_num_den (( normalize_eq_mkRat z ). symm : โ {ฮฑ : Sort ?u.6502} {a b : ฮฑ }, a = b โ b = a symm โธ h )
theorem mkRat_def ( n d ) : mkRat n d = if d0 : d = 0 then 0 else normalize n d d0 := rfl : โ {ฮฑ : Sort ?u.6643} {a : ฮฑ }, a = a rfl
theorem mkRat_self : โ (a : Rat ), mkRat a .num a .den = a mkRat_self ( a : Rat ) : mkRat a . num a . den = a := by
rw [ โ normalize_eq_mkRat a . den_nz : โ (self : Rat ), self .den โ 0 den_nz, normalize_self ]
theorem mk_eq_mkRat ( num den nz c ) : โจ num , den , nz , c โฉ = mkRat num den := by
simp [ mk_eq_normalize , normalize_eq_mkRat ]
@[ simp ] theorem zero_mkRat ( n ) : mkRat 0 n = 0 := by simp [ mkRat_def ] (if h : n = 0 then 0 else 0 ) = 0 ; (if h : n = 0 then 0 else 0 ) = 0 apply ite_self : โ {ฮฑ : Sort ?u.7318} {c : Prop } {d : Decidable c } (a : ฮฑ ), (if c then a else a ) = a ite_self
@[ simp ] theorem mkRat_zero ( n ) : mkRat n 0 = 0 := by simp [ mkRat_def ]
theorem mkRat_eq_zero ( d0 : d โ 0 ) : mkRat n d = 0 โ n = 0 := by simp [ mkRat_def , d0 ]
theorem mkRat_ne_zero ( d0 : d โ 0 ) : mkRat n d โ 0 โ n โ 0 := not_congr ( mkRat_eq_zero d0 )
theorem mkRat_mul_left { a : Nat } ( a0 : a โ 0 ) : mkRat (โ a * n ) ( a * d ) = mkRat n d := by
if d0 : d = 0 then simp [ d0 ] else
rw [ โ normalize_eq_mkRat d0 , โ normalize_mul_left d0 a0 , normalize_eq_mkRat ]
theorem mkRat_mul_right { a : Nat } ( a0 : a โ 0 ) : mkRat ( n * a ) ( d * a ) = mkRat n d := by
rw [ โ mkRat_mul_left (d := d ) a0 ] ; congr 1 <;> [ apply Int.mul_comm : โ (a b : Int ), a * b = b * a Int.mul_comm; apply Nat.mul_comm : โ (n m : Nat ), n * m = m * n Nat.mul_comm]
theorem mkRat_eq_iff : โ {dโ dโ : Nat } {nโ nโ : Int }, dโ โ 0 โ dโ โ 0 โ (mkRat nโ dโ = mkRat nโ dโ โ nโ * โdโ = nโ * โdโ ) mkRat_eq_iff ( zโ : dโ โ 0 : unknown metavariable '?_uniq.8805'
0) ( zโ : dโ โ 0 ) :
mkRat nโ dโ = mkRat nโ dโ โ nโ * dโ = nโ * dโ := by
dโ, dโ : Nat nโ, nโ : Int zโ : dโ โ 0 zโ : dโ โ 0 rw [ dโ, dโ : Nat nโ, nโ : Int zโ : dโ โ 0 zโ : dโ โ 0 โ normalize_eq_mkRat zโ , dโ, dโ : Nat nโ, nโ : Int zโ : dโ โ 0 zโ : dโ โ 0 dโ, dโ : Nat nโ, nโ : Int zโ : dโ โ 0 zโ : dโ โ 0 โ normalize_eq_mkRat zโ , dโ, dโ : Nat nโ, nโ : Int zโ : dโ โ 0 zโ : dโ โ 0 dโ, dโ : Nat nโ, nโ : Int zโ : dโ โ 0 zโ : dโ โ 0 normalize_eq_iff dโ, dโ : Nat nโ, nโ : Int zโ : dโ โ 0 zโ : dโ โ 0 nโ * โdโ = nโ * โdโ โ nโ * โdโ = nโ * โdโ ]
@[ simp ] theorem divInt_ofNat : โ (num : Int ) (den : Nat ), num /. โden = mkRat num den divInt_ofNat ( num den ) : num /. ( den : Nat ) = mkRat num den := by
simp [ divInt , normalize_eq_mkRat ]
theorem mk_eq_divInt ( num den nz c ) : โจ num , den , nz , c โฉ = num /. ( den : Nat ) := by
simp [ mk_eq_mkRat ]
theorem divInt_self : โ (a : Rat ), a .num /. โa .den = a divInt_self ( a : Rat ) : a . num /. a . den = a := by rw [ divInt_ofNat : โ (num : Int ) (den : Nat ), num /. โden = mkRat num den divInt_ofNat, mkRat_self : โ (a : Rat ), mkRat a .num a .den = a mkRat_self]
@[ simp ] theorem zero_divInt : โ (n : Int ), 0 /. n = 0 zero_divInt ( n ) : 0 /. n = 0 := by cases n <;> simp [ divInt ]
@[ simp ] theorem divInt_zero : โ (n : Int ), n /. 0 = 0 divInt_zero ( n ) : n /. 0 = 0 := mkRat_zero n
theorem neg_divInt_neg : โ (num den : Int ), - num /. - den = num /. den neg_divInt_neg ( num den ) : - num /. - den = num /. den := by
match den with
| Nat.succ n => simp [ divInt , Int.neg_ofNat_succ , normalize_eq_mkRat , Int.neg_neg : โ (a : Int ), - - a = a Int.neg_neg]
| 0 => rfl
| Int.negSucc n => simp [ divInt , Int.neg_negSucc , normalize_eq_mkRat , Int.neg_neg : โ (a : Int ), - - a = a Int.neg_neg]
theorem divInt_neg' : โ (num den : Int ), num /. - den = - num /. den divInt_neg' ( num den ) : num /. - den = - num /. den := by rw [ โ neg_divInt_neg : โ (num den : Int ), - num /. - den = num /. den neg_divInt_neg, Int.neg_neg : โ (a : Int ), - - a = a Int.neg_neg]
theorem divInt_eq_iff : โ {dโ dโ nโ nโ : Int }, dโ โ 0 โ dโ โ 0 โ (nโ /. dโ = nโ /. dโ โ nโ * dโ = nโ * dโ ) divInt_eq_iff ( zโ : dโ โ 0 : unknown metavariable '?_uniq.11736'
0) ( zโ : dโ โ 0 : unknown metavariable '?_uniq.11750'
0) :
nโ /. dโ = nโ /. dโ โ nโ * dโ = nโ * dโ := by
dโ, dโ, nโ, nโ : Int zโ : dโ โ 0 zโ : dโ โ 0 nโ /. dโ = nโ /. dโ โ nโ * dโ = nโ * dโ rcases Int.eq_nat_or_neg : โ (a : Int ), โ n , a = โn โจ a = - โn Int.eq_nat_or_neg dโ with โจ_, rfl | rflโฉ : โ n , dโ = โn โจ dโ = - โn โจ_ โจ_, rfl | rflโฉ : โ n , dโ = โn โจ dโ = - โn , rfl rfl | rfl : dโ = โwโ โจ dโ = - โwโ | rfl โจ_, rfl | rflโฉ : โ n , dโ = โn โจ dโ = - โn โฉdโ, nโ, nโ : Int zโ : dโ โ 0 wโ : Nat zโ : โwโ โ 0 intro.inl nโ /. โwโ = nโ /. dโ โ nโ * dโ = nโ * โwโ dโ, nโ, nโ : Int zโ : dโ โ 0 wโ : Nat zโ : - โwโ โ 0 intro.inr nโ /. - โwโ = nโ /. dโ โ nโ * dโ = nโ * - โwโ dโ, dโ, nโ, nโ : Int zโ : dโ โ 0 zโ : dโ โ 0 nโ /. dโ = nโ /. dโ โ nโ * dโ = nโ * dโ <;> dโ, nโ, nโ : Int zโ : dโ โ 0 wโ : Nat zโ : โwโ โ 0 intro.inl nโ /. โwโ = nโ /. dโ โ nโ * dโ = nโ * โwโ dโ, nโ, nโ : Int zโ : dโ โ 0 wโ : Nat zโ : - โwโ โ 0 intro.inr nโ /. - โwโ = nโ /. dโ โ nโ * dโ = nโ * - โwโ
dโ, dโ, nโ, nโ : Int zโ : dโ โ 0 zโ : dโ โ 0 nโ /. dโ = nโ /. dโ โ nโ * dโ = nโ * dโ rcases Int.eq_nat_or_neg : โ (a : Int ), โ n , a = โn โจ a = - โn Int.eq_nat_or_neg dโ with โจ_, rfl | rflโฉ : โ n , dโ = โn โจ dโ = - โn โจ_ โจ_, rfl | rflโฉ : โ n , dโ = โn โจ dโ = - โn , rfl rfl | rfl : dโ = โwโ โจ dโ = - โwโ | rfl โจ_, rfl | rflโฉ : โ n , dโ = โn โจ dโ = - โn โฉnโ, nโ : Int wโยน : Nat zโ : โwโยน โ 0 wโ : Nat zโ : โwโ โ 0 intro.inl.intro.inl nโ /. โwโยน = nโ /. โwโ โ nโ * โwโ = nโ * โwโยน nโ, nโ : Int wโยน : Nat zโ : โwโยน โ 0 wโ : Nat zโ : - โwโ โ 0 intro.inl.intro.inr nโ /. โwโยน = nโ /. - โwโ โ nโ * - โwโ = nโ * โwโยน dโ, dโ, nโ, nโ : Int zโ : dโ โ 0 zโ : dโ โ 0 nโ /. dโ = nโ /. dโ โ nโ * dโ = nโ * dโ <;> nโ, nโ : Int wโยน : Nat zโ : โwโยน โ 0 wโ : Nat zโ : โwโ โ 0 intro.inl.intro.inl nโ /. โwโยน = nโ /. โwโ โ nโ * โwโ = nโ * โwโยน nโ, nโ : Int wโยน : Nat zโ : โwโยน โ 0 wโ : Nat zโ : - โwโ โ 0 intro.inl.intro.inr nโ /. โwโยน = nโ /. - โwโ โ nโ * - โwโ = nโ * โwโยน nโ, nโ : Int wโยน : Nat zโ : - โwโยน โ 0 wโ : Nat zโ : โwโ โ 0 intro.inr.intro.inl nโ /. - โwโยน = nโ /. โwโ โ nโ * โwโ = nโ * - โwโยน nโ, nโ : Int wโยน : Nat zโ : - โwโยน โ 0 wโ : Nat zโ : - โwโ โ 0 intro.inr.intro.inr nโ /. - โwโยน = nโ /. - โwโ โ nโ * - โwโ = nโ * - โwโยน
dโ, dโ, nโ, nโ : Int zโ : dโ โ 0 zโ : dโ โ 0 nโ /. dโ = nโ /. dโ โ nโ * dโ = nโ * dโ simp_all [ divInt_neg' : โ (num den : Int ), num /. - den = - num /. den divInt_neg', Int.ofNat_eq_zero : โ {n : Nat }, โn = 0 โ n = 0 Int.ofNat_eq_zero, Int.neg_eq_zero : โ {a : Int }, - a = 0 โ a = 0 Int.neg_eq_zero,
mkRat_eq_iff : โ {dโ dโ : Nat } {nโ nโ : Int }, dโ โ 0 โ dโ โ 0 โ (mkRat nโ dโ = mkRat nโ dโ โ nโ * โdโ = nโ * โdโ ) mkRat_eq_iff, Int.neg_mul : โ (a b : Int ), - a * b = - (a * b ) Int.neg_mul, Int.mul_neg : โ (a b : Int ), a * - b = - (a * b ) Int.mul_neg, Int.eq_neg_comm : โ {a b : Int }, a = - b โ b = - a Int.eq_neg_comm, eq_comm : โ {ฮฑ : Sort ?u.14102} {a b : ฮฑ }, a = b โ b = a eq_comm]
theorem divInt_mul_left : โ {n d a : Int }, a โ 0 โ a * n /. (a * d ) = n /. d divInt_mul_left { a : Int } ( a0 : a โ 0 ) : ( a * n ) /. ( a * d ) = n /. d :=