let rec add_integer ka ga kb gb =
match ga,gb with
| Set _ , _ | _ , Set _ -> Set (D.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 (D.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"