let rec pp_fold_op nil op pp fmt = function
  | [] -> Format.pp_print_string fmt nil
  | [x] -> pp fmt x
  | [x;y] -> Format.fprintf fmt "%a@ %s@ %a" pp x op pp y ; 
  | x::xs -> Format.fprintf fmt "%a@ %s@ (%a)" pp x op (pp_fold_op nil op pp) xs