SWISH: A web based SWI-Prolog environment
There are three ways to use SWISH, which we list in increasing order of complexity:
SWISH can be used to access SWI-Prolog at the address below. We try to keep this server continuously online. You can use these servers for playing, courses or sharing and discussing ideas.
- https://swish.swi-prolog.org/ (plain Prolog and R)
- http://cplint.ml.unife.it/ (probabilistic and machine learning extensions)
We have not yet dealt with scalable hosting nor with really reliable and scalable storage for saved programs. We hope to keep all your programs online for at least multiple years.
docker run -d --net=none --name=rserve swipl/rserve docker run -d -p 3050:3050 --volumes-from rserve -v $(pwd):/data swipl/swish
There are many configuration options for SWISH, notably for authentication, email notifications and extension plugins. See the docker-swish repo for details.
cd to your swish root directory and
git submodule update --init
If you have
make installed you can configure the desired packs by
PACKS variable and run the following to download them and
configure those that need to be configured.
Install bower for your platform. On Ubuntu, this
npm by installing two packages and next use
npm to install
bower (some older Linux versions need
sudo apt-get install npm nodejs sudo npm install -g bower
Once you have
bower, run the following from the toplevel of
get the dependencies:
bower install make src
Download as zip
As installing node and bower is not a pleasure on all operating systems,
you can also download the dependencies as a single zip file from
Unpack the zip file, maintaining the directory structure, from the swish
root directory to create the directory web/bower_components. If you have
make installed you can install the above
.zip file using
Last updated: Feb 18, 2018, 2017: upgraded to current dependencies.
Get the latest SWI-Prolog
Install the latest SWI-Prolog development version. As SWISH is very much in flux and depends on the recent SWI-Prolog pengines and sandboxing libraries, it is quite common that you need the nightly build (Windows) or build the system from the current git development repository swipl-devel.git.
Feb 18, 2018: SWI-Prolog 7.7.9 works fine; 7.7.10 fixes a bug in operator handling for CSV downloads.
Rendering Prolog terms as
requires Graphviz. The avatar system
convert utility from
ImageMagic. These are available as
packages for virtually any Linux system, e.g., on Debian based systems
sudo apt-get install imagemagick sudo apt-get install graphviz
With a sufficiently recent Prolog installed, start the system by opening
run.pl either by running
swipl run.pl (Unix) or opening
from the Windows explorer.
Now direct your browser to http://localhost:3050/
If you want to know what the latest version looks like, go to https://swish.swi-prolog.org/
There is a lot that can be configured in SWISH. Roughly:
Make additional libraries available, e.g., RDF support, database connections, link to R, etc.
Configure authentication and authorization. The default is not to demand and run commands sandboxed. At the other extreme you can configure the system to demand login for all access and provide full access to Prolog.
Configuration is done by reading
*.pl files from the directory
config-enabled. The directory
config-available contains templates
that can be copied and optionally edited to create a configuration.
See README.md in config-available for details.
Running SWISH without sandbox limitations
By default, SWISH does not require the user to login but lets you run
only safe commands. If you want to use SWISH for unrestricted
development, enable the config file
mkdir -p config-enabled (cd config-enabled && ln -s ../config-available/auth_http_always.pl)
Next, for first usage, you need to create a user. The authentication
module defines swish_add_user/0, which asks for details about the user
to be created and updates or creates a file called
passwd. At the
moment Group and E-Mail are stored, but not used.
?- swish_add_user. % Password file: /home/jan/src/prolog/swish/passwd (update) User name: bob Real name: Bob Hacker Group: user E-Mail: firstname.lastname@example.org Password: (again): true.
If you now try to run a command in SWISH, it will prompt for a user and password. After authentication you can run any Prolog predicate.
NOTE Authentication uses HTTP digest authentication by default. This authentication method uses a challenge-response method to verify the password and ensures the credentials change with every request such that old credentials cannot be re-used by an attacker. Unfortunately, the server stores the password as the SHA1 hash created from the user, password and realm. This is relatively vulnerable to brute-force attacks for anyone who gains access to the password file due to the low computational overhead of SHA1 and the lack of a user-specific salt. Also note that the exchanged commands and replies are not encrypted. Secure servers should use HTTPS.
Instead of using
auth_http_always.pl you can use
allows for unauthenticated -sandboxed- usage as well as logging in to
the server and get unrestricted access. In addition, several social
login modules are provided to login using Google, etc. Currently these
provide no additional rights. A more fine grained authorization scheme
Running as a service
The script daemon.pl is provided to run SWISH as a service or daemon on Unix systems. Run this to get an overview of the options.
This script can be used to start SWISH as a daemon from the command
line, start SWISH from service managers such as
and simplifies running as an HTTPS server. See
can be found in the directory
RequireJS for dependency tracking and
plugins. The accompanying CSS is in
web/css. More details about the
There are two overal pages.
web/swish.html provides a static page and
lib/page.pl provides a Prolog frontend to generate the overal page or
parts thereof dynamically. The latter facilitates smoothless embedding
in SWI-Prolog web applications.
Development and debugging
% sudo npm install -g jsdoc % sudo npm install -g requirejs % sudo npm install -g clean-css-cli
You also need GNU make installed as
make and SWI-Prolog as
With all that in place, the following command creates the minified
% make min
The default main page (
/) is generated from
lib/page.pl. It uses
web/css/swish-min.css when available. If the minified files are not
present, the server automatically includes the full source. The
generated files may be removed using
Alternatively, use of the minified files can be disable from Prolog using this command and reloading the page:
generated documentation is available in