From ee9e596368ddf137289e701226dbd1acf455d9d0 Mon Sep 17 00:00:00 2001 From: Vitor Santos Costa Date: Sat, 1 Jul 2017 23:25:22 +0100 Subject: [PATCH] yap4py stuff --- packages/python/swig/CMakeLists.txt | 8 ++-- packages/python/swig/yapi.py | 60 ++++++++++++++++++++++++++++- 2 files changed, 63 insertions(+), 5 deletions(-) diff --git a/packages/python/swig/CMakeLists.txt b/packages/python/swig/CMakeLists.txt index ba28e9ba2..96e57f8b6 100644 --- a/packages/python/swig/CMakeLists.txt +++ b/packages/python/swig/CMakeLists.txt @@ -77,7 +77,8 @@ add_custom_target( YAP4PY_SETUP_DIRS COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/yap4py/prolog/os ) -add_custom_target( YAP4PY ALL + add_custom_target( YAP4PY ALL + COMMAND ${PYTHON_EXECUTABLE} -m pip uninstall -y YAP4PY COMMAND ${SWIG_EXECUTABLE} -python -modern -c++ -py3 -DX_API -I${CMAKE_SOURCE_DIR}/CXX -I${CMAKE_SOURCE_DIR}/include -I${CMAKE_SOURCE_DIR}/H -I${CMAKE_SOURCE_DIR}/H/generated -I${CMAKE_SOURCE_DIR}/OPTYap -I../../.. -o yap_wrap.cpp yap.i COMMAND ${PYTHON_EXECUTABLE} setup.py sdist bdist_wheel WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} @@ -85,8 +86,9 @@ DEPENDS YAP4PY_SETUP) -install(CODE "execute_process(COMMAND ${PYTHON_EXECUTABLE} -m pip install --force --no-index -f dist yap4py - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})" +install(CODE "execute_process( + COMMAND ${PYTHON_EXECUTABLE} -m pip install --force --no-index -f packages/python/swig/dist YAP4PY + WORKING_DIRECTORY ${CMAKE_BINARY_DIR})" DEPENDS Py4YAP ${CMAKE_BINARY_DIR}/${YAP_STARTUP} ${dlls} ) install(FILES ${PROLOG_SOURCES} DESTINATION ${libpl}) diff --git a/packages/python/swig/yapi.py b/packages/python/swig/yapi.py index e47f55548..84e458f89 100644 --- a/packages/python/swig/yapi.py +++ b/packages/python/swig/yapi.py @@ -7,11 +7,12 @@ from collections import namedtuple from yap import * + class Engine( YAPEngine ): - def __init__(self, args=None): + def __init__(self, args=None,**kwargs): # type: (object) -> object if not args: - args = YAPEngineArgs() + args = EngineArgs(**kwargs) yap_lib_path = os.path.dirname(__file__) args.setYapShareDir(os.path.join(yap_lib_path,"prolog")) args.setYapLibDir(yap_lib_path) @@ -32,11 +33,55 @@ class Engine( YAPEngine ): class EngineArgs( YAPEngineArgs ): """ Interface to Engine Options class""" + def __init__(self, args=None,**kwargs): + super().__init__() class Predicate( YAPPredicate ): """ Interface to Generic Predicate""" +class Predicate: + """Goal is a predicate instantiated under a specific environment """ + def __init__( self, name, args, module=None, engine = None): + self = namedtuple( name, args ) + if module: + self.p = YAPPredicate( name, len(self), module ) + else: + self.p = YAPPredicate( name, len(self) ) + self.e = engine + + def goals( self, engine): + self.e = engine + + def __iter__(self): + return PrologTableIter(self.e, self.p) + + def holds(self): + return self.e.run(self._make_()) + +class PrologTableIter: + + def __init__(self, e, goal): + try: + self.e = e + self.q = e.YAPQuery(goal) + except: + print('Error') + + def __iter__(self): + # Iterators are iterables too. + # Adding this functions to make them so. + return self + + def next(self): + if self.q.next(): + return goal + else: + self.q.close() + self.q = None + raise StopIteration() + + class PrologPredicate( YAPPrologPredicate ): """ Interface to Prolog Predicate""" @@ -163,6 +208,17 @@ def live(**kwargs): # # +def boot_yap(**kwargs): + args = EngineArgs(**kwarg) + yap_lib_path = os.path.dirname(__file__) + args.setYapShareDir(os.path.join(yap_lib_path,"prolog")) + args.setYapLibDir(yap_lib_path) + args.setSavedState(os.path.join(yap_lib_path,"startup.yss")) + engine = YAPEngine(args) + engine.goal( set_prolog_flag('verbose', 'silent' ) ) + engine.goal( use_module(library('yapi') ) ) + return engine + if __name__ == "__main__": engine = boot_yap() handler = numbervars