For a better understanding of interface to ECLiPSe system read description of C interface.
A simple example of unification:
from pyclp import *
init() #Init ECLiPSe engine
myVar=Var() #Create a prolog variable
my_goal=Compound("=",myVar,1) #Create goal
my_goal.post_goal() #Post goal
result,dummy =resume() #Resume execution
#of ECLiPSe engine
if result != SUCCEED:
raise
print(myVar.value +1) #myVar.value get the Var value back.
print(myVar) #print value
cleanup() #Shutdown ECLiPSe engine
Compound class is used to create compound term. First argument is a string representing the functor followed by the argument.
A more complex example using ic library and search procedure:
from pyclp import *
init() # Init ECLiPSe engine
Compound("lib",Atom("ic")).post_goal() # Load ic library
A_var=Var() # Create variable A
B_var=Var() # Create variable B
Compound("#::",PList([A_var,B_var]),\
Compound("..",1,10)).post_goal() # [A,B]#::1..10
Compound("#<",A_var,B_var).post_goal() # A#<B
Compound("#=",A_var,5).post_goal() # A#=5
Compound("labeling",\
PList([A_var,B_var])).post_goal() # labeling([A,B])
# Loop on all solution and print them.
while (resume()[0]==SUCCEED):
print(B_var)
Atom("fail").post_goal() # Post fail for backtracking over solutions
cleanup() # Shutdown ECLiPSe engine
How to cut solutions:
from pyclp import *
init() # Init ECLiPSe engine
Compound("lib","lists").post_goal() # lib(lists)
A_var=Var() # Create variable A
Compound("member",A_var,PList([1,2,3])).post_goal() # member(A_var,[1,2,3])
# Loop on all solution and print them.
while (resume()[0]==SUCCEED):
if A_var.value()==2: # When value == 2 cut all other solutions.
cut()
break
Atom("fail").post_goal() # Post fail for backtracking over solutions
B_var=Var() # Create variable B
Compound("is",B_var,\
Compound("+",A_var,1)).post_goal() # B_Var is A_var + 1
resume()
print(A_var,B_var)
cleanup() #Shutdown ECLiPSe engine
Receive data from stdout stream:
from pyclp import *
init() # Init ECLiPSe engine
Compound("writeln","Hello world").post_goal()
result,stream_num=resume()
if result != FLUSHIO: # Check for output data
raise
else:
outStream=Stream(stream_num) # Open output stream
data=outStream.readall() # Return data in a bytes object
print(data)
outStream.close() # Not required but implemented to support RawIO protocol
cleanup() # Shutdown ECLiPSe engine
Input to stdin stream and output from stdout stream:
from pyclp import *
print ("I/O Example")
init() # Init ECLiPSe engine
stdin=Stream('stdin') # Open stdin stream
stdout=Stream('stdout') # Open stdout stream
A_var=Var() # Variable where to store the input term.
Compound ("read",A_var).post_goal() # read(A)
Compound("writeln",A_var).post_goal() # writeln(A)
while (1):
result,stream=resume()
if result==WAITIO: # ECLiPSe is waiting for data
stdin.write(b'Hello_World')
elif result==FLUSHIO:
print(stdout.readall()) # ECLiPSe send data to stdout stream
else:
break
stdin.close() # Not required but implemented to support RawIO protocol
stdout.close() # Not required but implemented to support RawIO protocol
cleanup() # Shutdown ECLiPSe engine