let lookup_bidir_remove (x : 'a) (ls : ('a * 'a) list) : 'a * ('a * 'a) list =
let rec lookup_bidir_remove_rec tas = function
| (y,z as p)::tail ->
if x=y then (z, merge tas tail)
else
if x=z then (y, merge tas tail)
else lookup_bidir_remove_rec (p::tas) tail
| [] -> raise Not_found
in
lookup_bidir_remove_rec [] ls