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