let compatible item0 item1 =
    match item0,item1 with
      | FUNCTION(_,_,Some _) , FUNCTION(_,_,None-> false
      | PREDICATE(_,Some _) , PREDICATE(_,None-> false
      | FUNCTION(sig0,r0,_) , FUNCTION(sig1,r1,_) ->
          (compatible_signature sig0 sig1) &&
            (compare_tau r0 r1 = 0)
      | PREDICATE(sig0,_) , PREDICATE(sig1,_) ->
          (compatible_signature sig0 sig1)
      | TYPE n , TYPE n' -> n=n'
      | RECORD fs , RECORD fs' -> 
          (List.length fs = List.length fs') &&
            List.for_all2 (fun f f' -> compare_field f f'=0) fs fs'
      | AXIOM _ , AXIOM _ -> true
      | _ -> false