let rec compare_tau t1 t2 =
  match t1 , t2 with

    | Integer , Integer -> 0
    | Integer , _ -> (-1)
    | _ , Integer -> 1

    | Real , Real -> 0
    | Real , _ -> (-1)
    | _ , Real -> 1

    | Boolean , Boolean -> 0
    | Boolean , _ -> (-1)
    | _ , Boolean -> 1

    | Pointer , Pointer -> 0
    | Pointer , _ -> (-1)
    | _ , Pointer -> 1

    | ALPHA k , ALPHA k' -> Pervasives.compare k k'
    | ALPHA _ , _ -> (-1)
    | _ , ALPHA _ -> 1

    | Set ta , Set tb -> compare_tau ta tb
    | Set _ , _ -> (-1)
    | _ , Set _ -> 1

    | Array(ta,tb) , Array(ta',tb') -> compare_sig [ta;tb] [ta';tb']
    | Array _ , _ -> (-1)
    | _ , Array _ -> 1

    | Record ra , Record rb -> LogicId.compare ra rb
    | Record _ , _ -> (-1)
    | _ , Record _ -> 1

    | ADT(a,ps) , ADT(b,qs) ->
        let cid = LogicId.compare a b in
        if cid<>0 then cid else compare_sig ps qs

and compare_sig ps qs =
  match ps , qs with
    | [] , [] -> 0
    | [] , _ -> (-1)
    | _ , [] -> 1
    | t1::ps , t2::qs ->
        let ct = compare_tau t1 t2 in
        if ct<>0 then ct else compare_sig ps qs