  Domain-specific languages (DSLs) are routinely created to simplify difficult
or specialized programming tasks. They expose useful abstractions and design
patterns in the form of language constructs, provide static semantics to
eagerly detect misuse of these constructs, and dynamic semantics to completely
define how language constructs interact. However, implementing and composing
DSLs is a non-trivial task, and there is a lack of tools and techniques.
  We address this problem by presenting a complete module system over LP for
DSL construction, reuse, and composition. LP is already useful for DSL design,
because it supports executable language specifications using notations familiar
to language designers. We extend LP with a module system that is simple (with a
few concepts), succinct (for key DSL specification scenarios), and composable
(on the level of languages, compilers, and programs). These design choices
reflect our use of LP for industrial DSL design. Our module system has been
implemented in the FORMULA language, and was used to build key Windows 8 device
drivers via DSLs. Though we present our module system as it actually appears in
our FORMULA language, our emphasis is on concepts adaptable to other LP
languages.
