Fixpoint combine_r (m : PTree.t L.t) {struct m} : changed :=
match m with
| PTree.Leaf =>
Unchanged
| PTree.Node l o r =>
let o' := f None o in
match combine_r l, combine_r r with
| Unchanged, Unchanged => if opt_beq o' o then Unchanged else Changed (PTree.Node' l o' r)
| Unchanged, Changed r' => Changed (PTree.Node' l o' r')
| Changed l', Unchanged => Changed (PTree.Node' l' o' r)
| Changed l', Changed r' => Changed (PTree.Node' l' o' r')
end
end.

(* Specifications: *)
Lemma combine_r_eq:
forall m,
tree_eq (match combine_r m with Unchanged => m | Changed m' => m' end)
(PTree.xcombine_r f m).
Lemma combine_r_eq:
forall m,
tree_eq (match combine_r m with Unchanged => m | Changed m' => m' end)
(PTree.xcombine_r f m).