Inductive changed: Type := Unchanged | Changed (m: PTree.t L.t).Inductive changed: Type := Unchanged | Changed (m: PTree.t L.t).Inductive changed: Type := Unchanged | Changed (m: PTree.t L.t).Fixpoint combine_l (m : PTree.t L.t) {struct m} : changed :=
  match m with
  | PTree.Leaf =>
      Unchanged
  | PTree.Node l o r =>
      let o' := f o None in
      match combine_l l, combine_l 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_l_eq: forall m, tree_eq (match combine_l m with Unchanged => m | Changed m' => m' end) (PTree.xcombine_l f m).
Lemma combine_l_eq: forall m, tree_eq (match combine_l m with Unchanged => m | Changed m' => m' end) (PTree.xcombine_l f m).