Relating nominal and higher-order abstract syntax specifications
A. Gacek
Proceedings of the 2010 Symposium on Principles and Practice of Declarative Programming (PPDP), ACM, July 2010, pp. 177-186
Nominal abstract syntax and higher-order abstract syntax provide a
means for describing binding structure which is higher-level than
traditional techniques. These approaches have spawned two different
communities which have developed along similar lines but with subtle
differences that make them difficult to relate. The nominal abstract
syntax community has devices like names, freshness, name-abstractions
with variable capture, and the new-quantifier, whereas the
higher-order abstract syntax community has devices like
lambda-binders, lambda-conversion, raising, and the nabla-quantifier.
This paper aims to unify these communities and provide a concrete
correspondence between their different devices. In particular, we
develop a semantics-preserving translation from alpha-Prolog, a
nominal abstract syntax based logic programming language, to G-, a
higher-order abstract syntax based logic programming language. We also
discuss higher-order judgments, a common and powerful tool for
specifications with higher-order abstract syntax, and we show how
these can be incorporated into G-. This establishes G- as a language
with the power of higher-order abstract syntax, the fine-grained
variable control of nominal specifications, and the desirable
properties of higher-order judgments.