let length = @algebra.Monomial::symbol("length")
let area = length.pow(2)
let speed = length / @algebra.Monomial::symbol("time")test {
// "a * a" and "a^2" are two ways to write the same thing.
let lhs = normalize(Mul([Symbol("a"), Symbol("a")]))
let rhs = normalize(Pow(Symbol("a"), 2))
assert_eq(lhs, rhs)
}test {
let m = normalize(Mul([Scalar(2.0), Symbol("m"), Pow(Symbol("s"), -1)]))
assert_eq(m.coefficient(), 2.0)
debug_inspect(m.terms(), content="[(\"m\", 1), (\"s\", -1)]")
}test {
let m = normalize(Mul([Scalar(1000.0), Symbol("m")]))
assert_eq(m.coefficient(), 1000.0)
}test {
let a = normalize(Symbol("a"))
let b = normalize(Symbol("b"))
assert_eq(a.div(b), normalize(Mul([Symbol("a"), Pow(Symbol("b"), -1)])))
}test {
let i = normalize(Mul([Scalar(2.0), Symbol("m")])).inv()
assert_eq(i.coefficient(), 0.5)
debug_inspect(i.terms(), content="[(\"m\", -1)]")
}test {
assert_true(normalize(Scalar(5.0)).is_dimensionless())
assert_false(normalize(Symbol("m")).is_dimensionless())
}test {
let a = normalize(Symbol("a"))
assert_eq(a.mul(a), normalize(Pow(Symbol("a"), 2)))
}test {
assert_true(Monomial::one().is_dimensionless())
assert_eq(Monomial::one().coefficient(), 1.0)
}test {
let m = normalize(Pow(Symbol("a"), 2))
assert_eq(m.pow(3), normalize(Pow(Symbol("a"), 6)))
assert_eq(m.pow(0), Monomial::one())
}test {
let two_m = normalize(Mul([Scalar(2.0), Symbol("m")]))
let five_m = normalize(Mul([Scalar(5.0), Symbol("m")]))
assert_true(two_m.same_factors(five_m))
assert_false(two_m.same_factors(normalize(Pow(Symbol("m"), 2))))
}test {
let m = Monomial::scalar(2.5)
assert_eq(m.coefficient(), 2.5)
assert_true(m.is_dimensionless())
}test {
let m = Monomial::symbol("m")
assert_eq(m.coefficient(), 1.0)
debug_inspect(m.terms(), content="[(\"m\", 1)]")
}test {
// a * (a * a) normalizes to a^3
let nested = normalize(Mul([Symbol("a"), Mul([Symbol("a"), Symbol("a")])]))
assert_eq(nested, normalize(Pow(Symbol("a"), 3)))
}A runtime dimension-checked physical quantity and unit system for MoonBit.