Two physical quantities are compatible if their physical-dimensions are equal. Compatibility constrains how quantities can be compared and combined with algebraic operators.
(<=> (Compatible-Quantities ?X ?Y)
(And (Physical-Quantity ?X)
(Physical-Quantity ?Y)
(= (Quantity.Dimension ?X) (Quantity.Dimension ?Y))))
(=> (Compatible-Quantities $X $Y) (Physical-Quantity $Y))
(=> (Compatible-Quantities $X $Y) (Physical-Quantity $X))
(<=> (Compatible-Quantities ?X ?Y)
(And (Physical-Quantity ?X)
(Physical-Quantity ?Y)
(= (Quantity.Dimension ?X) (Quantity.Dimension ?Y))))
(=> (= (Magnitude ?Q ?Unit) ?Mag) (Compatible-Quantities ?Q ?Unit))
(=> (And (Physical-Quantity ?X) (Physical-Quantity ?Y) (+ ?X ?Y ?Z))
(And (Physical-Quantity ?Z)
(Compatible-Quantities ?X ?Y)
(Compatible-Quantities ?X ?Z)))
(Forall (@Args)
(<=> (And (Holds ?R @Args)
(=> (Item ?Q (Listof @Args))
(Constant-Quantity ?Q)))
(Forall (?Unit ?Q)
(=> (And (Unit-Of-Measure ?Unit)
(=> (Item ?Q (Listof @Args))
(Compatible-Quantities ?Q ?Unit)))
(Member (Map (Lambda (?Q)
(Magnitude ?Q ?Unit))
(Listof @Args))
?R)))))
(<=> (Relation-Extended-To-Quantities ?R)
(And (Relation ?R)
(Forall (@Args)
(<=> (And (Holds ?R @Args)
(=> (Item ?Q (Listof @Args))
(Constant-Quantity ?Q)))
(Forall (?Unit ?Q)
(=> (And (Unit-Of-Measure ?Unit)
(=> (Item ?Q (Listof @Args))
(Compatible-Quantities
?Q
?Unit)))
(Member (Map (Lambda
(?Q)
(Magnitude ?Q
?Unit))
(Listof @Args))
?R)))))))
(Forall (?Other-Unit)
(=> (And (Unit-Of-Measure ?Other-Unit)
(Compatible-Quantities ?U ?Other-Unit))
(And (Real-Number (Magnitude ?U ?Other-Unit))
(Positive (Magnitude ?U ?Other-Unit)))))
(<=> (Unit-Of-Measure ?U)
(And (Constant-Quantity ?U)
(Forall (?Other-Unit)
(=> (And (Unit-Of-Measure ?Other-Unit)
(Compatible-Quantities ?U ?Other-Unit))
(And (Real-Number (Magnitude ?U ?Other-Unit))
(Positive (Magnitude ?U ?Other-Unit)))))))
(* 20 meters)