Prolog in WebAssembly
Prolog is a logic programming language with several different implementations. Trealla Prolog is the one most frequently associated with WebAssembly.
Available Implementations
- Trealla Prolog has Wasm and WASI support
- Guregu’s Trealla Prolog was (I believe) the origin of Trealla’s support
- Trealla Spin, also by Guregu, adds a Spin SDK for Prolog
Usage
The easiest way to use Trealla Prolog is with the Spin plugin. It will manage the Prolog runtime for you.
Install the Spin plugin:
$ spin templates install --git https://github.com/guregu/trealla-spin --update
Otherwise, you can follow the installation and build instructions on the Trealla Prolog GitHub page.
Pros and Cons
Things we like:
- It is super easy to use
- A Spin SDK!
Example
Create a new app:
$ spin new http-prolog hello-prolog --accept-defaults
Run the app:
$ cd hello-prolog
$ spin up
Logging component stdio to ".spin/logs/"
Storing default key-value data to ".spin/sqlite_key_value.db"
Serving http://127.0.0.1:3000
Available Routes:
hello-prolog: http://127.0.0.1:3000 (wildcard)
Doing spin up
fetches the prolog interpreter, so there is no spin build
step.
The scaffolded code looks like this:
:- use_module(library(spin)).
% See library/spin.pl for all the predicates built-in
% https://github.com/guregu/trealla/blob/main/library/spin.pl
%% http_handler(+Spec, +Headers, +Body, -Status)
http_handler(get("/", _QueryParams), _RequestHeaders, _RequestBody, 200) :-
html_content,
setup_call_cleanup(
store_open(default, Store),
(
( store_get(Store, counter, N0)
-> true
; N0 = 0
),
succ(N0, N),
store_set(Store, counter, N)
),
store_close(Store)
),
http_header_set("x-powered-by", "memes"),
current_prolog_flag(dialect, Dialect),
% stream alias http_body is the response body
write(http_body, '<!doctype html><html>'),
format(http_body, "<h1>Hello, ~a prolog!</h1>", [Dialect]),
format(http_body, "Welcome, visitor #<b>~d!</b>", [N]),
write(http_body, '</html>').
http_handler(get("/json", _), _, _, 200) :-
wall_time(Time),
% json_content({"time": Time}) works too
json_content(pairs([string("time")-number(Time)])).
Learn More
Here are some great resources:
- Using Trella Prolog in Spin
- Also fun: Check out the PHP (Prolog Home Page) project!