Home

Awesome

This repository is superseeded by the normal SWI-Prolog development distribution, see https://github.com/SWI-Prolog/swipl-wasm. See https://swi-prolog.discourse.group/t/swi-prolog-in-the-browser-using-wasm/5650 for updates on the WASM port.

SWI-Prolog ported to WebAssembly

This repository contains instructions to compile a Prolog implementation SWI-Prolog (http://swi-prolog.org) to WebAssembly.

Compilation

These compilation instructions assume Linux-based host machine. The resulting WebAssembly binary is platform-independent.

Preparation

You need to download the Emscripten compiler. Follow the instruction on its homepage.

After the successful installation load the Emscripten environment into the current terminal session (adjust path):

source ./emsdk_env.sh

Dependencies

SWI-Prolog depends on zlib. To compile it to WebAssembly:

wget https://zlib.net/zlib-1.2.11.tar.gz -O "$HOME/zlib-1.2.11.tar.gz"
tar -xf "$HOME/zlib-1.2.11.tar.gz" -C "$HOME"
cd "$HOME/zlib-1.2.11"
emconfigure ./configure
emmake make

This will download and build zlib into the zlib-1.2.11 subdirectory in your home directory.

Build SWI-Prolog

git clone https://github.com/rla/swipl-devel.git "$HOME/swipl-devel"
cd "$HOME/swipl-devel"
git fetch
git checkout wasm
./prepare

This will ask:

Do you want me to run git submodule update --init? [Y/n]

As we are not yet building packages, say "n".

If it asks:

Could not find documentation.  What do you want to do?

Then say "3". We do not need documentation to build it.

After this we can run configure and compile:

cd "$HOME/swipl-devel/src"
LDFLAGS=-L"$HOME/zlib-1.2.11" \
  LIBS=-lzlib \
  CPPFLAGS=-I"$HOME/zlib-1.2.11" \
  COFLAGS=-O3 emconfigure ./configure \
    --disable-mt \
    --disable-gmp \
    --disable-custom-flags
emmake make

This will build the necessary 3 files in $HOME/swipl-devel/src. See "Distribution".

Distribution

Binary distribution (in the dist directory) contains the files:

Usage

Please see "Foreign Language Interface" (FLI) in the SWI-Prolog manual. A very limited set of function findings into JavaScript can be seen in the demo. The bindings use cwrap from Emscripten.

General workflow:

Demo

See example/index.html as a simple example. It can be found online at http://demos.rlaanemets.com/swi-prolog-wasm/example/. The commented code inside the demo provides the documentation.

To test it out locally, you need to serve the files through an HTTP server.

TODO

License

SWI-Prolog is covered with the Simplified BSD license. See http://www.swi-prolog.org/license.html

zlib is covered with the zlib license. See https://zlib.net/zlib_license.html