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.
							 | 
						||
| 
								 | 
							
								
							 |