https://github.com/gooofy/py-xsb
py-xsb is a Python - XSB bridge enabling querying XSB in your Python programs. It features a ctypes mapping of XSB's C-Interface as well as some higher level convenience wrappers.
https://github.com/gooofy/py-xsb
prolog python wrapper-api xsb
Last synced: 9 months ago
JSON representation
py-xsb is a Python - XSB bridge enabling querying XSB in your Python programs. It features a ctypes mapping of XSB's C-Interface as well as some higher level convenience wrappers.
- Host: GitHub
- URL: https://github.com/gooofy/py-xsb
- Owner: gooofy
- License: apache-2.0
- Created: 2017-12-29T02:32:59.000Z (almost 8 years ago)
- Default Branch: master
- Last Pushed: 2018-12-04T22:48:54.000Z (about 7 years ago)
- Last Synced: 2025-03-28T03:41:21.965Z (9 months ago)
- Topics: prolog, python, wrapper-api, xsb
- Language: Python
- Homepage:
- Size: 45.9 KB
- Stars: 6
- Watchers: 2
- Forks: 2
- Open Issues: 0
-
Metadata Files:
- Readme: README.adoc
- License: LICENSE
Awesome Lists containing this project
README
py-xsb
------
A Python - XSB bridge enabling querying XSB in your Python programs. It
features a ctypes mapping of XSB's C-Interface as well as some higher level
convenience wrappers.
Constructive comments, patches and pull-requests are very welcome.
Examples
~~~~~~~~
High Level Wrappers (demo_highlevel.py)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Setup XSB engine:
[source,python]
----
from pyxsb import pyxsb_start_session, pyxsb_end_session, pyxsb_command, \
pyxsb_query, XSBFunctor, XSBVariable, xsb_to_json, json_to_xsb
pyxsb_start_session()
# in case auto-detection fails, you can pass the XSB arch dir here like so:
# pyxsb_start_session('/opt/xsb-3.8.0/config/x86_64-redhat-linux-gnu')
#
# to determine the location of the XSB arch dir on your machine, run this query in XSB:
# xsb_configuration:xsb_configuration(config_dir,Dir).
----
run a string XSB command:
[source,python]
----
pyxsb_command('consult(ft).')
----
run a string query:
[source,python]
----
for row in pyxsb_query('label(X, L).'):
print u"label of %s is %s" % (row[0], row[1])
----
queries and commands can also be constructed structurally:
[source,python]
----
for row in pyxsb_query(XSBFunctor('descend', [XSBVariable('X'), XSBVariable('Y')])):
print u"decendant of %s is %s" % (row[0], row[1])
----
the wrappers (XSBFunctor, XSBVariable, XSBString, XSBAtom) are the same ones used to represent the query results.
For integers, floats and lists primitive python types are used:
[source,python]
----
for row in pyxsb_query(u'A = 1, B = 0.5, C = "hello", D = yes, E = foo(bar), F = [1.1,2.2], G = \'günter\'.'):
for i, r in enumerate(row):
print u"#%d: %-10s (type: %-20s, class: %-20s)" % (i, r, type(r), r.__class__)
----
the wrappers can also converted to and from JSON:
[source,python]
----
js = xsb_to_json(row)
print "json: %s" % js
row2 = json_to_xsb(js)
print "restored: %s" % str(row2)
----
close the session:
[source,python]
----
pyxsb_end_session()
----
XSB Low Level API (demo_lowlevel.py)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
First, import xsb and init the library:
[source,python]
----
from pyxsb import pyxsb_start_session
pyxsb_start_session()
from pyxsb import *
----
execute an XSB command:
[source,python]
----
c2p_functor("consult", 1, reg_term(1))
c2p_string("ctest",p2p_arg(reg_term(1),1))
if xsb_command():
raise Exception ("Error consulting ctest")
----
same thing using the string interface:
[source,python]
----
if xsb_command_string("consult(basics)."):
raise Exception ("Error (string) consulting basics.")
----
run a query:
[source,python]
----
# Create the query p(300,X,Y) and send it.
c2p_functor("p",3,reg_term(1))
c2p_int(300,p2p_arg(reg_term(1),1))
rcode = xsb_query()
# Print out answer and retrieve next one.
while not rcode:
if not is_string(p2p_arg(reg_term(2),1)) and is_string(p2p_arg(reg_term(2),2)):
print "2nd and 3rd subfields must be atoms"
else:
print "Answer: %d, %s(%s), %s(%s)" % ( p2c_int(p2p_arg(reg_term(1),1)),
p2c_string(p2p_arg(reg_term(1),2)),
xsb_var_string(1),
p2c_string(p2p_arg(reg_term(1),3)),
xsb_var_string(2))
rcode = xsb_next()
----
run a string query:
[source,python]
----
xsb_make_vars(3)
xsb_set_var_int(300,1)
rcode = xsb_query_string("p(X,Y,Z).")
# Print out answer and retrieve next one.
while not rcode:
if not is_string(p2p_arg(reg_term(2),2)) and is_string(p2p_arg(reg_term(2),3)):
print "2nd and 3rd subfields must be atoms"
else:
print "Answer: %d, %s, %s" % (xsb_var_int(1),
xsb_var_string(2),
xsb_var_string(3))
rcode = xsb_next()
----
close the connection:
[source,python]
----
pyxsb_end_session()
----
Installation Notes
~~~~~~~~~~~~~~~~~~
`py-xsb` needs the XSB dynamic library to work: First, follow the standard XSB build instructions:
[source,bash]
----
tar xfvz XSB.tar.gz
cd XSB/build
./configure
./makexsb
----
now, in order to build `libxsb.so`, execute this command:
[source,bash]
----
[guenter@dagobert build]$ ./makexsb dynmodule
----
Links
~~~~~
* http://xsb.sourceforge.net/ [XSB]
Requirements
~~~~~~~~~~~~
* Python 2.7 or Python 3.6
* libxsb.so shared library installed and in ld's path
License
~~~~~~~
My own code is Apache-2.0 licensed unless otherwise noted in the script's copyright
headers.
Authors
~~~~~~~
* Guenter Bartsch
* Many improvements and bugfixes by Michael Kifer, Annie Liu, David Warren (XSB team at Stony Brook University of New York)