let rec tau_of_logic_type = function
    | Ctype c -> tau_of_object (object_of c)
    | Linteger ->  Formula.Integer
    | Lreal ->  Formula.Real
    | Ltype( d , [] ) when d.lt_name = Utf8_logic.boolean ->  Formula.Boolean
    | Ltype( {lt_name="set"} , [t] ) -> Formula.Set (tau_of_logic_type t)
    | Ltype( lt , ts) ->
        let d = !name_of_adt lt in
        Formula.ADT (d,List.map tau_of_logic_type ts)
    | Lvar _ -> Wp_parameters.not_yet_implemented "logic type variables"
    | Larrow _ -> Wp_parameters.not_yet_implemented "type of logic function"