0 | module Algebra.Semiring
3 | import Syntax.PreorderReasoning
24 | interface Num a => Semiring a where
26 | 0 plusAssociative : {k,m,n : a} -> k + (m + n) === (k + m) + n
29 | 0 plusCommutative : {m,n : a} -> m + n === n + m
32 | 0 plusZeroLeftNeutral : {n : a} -> 0 + n === n
35 | 0 multAssociative : {k,m,n : a} -> k * (m * n) === (k * m) * n
38 | 0 multCommutative : {m,n : a} -> m * n === n * m
41 | 0 multOneLeftNeutral : {n : a} -> 1 * n === n
44 | 0 leftDistributive : {k,m,n : a} -> k * (m + n) === (k * m) + (k * n)
47 | 0 multZeroLeftAbsorbs : {n : a} -> 0 * n === 0
55 | 0 plusZeroRightNeutral : Semiring a => {n : a} -> n + 0 === n
56 | plusZeroRightNeutral =
59 | ~~ 0 + n ... plusCommutative
60 | ~~ n ... plusZeroLeftNeutral
68 | 0 multOneRightNeutral : Semiring a => {n : a} -> n * 1 === n
69 | multOneRightNeutral =
72 | ~~ 1 * n ... multCommutative
73 | ~~ n ... multOneLeftNeutral
77 | 0 multZeroRightAbsorbs : Semiring a => {n : a} -> n * 0 === 0
78 | multZeroRightAbsorbs =
81 | ~~ 0 * n ... multCommutative
82 | ~~ 0 ... multZeroLeftAbsorbs
87 | {auto _ : Semiring a}
89 | -> Either (m === 0) (n === 0)
91 | multZeroAbsorbs m n (Left rfl) =
94 | ~~ 0 * n ... cong (*n) rfl
95 | ~~ 0 ... multZeroLeftAbsorbs
97 | multZeroAbsorbs m n (Right rfl) =
100 | ~~ m * 0 ... cong (m*) rfl
101 | ~~ 0 ... multZeroRightAbsorbs
105 | 0 rightDistributive :
106 | {auto _ : Semiring a}
108 | -> (m + n) * k === m * k + n * k
109 | rightDistributive =
112 | ~~ k * (m + n) ... multCommutative
113 | ~~ (k * m) + (k * n) ... leftDistributive
114 | ~~ m * k + k * n ... cong (+ k * n) multCommutative
115 | ~~ m * k + n * k ... cong (m * k +) multCommutative
123 | plusAssociative = Nat.plusAssociative _ _ _
124 | plusCommutative = Nat.plusCommutative _ _
125 | plusZeroLeftNeutral = Nat.plusZeroLeftNeutral _
126 | multAssociative = Nat.multAssociative _ _ _
127 | multCommutative = Nat.multCommutative _ _
128 | multOneLeftNeutral = Nat.multOneLeftNeutral _
129 | leftDistributive = multDistributesOverPlusRight _ _ _
130 | multZeroLeftAbsorbs = Refl