Files
scryer-prolog/README.md
2017-01-27 22:06:19 -07:00

67 lines
1.2 KiB
Markdown

# rusty-wam
An implementation of the Warren Abstract Machine in Rust, done
according to the progression of languages in [Warren's Abstract
Machine: A Tutorial
Reconstruction](http://wambook.sourceforge.net/wambook.pdf), ending in
pure Prolog.
## Progress
The language L1 is implemented as a simple REPL. It supports
unification on facts and queries without backtracking and rules
without clauses, in the familiar Prolog syntax. No data types apart
from atoms are currently supported.
An example of the level of interaction currently supported is:
```
l1> p(Z, Z).
l1> ?- p(Z, Z).
yes
l1> ?- p(Z, z).
yes
l1> ?- p(Z, w).
yes
l1> clouds(are, nice).
l1> ?- p(z, w).
no
l1> ?- p(w, w).
yes
l1> ?- clouds(Z, Z).
no
l1> ?- clouds(Z, W).
yes
l1> ?- clouds(are, W).
yes
l1> ?- clouds(W, nice).
yes
l1> ?- clouds(nice, are).
no
l1> ?- p(Z, h(Z, W), f(W)).
no
l1> p(Z, h(Z, W), f(W)).
l1> ?- p(z, h(z, z), f(w)).
no
l1> ?- p(z, h(z, w), f(w)).
yes
l1> ?- p(Z, h(z, W), f(w)).
yes
l1> ?- p(z, h(Z, w), f(w)).
yes
l1> ?- p(Z, h(Z, w), f(Z)).
yes
l1> ?- p(z, h(Z, w), f(Z)).
no
l1> quit
```
## Occurs check
There's no occurs check, so cyclic terms do unify:
```
l1> p(W, W).
l1> ?- p(f(f(W)), W).
yes
```