We propose Pushdown Normal Form (PDNF) Bisimulation to verify contextual
equivalence in higher-order functional programming languages with local state.
Similar to previous work on Normal Form (NF) bisimulation, PDNF Bisimulation is
sound and complete with respect to contextual equivalence. However, unlike
traditional NF Bisimulation, PDNF Bisimulation is also decidable for a class of
program terms that reach bounded configurations but can potentially have
unbounded call stacks and input an unbounded number of unknown functions from
their context. Our approach relies on the principle that, in model-checking for
reachability, pushdown systems can be simulated by finite-state automata
designed to accept their initial/final stack content. We embody this in a
stackless Labelled Transition System (LTS), together with an on-the-fly
saturation procedure for call stacks, upon which bisimulation is defined. To
enhance the effectiveness of our bisimulation, we develop up-to techniques and
confirm their soundness for PDNF Bisimulation. We develop a prototype
implementation of our technique which is able to verify equivalence in examples
from practice and the literature that were out of reach for previous work