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 )
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