From 134288da684353749c930ec0962a9dc7ddae4464 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Santos=20Costa?= Date: Wed, 3 Apr 2019 10:39:22 +0100 Subject: [PATCH] yapr --- CXX/yapa.hh | 11 ++++++++--- CXX/yapi.cpp | 21 +++++++++++++++++++++ CXX/yapq.hh | 4 ++++ packages/python/yap_kernel/setup.py.cmake | 4 ++-- packages/real/yap4r/src/yap4r.cpp | 17 +++++++++++++++-- 5 files changed, 50 insertions(+), 7 deletions(-) diff --git a/CXX/yapa.hh b/CXX/yapa.hh index c4f76e465..4c6c77b71 100644 --- a/CXX/yapa.hh +++ b/CXX/yapa.hh @@ -94,7 +94,9 @@ public: /// get name of (other way) inline const char *text(void) { return getName(); } ; /// get prop of type - Prop getProp( PropTag tag ) { return Yap_GetAProp( a , (PropFlags)tag ); } + Prop getProp( PropTag tag ) { return Yap_GetAProp( a , (PropFlags)tag ); }; + /// as Atom + Atom asAtom() { return a; }; }; /** @@ -158,12 +160,15 @@ public: /// Getter: extract name of functor as an atom /// /// this is for external usage. - YAPAtom name(void) { return YAPAtom(NameOfFunctor(f)); } + inline YAPAtom name() { return YAPAtom(NameOfFunctor(f)); }; /// Getter: extract arity of functor as an unsigned integer /// /// this is for external usage. - uintptr_t arity(void) { return ArityOfFunctor(f); } + inline arity_t arity() { return ArityOfFunctor(f); }; + /// Getter: extract functor as C pointer + /// + /// inline Functor functor() { return f; }; }; diff --git a/CXX/yapi.cpp b/CXX/yapi.cpp index df03d1e4b..a8601a122 100644 --- a/CXX/yapi.cpp +++ b/CXX/yapi.cpp @@ -744,6 +744,27 @@ YAPQuery::YAPQuery(YAPFunctor f, YAPTerm mod, YAPTerm ts[]) RECOVER_MACHINE_REGS(); } +YAPQuery::YAPQuery(YAPFunctor f, YAPTerm mod, Term ts[]) + : YAPPredicate(f, mod) { + + /* ignore flags for now */ + BACKUP_MACHINE_REGS(); + Term goal; + + if (ts) { + size_t arity = f.arity(); + goal = Yap_MkApplTerm(Yap_MkFunctor(f.name().asAtom(),arity), arity, ts); + nts = RepAppl(goal) + 1; + for (arity_t i = 0; i < arity; i++) + XREGS[i + 1] = ts[i]; + } else { + goal = MkVarTerm(); + } + openQuery(); + names = YAPPairTerm(TermNil); + RECOVER_MACHINE_REGS(); +} + #if 0 YAPQuery::YAPQuery(YAPFunctor f, YAPTerm ts[]) : YAPPredicate(f) { /* ignore flags for now */ diff --git a/CXX/yapq.hh b/CXX/yapq.hh index 35474603b..d77256888 100644 --- a/CXX/yapq.hh +++ b/CXX/yapq.hh @@ -76,6 +76,7 @@ public: /// least /// the same arity as the functor. YAPQuery(YAPPredicate p, YAPTerm t[]); + /// /// full constructor, /// /// @@ -83,6 +84,9 @@ public: /// least /// the same arity as the functor. YAPQuery(YAPFunctor f, YAPTerm mod, YAPTerm t[]); + /// often, this is more efficient + /// + YAPQuery(YAPFunctor f, YAPTerm mod, Term t[]); /// functor/term constructor, /// /// It is given a functor, and an array of terms that must have at least diff --git a/packages/python/yap_kernel/setup.py.cmake b/packages/python/yap_kernel/setup.py.cmake index 6179e4c5d..eb381f7f0 100644 --- a/packages/python/yap_kernel/setup.py.cmake +++ b/packages/python/yap_kernel/setup.py.cmake @@ -57,9 +57,8 @@ setup_args = dict( 'Intended Audience :: Developers', 'Intended Audience :: System Administrators', 'Intended Audience :: Science/Research', - 'License :: OSI Approved :: BSD License', + 'License :: OSI Approved :: Perl License', 'Programming Language :: Prolog', - 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', ], ) @@ -83,4 +82,5 @@ if 'setuptools' in sys.modules: setup_args.update(setuptools_args) if __name__ == '__main__': + sys.path += ['../swig'] setup(**setup_args) diff --git a/packages/real/yap4r/src/yap4r.cpp b/packages/real/yap4r/src/yap4r.cpp index 26b6cffbd..b0ed348cb 100644 --- a/packages/real/yap4r/src/yap4r.cpp +++ b/packages/real/yap4r/src/yap4r.cpp @@ -40,7 +40,7 @@ public: if (q) { q->close(); - q = NULL; + q = nullptr; } std::vector args = std::vector(); yhandle_t sls = Yap_NewHandles(sexps.length()); @@ -49,8 +49,21 @@ public: return false; args.push_back( Yap_GetFromSlot(sls+i) ); } - YAPTerm qt = YAPApplTerm(p_name,args); + if (i==0) { + YAPTerm qt = YAPAtomTerm(p_name); q = new YAPQuery(qt); + } else { + YAPFunctor f= YAPFunctor(p_name, args.length()); + YAPAtomTerm mod = YAPAtomTerm(p_module); + q = new YAPQuery(f,mod,args.data()); + } + if (q == nullptr) + return false; + bool rc = q->next(); + if (!rc) { + failed = true; + q = nullptr; + } return true; }