Fixpoint replacel (be : bool_expr) (lx ly : list ad) {struct ly} :
bool_expr :=
match lx, ly with
| nil, _ => be
| _ :: _, nil => (* error *)  be
| x :: lx', y :: ly' => replace x y (replacel be lx' ly')
end.
Fixpoint bool_fun_replacel (bf : bool_fun) (lx ly : list ad) {struct ly} :
bool_fun :=
match lx, ly with
| nil, _ => bf
| _ :: _, nil => (* error *)  bf
| x :: lx', y :: ly' => bool_fun_replace x y (bool_fun_replacel bf lx' ly')
end.

Lemma replacel_OK :
forall (lx ly : list ad) (be : bool_expr),
bool_fun_eq (bool_fun_of_bool_expr (replacel be lx ly))
(bool_fun_replacel (bool_fun_of_bool_expr be) lx ly).