anchor.diff:          match (term, term2) with
           | (Tag tag, Tag tag2) -> strEq tag tag2
           | (Entity entityId, Entity entityId2) -> entityId = entityId2
  -        | (Groupoid comparable, Groupoid comparable2) ->
  +        | (Number comparable, Number comparable2) ->
               match (comparable, comparable2) with
  -            | (Num i, Num i2) -> i = i2
  -            | (Real i, Real i2) -> i = i2
  +            | (Z i, Z i2) -> i = i2
  +            | (R i, R i2) -> i = i2
               | _ -> false
           | (Terms terms, Terms terms2) ->
               if terms.Length = terms2.Length
  
positive.code: 
  type [<StructuralEquality; NoComparison>] Subquery =
      | Eq of Term
      | Gt of Groupoid
      | Ge of Groupoid
      | Lt of Groupoid
      | Le of Groupoid
      | Not of Subquery
      | And of Subquery list
      | Or of Subquery list
  
negative.code: // TODO: 3D: remove any incidental allocation.
  // TODO: 3D: make sure to use proper collection comparer for string keys.
  
  type [<StructuralEquality; NoComparison>] Number =
      | Z of int
      | R of single
  
  type [<StructuralEquality; NoComparison>] Term =
      | Tag of string
      | Entity of uint64
      | Number of Number
      | Terms of Term list
      static member equals (this : Term) (that : Term) = this.Equals that
      static member equalsMany (lefts : Dictionary<string, Term>) (rights : Dictionary<string, Term>) =
  