let rec merge r1 r2 =
  match r1 , r2 with
    | Full , _ | _ , Full -> Full
    | Empty , r | r , Empty -> r
    | Field _ , Index _ | Index _ , Field _ -> 
        failwith "merge field and index during havoc"
    | Field fs1 , Field fs2 -> Field (merge_fields fs1 fs2)
    | Index (ts1,ks1) , Index (ts2,ks2) ->
        let ts = merge_signature ts1 ts2 in
        Index( ts , ks1 @ ks2 ) (* Extension is natural *)
  
and merge_fields fs1 fs2 =
  match fs1 , fs2 with
    | [] , fs | fs , [] -> fs
    | ((f1,r1) as h1)::ftail1 , ((f2,r2) as h2)::ftail2 ->
        let cmp = compare_field f1 f2 in
        if cmp < 0 then h1 :: merge_fields ftail1 fs2 else
          if cmp > 0 then h2 :: merge_fields fs1 ftail2 else
            (f1 , merge r1 r2) :: merge_fields ftail1 ftail2