Rat.frac
import Natural (+, *, plusZeroId, zeroPlusId, plusComm, plusAssoc, swapLeft, multZeroId, zeroMult, sucMult, multComm, multDistrib)
import Int (Int, intZero, intOne, intNeg)
import Int.add (+, intAddComm)
import Core.equality (trans, cong)
NZ : π
NZ = β β β
nzPos : β β NZ using (Rat.frac.NZ.unfold)
nzPos = Ξ»n. injβ n
nzNeg : β β NZ using (Rat.frac.NZ.unfold)
nzNeg = Ξ»n. injβ n
nzOne : NZ using (Rat.frac.NZ.unfold)
nzOne = nzPos Z
nzToInt : NZ β Int using (Int.Int.unfold, Rat.frac.NZ.unfold)
nzToInt = Ξ»d. β-elim (n. class (S n, Z)) (n. class (Z, S n)) d
nzMul : NZ β NZ β NZ using (Rat.frac.NZ.unfold)
nzMul =
Ξ»x y. β-elim
m. β-elim (k. nzPos (m * k + m + k)) (k. nzNeg (m * k + m + k)) y
m. β-elim (k. nzNeg (m * k + m + k)) (k. nzPos (m * k + m + k)) y
x
nzMulOneL : {y : NZ} β nzMul nzOne y β‘ y
using (nzMul.eq,
nzNeg.eq,
nzOne.eq,
nzPos.eq,
plusZeroId.rw,
Rat.frac.NZ.unfold,
zeroMult,
zeroMult.rw,
zeroPlusId,
zeroPlusId.rw)
nzMulOneL = Ξ»y. β-elim (k. β) (k. β) y
nzMulOneR : {x : NZ} β nzMul x nzOne β‘ x
using (multZeroId.rw,
nzMul.eq,
nzNeg.eq,
nzOne.eq,
nzPos.eq,
plusZeroId.rw,
Rat.frac.NZ.unfold,
zeroPlusId,
zeroPlusId.rw)
nzMulOneR = Ξ»x. β-elim (m. β) (m. β) x
distribBack : (n m k : β) β n * m + n * k β‘ n * (m + k) using (multDistrib)
distribBack = Ξ»n m k. β
sucMultBack : (n m : β) β m + n * m β‘ S n * m using (sucMult)
sucMultBack = Ξ»n m. β
oneMult : (m : β) β S Z * m β‘ m using (multComm)
oneMult = Ξ»m. S Z * m β‘β¨ sucMult Z m β© m + Z * m β‘β¨ zeroMult m β© m + Z β‘β¨ plusZeroId m β© m
intAddZeroL : (z : Int) β intZero + z β‘ z
using (hyp.rw,
Int.Int.eq,
Int.Int.unfold,
Int.intZero.eq,
Int.add.+.eq,
plusComm,
plusComm.rw,
zeroPlusId,
zeroPlusId.rw)
intAddZeroL = Ξ»z. quot-elim (p. β) z
intAddZeroR : (z : Int) β z + intZero β‘ z
using (hyp.rw,
Int.Int.eq,
Int.Int.unfold,
Int.intZero.eq,
Int.add.+.eq,
plusComm,
plusComm.rw,
plusZeroId,
plusZeroId.rw,
zeroPlusId,
zeroPlusId.rw)
intAddZeroR = Ξ»z. quot-elim (p. β) z
intScaleN : β β Int β Int using (distribBack, distribBack.rw, hyp.rw, Int.Int.unfold)
intScaleN = Ξ»n z. quot-elim (p. class (n * p .Οβ, n * p .Οβ)) z
intScaleNZero : (n : β) β intScaleN n intZero β‘ intZero
using (Int.Int.unfold, Int.intZero.eq, Rat.frac.intScaleN.eq)
intScaleNZero = Ξ»n. β
intScaleNOne : (z : Int) β intScaleN (S Z) z β‘ z
using (hyp.rw,
intScaleN.eq,
Int.Int.eq,
Int.Int.unfold,
oneMult,
oneMult.rw,
plusComm,
plusComm.rw)
intScaleNOne = Ξ»z. quot-elim (p. β) z
intScaleNSuc : (n : β) (z : Int) β intScaleN (S n) z β‘ z + intScaleN n z
using (hyp.rw,
intScaleN.eq,
Int.Int.eq,
Int.Int.unfold,
Int.add.+.eq,
sucMultBack,
sucMultBack.rw)
intScaleNSuc = Ξ»n z. quot-elim (p. β) z
intScale : NZ β Int β Int using (Int.Int.unfold, Rat.frac.NZ.unfold)
intScale = Ξ»d z. β-elim (n. intScaleN (S n) z) (n. intNeg (intScaleN (S n) z)) d
intScaleOne : {z : Int} β intScale nzOne z β‘ z
using (intScale.eq, intScaleNOne, Int.Int.unfold, nzOne.eq, nzPos.eq)
intScaleOne = Ξ»z. β
intScaleZero : (d : NZ) β intScale d intZero β‘ intZero
using (Int.Int.unfold,
Int.intNeg.eq,
Int.intZero.eq,
Rat.frac.NZ.unfold,
Rat.frac.intScale.eq,
Rat.frac.intScaleN.eq)
intScaleZero = Ξ»d. β-elim (n. β) (n. β) d
intAddScaleZeroL : {d : NZ} {y : Int} β intScale d intZero + y β‘ y
using (intAddZeroL,
Int.Int.eq,
Int.Int.unfold,
Int.intNeg.eq,
Int.intZero.eq,
Int.add.+.eq,
Natural.*.eq,
Natural.+.eq,
Rat.frac.NZ.unfold,
Rat.frac.intScale.eq,
Rat.frac.intScaleN.eq)
intAddScaleZeroL = Ξ»d y. β-elim (n. intAddZeroL y) (n. intAddZeroL y) d
intAddScaleZeroR : {d : NZ} {y : Int} β y + intScale d intZero β‘ y
using (intAddZeroR, Int.Int.unfold, Rat.frac.NZ.unfold, Rat.frac.intScaleZero)
intAddScaleZeroR = Ξ»d y. β-elim (n. intAddZeroR y) (n. intAddZeroR y) d
intScaleToInt : {d : NZ} β intScale d (class (S Z, Z)) β‘ nzToInt d
using (Int.Int.unfold,
Int.intNeg.eq,
Natural.*.eq,
Natural.+.eq,
Rat.frac.NZ.unfold,
Rat.frac.intScale.eq,
Rat.frac.intScaleN.eq,
Rat.frac.nzToInt.eq)
intScaleToInt = Ξ»d. β-elim (n. β) (n. β) d
Rat : π
Rat = Int Γ NZ
mkRat : Int β NZ β Rat using (Rat.frac.Rat.unfold)
mkRat = Ξ»n d. n, d
num : Rat β Int using (Int.Int.unfold, Rat.frac.Rat.unfold)
num = Ξ»q. q .Οβ
den : Rat β NZ using (Rat.frac.NZ.unfold, Rat.frac.Rat.unfold)
den = Ξ»q. q .Οβ
denInt : Rat β Int using (Int.Int.unfold, Rat.frac.Rat.unfold)
denInt = Ξ»q. nzToInt (q .Οβ)
ratOfInt : Int β Rat using (Rat.frac.Rat.unfold)
ratOfInt = Ξ»z. mkRat z nzOne
ratZero : Rat using (Rat.frac.Rat.unfold)
ratZero = ratOfInt intZero
ratOne : Rat using (Rat.frac.Rat.unfold)
ratOne = ratOfInt intOne
ratAdd : Rat β Rat β Rat using (Rat.frac.Rat.unfold)
ratAdd = Ξ»p q. mkRat (intScale (den q) (num p) + intScale (den p) (num q)) (nzMul (den p) (den q))
half : Rat using (Rat.frac.Rat.unfold)
half = mkRat intOne (nzPos (S Z))
ratAddTest : ratAdd half half β‘ mkRat (class (4, Z)) (nzPos 3)
using (Int.Int.unfold,
Int.intOne.eq,
Int.add.+.eq,
Natural.*.eq,
Natural.+.eq,
Rat.frac.Rat.unfold,
Rat.frac.den.eq,
Rat.frac.half.eq,
Rat.frac.intScale.eq,
Rat.frac.intScaleN.eq,
Rat.frac.mkRat.eq,
Rat.frac.num.eq,
Rat.frac.nzMul.eq,
Rat.frac.nzPos.eq,
Rat.frac.ratAdd.eq)
ratAddTest = β
third : Rat using (Rat.frac.Rat.unfold)
third = mkRat intOne (nzPos 2)
negThird : Rat using (Rat.frac.Rat.unfold)
negThird = mkRat intOne (nzNeg 2)
threeCancel : class (3, 3) β‘ intZero using (Int.Int.unfold, Int.intZero.eq)
threeCancel = β
ratAddTest2 : ratAdd third negThird β‘ mkRat intZero (nzNeg 8)
using (Int.Int.unfold,
Int.intNeg.eq,
Int.intOne.eq,
Int.add.+.eq,
Natural.*.eq,
Natural.+.eq,
Rat.frac.Rat.unfold,
Rat.frac.den.eq,
Rat.frac.intScale.eq,
Rat.frac.intScaleN.eq,
Rat.frac.mkRat.eq,
Rat.frac.negThird.eq,
Rat.frac.num.eq,
Rat.frac.nzMul.eq,
Rat.frac.nzNeg.eq,
Rat.frac.nzPos.eq,
Rat.frac.ratAdd.eq,
Rat.frac.third.eq,
threeCancel)
ratAddTest2 = trans _ _ _ β (cong (Ξ»u. Rat) (Ξ»x. mkRat x (nzNeg 8)) threeCancel)
ratAddZeroLNum : {q : Rat} β intScale (den q) intZero + intScale nzOne (num q) β‘ num q
using (intScaleNOne)
ratAddZeroLNum = Ξ»q. trans _ (intScale nzOne (num q)) _ intAddScaleZeroL intScaleOne
ratAddZeroRNum : {q : Rat} β intScale nzOne (num q) + intScale (den q) intZero β‘ num q
using (intScaleNOne)
ratAddZeroRNum = Ξ»q. trans _ (intScale nzOne (num q)) _ intAddScaleZeroR intScaleOne
ratEta : {q : Rat} β mkRat (num q) (den q) β‘ q
using (den.eq,
Int.Int.unfold,
mkRat.eq,
num.eq,
Rat.frac.NZ.unfold,
Rat.frac.Rat.unfold,
sigma.eta)
ratEta = Ξ»q. β
ratAddZeroL : {q : Rat} β ratAdd ratZero q β‘ q
using (Int.Int.unfold,
Int.intNeg.eq,
Int.intZero.eq,
Int.add.+.eq,
nzMulOneL,
ratEta,
Rat.frac.NZ.unfold,
Rat.frac.Rat.eq,
Rat.frac.Rat.unfold,
Rat.frac.den.eq,
Rat.frac.intScale.eq,
Rat.frac.intScaleN.eq,
Rat.frac.mkRat.eq,
Rat.frac.num.eq,
Rat.frac.nzMul.eq,
Rat.frac.nzNeg.eq,
Rat.frac.nzOne.eq,
Rat.frac.nzPos.eq,
Rat.frac.ratAdd.eq,
Rat.frac.ratOfInt.eq,
Rat.frac.ratZero.eq)
ratAddZeroL =
Ξ»q. trans
_
_
_
trans
ratAdd ratZero q
_
q .Οβ, q .Οβ
cong
Ξ»w. Rat
Ξ»x. mkRat x (nzMul nzOne (den q))
{intScale (den q) intZero + intScale nzOne (num q)}
{num q}
ratAddZeroLNum
cong (Ξ»w. Rat) (Ξ»d. mkRat (num q) d) {nzMul nzOne (den q)} {den q} nzMulOneL
ratEta
ratAddZeroR : {q : Rat} β ratAdd q ratZero β‘ q
using (Int.Int.unfold,
Int.intNeg.eq,
Int.intZero.eq,
Int.add.+.eq,
nzMulOneR,
ratEta,
Rat.frac.NZ.unfold,
Rat.frac.Rat.eq,
Rat.frac.Rat.unfold,
Rat.frac.den.eq,
Rat.frac.intScale.eq,
Rat.frac.intScaleN.eq,
Rat.frac.mkRat.eq,
Rat.frac.num.eq,
Rat.frac.nzMul.eq,
Rat.frac.nzNeg.eq,
Rat.frac.nzOne.eq,
Rat.frac.nzPos.eq,
Rat.frac.ratAdd.eq,
Rat.frac.ratOfInt.eq,
Rat.frac.ratZero.eq)
ratAddZeroR =
Ξ»q. trans
_
_
_
trans
ratAdd q ratZero
_
q .Οβ, q .Οβ
cong
Ξ»w. Rat
Ξ»x. mkRat x (nzMul (den q) nzOne)
{intScale nzOne (num q) + intScale (den q) intZero}
{num q}
ratAddZeroRNum
cong (Ξ»w. Rat) (Ξ»d. mkRat (num q) d) {nzMul (den q) nzOne} {den q} nzMulOneR
ratEta
plusSwapRight : {x m k : β} β x + m + k β‘ x + k + m
using (hyp.rw, plusAssoc, plusAssoc.rw, plusComm, plusComm.rw, swapLeft, swapLeft.rw)
plusSwapRight = Ξ»x m k. β
mulPlusComm : {m k : β} β m * k + m + k β‘ k * m + k + m using (plusAssoc)
mulPlusComm = Ξ»m k. trans _ _ _ (cong (Ξ»u. β) (Ξ»w. w + m + k) (multComm k m)) plusSwapRight
nzMulComm : {x y : NZ} β nzMul x y β‘ nzMul y x
using (plusAssoc, Rat.frac.NZ.unfold, Rat.frac.nzMul.eq, Rat.frac.nzNeg.eq, Rat.frac.nzPos.eq)
nzMulComm =
Ξ»x y. β-elim
m. β-elim
w. nzMul (nzPos m) w β‘ nzMul w (nzPos m)
k. cong (Ξ»u. NZ) nzPos {m * k + m + k} {k * m + k + m} mulPlusComm
k. cong (Ξ»u. NZ) nzNeg {m * k + m + k} {k * m + k + m} mulPlusComm
y
m. β-elim
w. nzMul (nzNeg m) w β‘ nzMul w (nzNeg m)
k. cong (Ξ»u. NZ) nzNeg {m * k + m + k} {k * m + k + m} mulPlusComm
k. cong (Ξ»u. NZ) nzPos {m * k + m + k} {k * m + k + m} mulPlusComm
y
x
ratAddComm : (p q : Rat) β ratAdd p q β‘ ratAdd q p
using (Int.Int.unfold,
Int.add.+.eq,
Rat.frac.NZ.unfold,
Rat.frac.Rat.unfold,
Rat.frac.den.eq,
Rat.frac.intScale.eq,
Rat.frac.mkRat.eq,
Rat.frac.num.eq,
Rat.frac.nzMul.eq,
Rat.frac.ratAdd.eq)
ratAddComm =
Ξ»p q. trans
_
mkRat (intScale (den p) (num q) + intScale (den q) (num p)) (nzMul (den p) (den q))
_
cong
Ξ»u. Rat
Ξ»x. mkRat x (nzMul (den p) (den q))
intAddComm (intScale (den q) (num p)) (intScale (den p) (num q))
cong
Ξ»u. Rat
Ξ»d. mkRat (intScale (den p) (num q) + intScale (den q) (num p)) d
{nzMul (den p) (den q)}
{nzMul (den q) (den p)}
nzMulComm
ratNeg : Rat β Rat using (Rat.frac.Rat.unfold)
ratNeg = Ξ»p. mkRat (intNeg (num p)) (den p)
ratNegHalf : ratNeg half β‘ mkRat (class (Z, S Z)) (nzPos (S Z))
using (Int.Int.unfold,
Int.intNeg.eq,
Int.intOne.eq,
Rat.frac.Rat.unfold,
Rat.frac.den.eq,
Rat.frac.half.eq,
Rat.frac.mkRat.eq,
Rat.frac.num.eq,
Rat.frac.nzPos.eq,
Rat.frac.ratNeg.eq)
ratNegHalf = β