- Documentation
- Reference manual
- Packages
- SWI-Prolog Python interface
- Introduction
- Data conversion
- Janus by example
- library(janus): Call Python from Prolog
- Calling Prolog from Python
- Janus and threads
- Janus as a Python package
- Prolog and Python
- Janus performance evaluation
- Python or C/C++ for accessing resources?
- Janus platforms notes
- Compatibility to the XSB Janus implementation
- Status of Janus
- SWI-Prolog Python interface
1 Introduction
Python has a huge developer community that maintains a large set of resources, notably interfaces to just about anything one can imagine. Making such interfaces directly available to Prolog can surely be done. However, developing an interface typically requires programming in C or C++, a skill that is not widely available everywhere. Being able to access Python effortlessly from Prolog puts us in a much better position because Python experience is widely available in our target audience. This solution was proposed in Andersen & Swift, 2023, Swift & Andersen, 2023, initially developed for XSB.
Janus provides a bi-directional interface between Prolog and Python
using the low-level C API of both languages. This makes using Python
from Prolog as simple as taking the standard SWI-Prolog distribution and
loading library(janus). Using Prolog from Python is as
simple as
import janus_swi as janus and start making calls. Both
Prolog and Python being dynamically typed languages, we can define an
easy to use interface that provides a latency of about one μS.
The Python interface is modeled after the recent JavaScript interface developed for the WASM (Web Assembly) version. That is
- A di-directional data conversion is defined. See
section 2.
- A Prolog predicate py_call/2
to call Python functions and methods, as well as access and set object
attributes.
- A non-deterministic Prolog predicate py_iter/2
to enumerate a Python iterator.
- A Python function janus.once()
to call a Prolog predicate as once/1,
providing input to Prolog variables using a Python dict and return a
Python dict with bindings for each Prolog output variable.
- A Python iterator class janus.Query() that provides access to non-deterministic Prolog predicates.