anchor.diff:  // TODO: 3D: cache empty sets and dicts.
   // TODO: 3D: remove any incidental allocation.
   // TODO: 3D: make sure to use proper collection comparer for string keys.
  +// TODO: 3D: make sure to use TryAdd in the appropriate places.
   
   type [<StructuralEquality; NoComparison>] Term =
       | Z of int
       | R of single
  +    | C of IComparable
  +    | Obj of obj
       | Tag
       | Label of string
  +    | Labels of string HashSet
       | Entity of uint64
       | Terms of Term list
       static member equals (this : Term) (that : Term) = this.Equals that
  
positive.code: 
  type [<StructuralEquality; NoComparison>] Subquery =
      | Is
      | Eq of Term
      | Gt of Term
      | Ge of Term
  
negative.code: 
      static member private equalTo term term2 =
          match (term, term2) with
          | (Z z, Z z2) -> z = z2
          | (R r, R r2) -> r = r2
          | (C c, C c2) -> c = c2
          | (Obj o, Obj o2) -> objEq o o2
          | (Label label, Label label2) -> strEq label label2
          | (Labels labels, Labels labels2) -> labels.SetEquals labels2
          | (Entity entityId, Entity entityId2) -> entityId = entityId2
          | (Terms terms, Terms terms2) ->
              if terms.Length = terms2.Length
  