Skip to main content

Janus library to call SWI-Prolog

Project description

Janus: a bi-directional interface to Python

This code implements a ready-to-use bi-directional interface to Python. As motivated by Theresa Swift, Python opens many doors for accessing resources such as graphics, machine learning and many more.

The API defined in this interface has been established as a PIP, Prolog Improvement Proposal. When the PIP is finished and published we will properly reference it. The main predicates and Python functions of this interface are compatible with the XSB Python package janus_xsb. Both janus_swi and janus_xsb implement extensions upon the agreed interface. For example, janus_swi supports SWI-Prolog dicts and defines thread synchronization between Prolog and Python.

Installing as Prolog library

This is normally a GIT sub module of the SWI-Prolog git repo. Configuration and installation of library(janus) which embeds Python into Prolog is handled by the normal Prolog configuration. Building the interface requires the libraries and C headers for Python embedding to be installed. On Debian based Linux systems, this is achieved using

apt install python3 libpython3-dev

If you need to build Python, the following command is suggested (assuming you wish to install it in $HOME/.local/bin). You may also need the option --enable-shared.

CFLAGS='-fPIC' CCSHARED='-fPIC' ./configure --prefix=$HOME/.local --enable-optimizations
make -j8   # change "8" to the number of CPUs on your machine
make install

On MacOS, these files are included in the Homebrew and Macports versions of Python

On Windows, these files are included in the default installer. Configuration requires Python to appear in %PATH%.

After successful installation, running py_version/0 should result in printing relevant information on the embedded Python system.

?- py_version.
% Janus embeds Python 3.10.12 (main, Jun 11 2023, 05:26:28) [GCC 11.4.0

Embedding Prolog into Python

This repo may be installed as a Python package such that you can run e.g.,

python
>>> import janus_swi as janus
>>> janus.query_once("writeln('Hello world!')")
Hello world!
{'truth': True}
>>>

To install the package you need pip with a C compiler. On Linux this is probably provided by default by installing pip. On MacOS you need to install Xcode. On Windows, it probably depends how you installed CPython. Assuming the binary installers from https://www.python.org/downloads/windows/, you need to install Microsoft Visual C++. If this is not installed, pip will tell you and give a link from where to download Microsoft Visual C++.

Next, you need to make sure swipl can be found. The setup.py script first tries to find swipl (swipl.exe on Windows) on your application search path. You can verify that by running swipl from a terminal. If swipl cannot be found or it is not the expected version of SWI-Prolog, adjust your PATH. On Windows, setup.py also checks the registry to find SWI-Prolog as it is installed by the default installation. If this works, SWI-Prolog does not need to be in %PATH%.

If this is all in place, you can download this repo and install it, as in

git clone https://github.com/SWI-Prolog/packages-swipy.git swipy
cd swipy
pip install .

You can also do this using the one-liner below.

pip install git+https://github.com/SWI-Prolog/packages-swipy.git#egg=janus_swi

Documentation

See SWI-Prolog manual

Alternatives

MQI (Machine Query Interface)

SWI-Prolog comes bundled with MQI. MQI is initiated from Python and starts SWI-Prolog as a server. It allows calling Prolog from Python. Separated using networking, this approach is easy to install and runs with any Python version. It does not allow calling Python from Prolog, the primary reason for the existence of this package. Using networking, the latency is relatively high.

pyswip

The pyswip interface uses the Python ctypes to embed Prolog into Python. Only relying on ctypes, the package is a fully portable Python package that supports a wide range of Python and Prolog versions.

Unlike this package, embedding Python into Prolog is not possible. pyswip calls Prolog, similarly than janus, using a string. However, where janus allows passing input to the goal as a dict that is transferred using the C API rather than strings, pyswip also passes the input as a string. This is slower, sensitive to injection attacks and complicated because the user is responsible for generating valid Prolog syntax. Calls from Prolog to Python are possible by defining a Prolog predicate from Python. This only seems to support deterministic predicates and it cannot pass data back to Prolog. Janus supports calling Python functions and methods directly and supports enumerating Python iterators and generators as non-deterministic goals using py_iter/2.

The overhead of Janus is roughly 5 times less than pyswip. As pyswip still sustains over 100K calls per second this is irrelevant to many applications.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

janus_swi-1.0.0.tar.gz (78.8 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

janus_swi-1.0.0-cp312-cp312-win_amd64.whl (69.7 kB view details)

Uploaded CPython 3.12Windows x86-64

janus_swi-1.0.0-cp311-cp311-win_amd64.whl (69.4 kB view details)

Uploaded CPython 3.11Windows x86-64

File details

Details for the file janus_swi-1.0.0.tar.gz.

File metadata

  • Download URL: janus_swi-1.0.0.tar.gz
  • Upload date:
  • Size: 78.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.12

File hashes

Hashes for janus_swi-1.0.0.tar.gz
Algorithm Hash digest
SHA256 6819ce539c6cd9a23b099c222552ffa3aa2699007a2ab328f9a871560bea5065
MD5 6b48826ec8257d8fe5636f278427b134
BLAKE2b-256 1115e3fd76cb2a4d23d8686e925a9dd2fe49f9d4975b80f8b2c163bd43524385

See more details on using hashes here.

File details

Details for the file janus_swi-1.0.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: janus_swi-1.0.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 69.7 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.12

File hashes

Hashes for janus_swi-1.0.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 ab43fb0311c10326dddd227f7a06399641ea13687dc992c0b6ad5a7e046e6f13
MD5 5c4963661f7526f69d7ffad6049a720e
BLAKE2b-256 81b04dc026c8735a54fb68e767bd619340c2e1c2242ceb7c455c86272c55dcac

See more details on using hashes here.

File details

Details for the file janus_swi-1.0.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: janus_swi-1.0.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 69.4 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.12

File hashes

Hashes for janus_swi-1.0.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 7708142307e03968140c4f5ce2de3a44611c8d1bee2637390c711cd1e505dac3
MD5 57362a73f41f1a20a8ebd45f7ecedb42
BLAKE2b-256 5de48dc25caaf9e383b624c838267c7ab5caa71a84612f42a6177e235fed4d8e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page