anchor.diff:      | Filter of obj * SimMapTree
       | MapM of obj * SimMapTree
       | ChooseM of obj * SimMapTree
  +    | UnionWith of obj * SimMapTree * SimMapTree
  +    | Choose2 of obj * SimMapTree * SimMapTree
   
   and simmap<'k, 'v> =
       inherit IDependent
  
positive.code:                         | Filter(f,o) -> sprintf "%s |> filter f" (toString o)
                          | MapM(f,o) -> sprintf "%s |> mapM f" (toString o)
                          | ChooseM(f,o) -> sprintf "%s |> chooseM f" (toString o)
              
                  toString x.expression
              member x.Expression = x.expression
              member x.Inputs = x.inputs()
  
negative.code:                 HMap.choose (fun k v -> f.Invoke(k,v).Value) m.Content
          }
  
      let unionWith (f : 'k -> 'a -> 'a -> 'a) (l : simmap<'k, 'a>) (r : simmap<'k, 'a>) =
          simmap { 
              expression = UnionWith(f, l.Expression, r.Expression)
              amap = AMap.unionWith f l.AMap r.AMap
              inputs = fun () -> HSet.union l.Inputs r.Inputs
              content = fun () -> HMap.unionWith f l.Content r.Content 
          }
      let choose2 (f : 'k -> Option<'a> -> Option<'a> -> Option<'a>) (l : simmap<'k, 'a>) (r : simmap<'k, 'a>) =
          simmap { 
              expression = UnionWith(f, l.Expression, r.Expression)
              amap = AMap.choose2 f l.AMap r.AMap
              inputs = fun () -> HSet.union l.Inputs r.Inputs
              content = fun () -> HMap.choose2 f l.Content r.Content 
          }
  
      let private equal (l : hmap<'k, 'v>) (r : hmap<'k, 'v>) =
          let mutable l = l
  