A tiny implementation of a small subset of the Prolog language, in OCaml. With small and fun examples.
WARNING: this project only has an educational purpose, for a real-world use of Prolog, please refer to GNU Prolog (gprolog).
This project contains the code and examples for a tiny Prolog implementation, written in the OCaml language.
- See this folder for instructions to build the project (really easy: clone, run
make
, relax and enjoy 🎉). The implementation focuses on a very small subset of Prolog, see the examples for a good idea of what is supported. - See this other folder for examples (in English).
- A theory has this form, first with axioms (predicate):
cat(tom).
mouse(jerry).
- Then maybe some rules, stating that a mouse is fast and a cat can be stupid:
fast(X) <-- mouse(X).
stupid(X) <-- cat(X).
- If you save this file (see this example), you can then load it with the
prolog
binary:
$ ./prolog/prolog ./examples/tomandjerry.pl
?- stupid(tom).
{ }
continue ? (o/n) [o] :
- This
{ }
is an empty model, meaning thatstupid(tom).
evaluates to True in an empty model (no need for instanciation). - You can also ask your question directly in the command line:
$ ./prolog/prolog ./examples/tomandjerry.pl "fast(tom)."
?- fast(tom).
-
An empty response mean that the term is false, no matter the model.
-
You can add more rules, as you want.
ishuntedby(X, Y) <-- mouse(X), cat(Y).
$ ./prolog/prolog ./examples/tomandjerry.pl "ishuntedby(tom, jerry)."
?- ishuntedby(tom, jerry).
$ ./prolog/prolog ./examples/tomandjerry.pl "ishuntedby(jerry, tom)."
?- ishuntedby(jerry, tom).
{ }
- You can also add comments, that are lines starting with one or more
#
character.
# the mouse always espace the cat!
istrickedby(X, Y) <-- cat(X), mouse(Y).
- See this folder,
- Or this notebook.
See https://github.com/Naereen/OMicroB/tree/numworks/targets/numworks/tests/prolog for more details.
This (small) repository is published under the terms of the MIT license (file LICENSE). © Lilian Besson, 2018.