99 lines
2.7 KiB
Plaintext
99 lines
2.7 KiB
Plaintext
|
PySWIP README
|
||
|
============
|
||
|
|
||
|
:Version:
|
||
|
0.2.2
|
||
|
|
||
|
:Author:
|
||
|
Yuce Tekol. <http://www.geocities.com/yucetekol>
|
||
|
|
||
|
:Project Website:
|
||
|
http://code.google.com/p/pyswip
|
||
|
|
||
|
|
||
|
Introduction
|
||
|
------------
|
||
|
|
||
|
PySWIP is a GPL'd Python - SWI-Prolog bridge enabling to query SWI-Prolog in your Python programs. It features an (incomplete) SWI-Prolog foreign language interface, a utility class that makes it easy querying with Prolog and also a Pythonic interface.
|
||
|
|
||
|
Since PySWIP uses SWI-Prolog as a shared library and ctypes to access it, it doesn't require compilation to be installed.
|
||
|
|
||
|
Note that this version of PySWIP is slightly incompatible with 0.1.x versions.
|
||
|
|
||
|
Requirements:
|
||
|
-------------
|
||
|
|
||
|
* Python 2.3 and higher.
|
||
|
* ctypes 1.0 and higher.
|
||
|
* SWI-Prolog 5.6.x and higher (most probably other versions will also work).
|
||
|
* libpl as a shared library.
|
||
|
* Works on Linux and Win32, should work for all POSIX.
|
||
|
|
||
|
Example (Using Prolog):
|
||
|
-----------------------
|
||
|
|
||
|
>>> from pyswip import Prolog
|
||
|
>>> prolog = Prolog()
|
||
|
>>> prolog.assertz("father(michael,john)")
|
||
|
>>> prolog.assertz("father(michael,gina)")
|
||
|
>>> list(prolog.query("father(michael,X)"))
|
||
|
[{'X': 'john'}, {'X': 'gina'}]
|
||
|
>>> for soln in prolog.query("father(X,Y)"):
|
||
|
... print soln["X"], "is the father of", soln["Y"]
|
||
|
...
|
||
|
michael is the father of john
|
||
|
michael is the father of gina
|
||
|
|
||
|
Since version 0.1.3 of PySWIP, it is possible to register a Python function as a Prolog predicate through SWI-Prolog's foreign language interface.
|
||
|
|
||
|
Example (Foreign Functions):
|
||
|
----------------------------
|
||
|
|
||
|
from pyswip import Prolog, registerForeign
|
||
|
|
||
|
def hello(t):
|
||
|
print "Hello,", t
|
||
|
hello.arity = 1
|
||
|
|
||
|
registerForeign(hello)
|
||
|
|
||
|
prolog = Prolog()
|
||
|
prolog.assertz("father(michael,john)")
|
||
|
prolog.assertz("father(michael,gina)")
|
||
|
list(prolog.query("father(michael,X), hello(X)"))
|
||
|
|
||
|
Outputs:
|
||
|
Hello, john
|
||
|
Hello, gina
|
||
|
|
||
|
Since version 0.2, PySWIP contains a 'Pythonic' interface which allows writing predicates in pure Python (*Note that interface is experimental.*)
|
||
|
|
||
|
Example (Pythonic interface):
|
||
|
-----------------------------
|
||
|
|
||
|
from pyswip import Functor, Variable, Query
|
||
|
|
||
|
assertz = Functor("assertz", 2)
|
||
|
father = Functor("father", 2)
|
||
|
|
||
|
call(assertz(father("michael","john")))
|
||
|
call(assertz(father("michael","gina")))
|
||
|
|
||
|
X = Variable()
|
||
|
q = Query(father("michael",X))
|
||
|
while q.nextSolution():
|
||
|
print "Hello,", X.value
|
||
|
q.closeQuery()
|
||
|
|
||
|
Outputs:
|
||
|
Hello, john
|
||
|
Hello, gina
|
||
|
|
||
|
The core functionality of ``Prolog.query`` is based on Nathan Denny's public domain prolog.py found at http://www.ahsc.arizona.edu/~schcats/projects/docs/prolog-0.2.0.html
|
||
|
|
||
|
Install
|
||
|
-------
|
||
|
|
||
|
Please see ``INSTALL`` for detailed instructions.
|
||
|
|