-
-
Notifications
You must be signed in to change notification settings - Fork 48
Unit Equivalence
- Two Units (of the same quantity) are equivalent if by replacing one with the other we achieve equivalent numerical results with quantity calculus.
- Instances of
Unitmust hold an instance ofUnitConverter. -
UnitConvertersrepresent transformationsx -> f(x). -
UnitConvertersallow composition, such that composing 2UnitConvertersis equivalent to composing their transformation functions(a, b) -> a ○ b, or more verbose ...
givenf: x->f(x), g: x->g(x), thenf ○ g ≡ x->g(f(x)). - Two
UnitConvertersof same type can be equivalent but are not in general, e.g. they may not be equivalent because of different parameter values.
For in-depth material on 'Term Rewriting' and 'Normal-Form' we refer to Wikipedia
Given two unit-conversions (where each generally speaking is a sequence of transformation steps), it cannot always be decided, whether these are equivalent. We can only check whether two sequences of transformations can be reduced to the 'same' (equal) 'Normal-Form'.
Take for example Add(3) ○ Mul(2) ○ Add(-7) === Mul(2) ○ Add(-1), where the left sequence of transformations is mathematically speaking equivalent to the right sequence of transformations. But due to limitations of transformation composition algorithms, these two might have different 'Normal-Forms', such that a check for equality results in false, while it should be true.
We conclude that equivalence checks might be wrong if they result in false, but on the other hand they are guaranteed to be right, if they results in true.
| NormalFormOrder | Composition | POWER | RATIONAL | PI | MULTIPLY | ADD | LOG | EXP |
|---|---|---|---|---|---|---|---|---|
| 1 | POWER | If same base → POWER, Else → LBO | RATIONAL | NFO | NFO | COMP | COMP | COMP |
| 2 | RATIONAL | # | RATIONAL | NFO | NFO | COMP | COMP | COMP |
| 3 | PI | # | # | PI | NFO | COMP | COMP | COMP |
| 4 | MULTIPLY | # | # | # | MULTIPLY | COMP | COMP | COMP |
| 5 | ADD | # | # | # | # | ADD | COMP | COMP |
| 6 | LOG | # | # | # | # | # | COMP | ID |
| 7 | EXP | # | # | # | # | # | # | COMP |
# ... Omitted due to symmetry typeOf(a ○ b) ≡ typeOf(b ○ a)
ID ... IDENTITY x -> x
POWER ... PowerOfIntConverter x -> x * base^exponent
RATIONAL ... RationalConverter x -> x * dividend/divisor
PI ... PowerOfPiConverter x -> x * π^exponent
MULTIPLY ... MultiplyConverter x -> x * factor
ADD ... AddConverter x -> x + offset
LOG ... LogConverter x -> log(base, x), or if(base=Math.E) x -> ln(x)
EXP ... ExpConverter x -> base^x, or if(base=Math.E) x -> e^x
COMP ... composition (a, b) -> a ○ b
LBO ... composition with order (lower base first)
(a, b) -> sort(a, b).first ○ sort(a, b).last
NFO ... composition with order (lower normal-form-order first)
(a, b) -> sort(a, b).first ○ sort(a, b).last
Mul(r) ○ Add(s) ○ Mul(t) ≡ Mul(r * t) ○ Add(s * t)Add(r) ○ Mul(s) ○ Add(t) ≡ Mul(s) ○ Add(r * s + t)
Proof
Mul(r) ○ Add(s) ○ Mul(t) ≡ x -> ( (x * r) + s ) * t = x r t + s t ≡ Mul(r * t) ○ Add(s * t)Add(r) ○ Mul(s) ○ Add(t) ≡ x -> ( (x + r) * s ) + t = x s + r s + t ≡ Mul(s) ○ Add(r * s + t)
Given the composition lookup table above, we define for every pair of transformations how to derive the composition result.
Suppose Add(3) ○ Add(2) ≡ x -> (x + 3) + 2 = x + 5 which can be simplified to
Add(5), meaning that the original and the simplified composition are equivalent. We conclude that for the Add transformation we can always simplify Add(r) ○ Add(s) ≡ Add(r + s).
Suppose Mul(3) ○ Mul(2) ≡ x -> (x * 3) * 2 = x * (3 * 2) which can be simplified to
Mul(6), meaning that the original and the simplified composition are equivalent. We conclude that for the Mul transformation we can always simplify Mul(r) ○ Mul(s) ≡ Mul(r * s).
Suppose Add(3) ○ Mul(2) ○ Add(-7) ≡ x -> ( (x + 3) * 2 ) -7 = 2x - 1 which can be simplified to
Mul(2) ○ Add(-1), meaning that the original and the simplified composition are equivalent (see Simplification Rules above).
Suppose Power(10^3) ○ Rational(20/1) ≡ x -> (x * 10^3) * 20 which according to the lookup table results in Rational(20000/1), which can not be further simplified and hence is a normal-form.
Suppose we swap the order of the previous to Rational(20/1) ○ Power(10^3) ≡ x -> (x * 20) * 10^3 which according to the lookup table also results in Rational(20000/1), which can not be further simplified and hence is a normal-form.
Given the 2 previous examples we can now state the equivalence Power(10^3) ○ Rational(20/1) ≡ Rational(20/1) ○ Power(10^3) because both simplify (by using the lookup table) to the same normal-form.
Suppose a composition C0 ○ C1 ○ ... ○ X ○ Y ○ ... Cn. Given that X and Y represent a multiplication transformation, then X and Y might always be swapped within a sequence, provided X and Y are consecutive:
C0 ○ C1 ○ ... ○ X ○ Y ○ ... Cn ≡ C0 ○ C1 ○ ... ○ Y ○ X ○ ... Cn
The same applies to the addition transformation.
Given a sequence of transformations (eg. Add(3) ○ Mul(2) ○ Mul(-1) ○ Add(-7) ), where order matters, we form a permutation group of all permutations 'reachable' through 'allowed' swapping of transformations within this sequence.
Swapping is allowed for 2 consecutive transformations (a, b) that commute with each other (a o b === b o a).
We search this permutation group for any sequence of transformations, that allows simplification: For every pair of consecutive transformations within a sequence, check whether a simplification is possible, then apply simplification and start over until no more simplification is found.
Finally sort according to normal-form order.