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