anchor.diff:      prove
           ((parse_term @"!op f x s. x IN (support op f s) <=> x IN s /\ ~(f x = neutral op)"), 
            REWRITE_TAC [support; IN_ELIM_THM])
  +
   let SUPPORT_SUPPORT = 
       prove
           ((parse_term @"!op f s. support op f (support op f s) = support op f s"), 
            REWRITE_TAC [support; IN_ELIM_THM; EXTENSION]
            |> THEN <| REWRITE_TAC [CONJ_ACI])
  +
   let SUPPORT_EMPTY = 
       prove
           ((parse_term @"!op f s. (!x. x IN s ==> (f(x) = neutral op)) <=> (support op f s = {})"), 
            REWRITE_TAC [IN_SUPPORT; EXTENSION; IN_ELIM_THM; NOT_IN_EMPTY]
            |> THEN <| MESON_TAC [])
  +
   let SUPPORT_SUBSET = 
       prove
           ((parse_term @"!op f s. (support op f s) SUBSET s"), 
            SIMP_TAC [SUBSET; IN_SUPPORT])
  +
   let FINITE_SUPPORT = 
       prove
           ((parse_term @"!op f s. FINITE s ==> FINITE(support op f s)"), 
  
positive.code:         |> THEN <| MATCH_MP_TAC NSUM_SUPERSET
          |> THEN <| ASM_MESON_TAC [IN_UNION; IN_DIFF; SUBSET])
  
  let NSUM_UNION_LZERO = prove((parse_term @"!f:A->num u v.
          FINITE v /\ (!x. x IN u /\ ~(x IN v) ==> (f(x) = 0))
          ==> (nsum (u UNION v) f = nsum v f)"), MESON_TAC [NSUM_UNION_RZERO; UNION_COMM])
  
  
negative.code: (* ------------------------------------------------------------------------- *)
  (* Generic iteration of operation over set with finite support.              *)
  (* ------------------------------------------------------------------------- *)
  
  let neutral = 
      new_definition
          (parse_term @"neutral op = @x. !y. (op x y = y) /\ (op y x = y)")
  