let lambda f =
  fun ~var_count ->
    let var_name = sprintf "Var_%d" var_count in
    (*
       Here is the hack that makes nodes containing variables “semi-unique.”

       [var_repr_fake] is a first version of the variable representation,
       that we feed to the the function [f] a first time.
       This resulting tree is used to create the real variable representation,
       the first argument [applied_once] will be hashed to create a
       unique-for-this-subtree identifier.

       Finally get the normal [applied] subtree and feed it to [Tree.lambda].
    *)

    let var_repr_fake = fun ~var_count -> Tree.string var_name in
    let applied_once = f var_repr_fake ~var_count:(var_count + 1) in
    let var_repr = fun ~var_count -> Tree.variable applied_once var_name in
    let applied = f var_repr ~var_count:(var_count + 1) in
    Tree.lambda var_name applied