Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time

SWI-Prolog ported to WebAssembly

This repository contains instructions to compile a Prolog implementation SWI-Prolog ( to WebAssembly.


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


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 (asjust path):

source ./


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

wget -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 "$HOME/swipl-devel"
cd "$HOME/swipl-devel"
git fetch
git checkout wasm

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 \
emmake make

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


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

  • swipl-web.wasm - binary distribution of SWI-Prolog executable.
  • swipl-web.dat - necessary files to initialize the runtime and the library.
  • swipl-web.js - JavaScript wrapper that loads the wasm code and prepares the virtual filesystem with the runtime initialization file and the library.


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:

  • Set up a stub Module object with noInitialRun: true and other options.
  • Set up FLI bindings in Module.onRuntimeInitialized.
  • Use the bindings to call PL_initialise.
  • Set up the location for standard library.
  • Use the FS API to write code files into the virtual filesystem.
  • Load the code files from SWI-Prolog side using consult/1 or a similar way.
  • Interact with SWI-Prolog through its FLI.


See example/index.html as a simple example. It can be found online at The commented code inside the demo provides the documentation.

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


  • Provide full set of bindings?
  • A way to call JavaScript from SWI-Prolog.
  • Compile and add useful packages.
  • Provide a mechanism to load packs?
  • Easier way to turn Prolog terms into JS objects?
  • See where WebAssembly goes and what interfaces could be added (direct DOM access?).


SWI-Prolog is covered with the Simplified BSD license. See

zlib is covered with the zlib license. See


SWI-Prolog ported to WebAssembly







No releases published


No packages published