  Prolog's ability to return multiple answers on backtracking provides an
elegant mechanism to derive reversible encodings of combinatorial objects as
Natural Numbers i.e. {\em ranking} and {\em unranking} functions. Starting from
a generalization of Ackerman's encoding of Hereditarily Finite Sets with
Urelements and a novel tupling/untupling operation, we derive encodings for
Finite Functions and use them as building blocks for an executable theory of
{\em Hereditarily Finite Functions}. The more difficult problem of {\em
ranking} and {\em unranking} {\em Hereditarily Finite Permutations} is then
tackled using Lehmer codes and factoradics.
  The paper is organized as a self-contained literate Prolog program available
at \url{http://logic.csci.unt.edu/tarau/research/2008/pHFF.zip}
