- About Scala
- In the Enterprise
- Scala Community
- Language Research
- In the Press
- The Scala Team
- Scala's Prehistory
- Contact Us
- Learning Scala
- Tour of Scala
- Scala API
- Setup & Getting Started
- Programming Guides
- Other Guides
- Code Examples
- Scala Developers
Styla: a lightweight open source Prolog-in-Scala
Styla is a fairly complete Prolog interpreter written in Scala,
derived from Kernel Prolog (see Fluents: A Refactoring of Prolog for
Uniform Reflection and Interoperation with External Objects in
The open sourced (Apache license) code is hosted at:
and it is designed with simplicity and extensibility in mind - hoping
it would be useful to people experimenting with new Prolog extensions
or use it as logic programming component is Scala applications.
Among the features not found in most Prologs, first class Logic
Engines - and a generic view of everything as Fluents (TermSinks and
TermSources) that abstract away iteration over various data types
and computations, including answers produced by Logic Engines.
Styla is not a DSL - it uses a compact combinator parser to cover
a fairly extensive subset of Prolog's original syntax.
Here are some limitations, most things not on this list and expected
from a Prolog system should work.
- toplevel goals that a not conjunctions should be parenthesized
- operators are all fixed and xfx, but they match the default
most Prologs' operators - see examples in progs/
- no gui or networking - Scala can do all that better
Take a look at prolog.Main for the start-up sequence - that gives a
glimpse of how to embed it into a Scala or Java program.
To add a new built-in, just clone the closest match in
and drop it in the same directory - the runtime system will instantly
Use the script "compile" to recompile the system with scalac "run" to
run it with scala and jrun to run it with java (possibly edit for path
info in this case).
The file prolog/fluents/Lib.scala embeds Prolog code that is present
at start-up. New Prolog code that you want part of the default
libraries can be added there.