let rec add_integer  ka ga kb gb =
    match ga,gb with
      | Set _ , _ | _ , Set _ -> Set (F.add_set (set_of ga) (set_of gb))
      | (Value _ | Data _), (Value _ | Data _) ->
          data_of_integer (plus (integer_of_data ka ga) (integer_of_data kb gb))
      | Interval r1 , Interval r2 ->plus_interval_interval r1 r2
      | (Value _ | Data _ ),Interval r ->
          Interval (plus_interval r (integer_of_data ka ga))
      | Interval r,(Value _ | Data _ ) ->
          Interval (plus_interval r (integer_of_data kb gb))
      | List _ , List _ -> Set (F.add_set (set_of ga) (set_of gb))
      | List ds , b ->  union_map (add_integer kb b ka) ds
      | b , List ds -> union_map (add_integer ka b kb) ds
      | _ -> WpLog.fatal "unsuitable arguments for integer addition"