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