let product f t1 t2 = List.fold_right (fun x acc -> List.fold_right (fun y acc -> f x y :: acc) t2 acc) t1 []