let rec tau = function
  | App(Arith(Num(q)), []) -> Dom.of_q q
  | App(Arith(Multq(q)), [x]) -> Dom.union (Dom.of_q q) (tau x)
  | App(Arith(Add), xl) -> 
      if List.for_all (fun x -> Dom.eq (tau x) Dom.Int) xl then Dom.Int else Dom.Real
  | a -> if is_intvar a then Dom.Int else Dom.Real