This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
yap-6.3/CXX/yapq.hh

207 lines
5.9 KiB
C++
Raw Normal View History

2015-02-09 01:52:10 +00:00
#ifndef YAPQ_HH
#define YAPQ_HH 1
2016-07-31 16:22:24 +01:00
class YAPPredicate;
2015-02-09 01:52:10 +00:00
/**
Queries and engines
*/
/**
* @brief Queries
*
* interface to a YAP Query;
* uses an SWI-like status info internally.
*/
2016-07-31 16:22:24 +01:00
class YAPQuery : public YAPPredicate {
bool q_open;
int q_state;
yhandle_t q_g, q_handles;
struct yami *q_p, *q_cp;
jmp_buf q_env;
int q_flags;
YAP_dogoalinfo q_h;
YAPQuery *oq;
2016-01-07 16:02:08 +00:00
YAPListTerm vnames;
2015-04-13 13:28:17 +01:00
YAPTerm goal;
2016-09-21 20:41:23 +01:00
// temporaries
Term tgoal, names;
2015-04-13 13:28:17 +01:00
2016-09-21 20:41:23 +01:00
void openQuery();
2016-07-31 16:22:24 +01:00
2015-02-09 01:52:10 +00:00
public:
/// main constructor, uses a predicate and an array of terms
///
2016-07-31 16:22:24 +01:00
/// It is given a YAPPredicate _p_ , and an array of terms that must have at
/// least
2015-02-09 01:52:10 +00:00
/// the same arity as the functor.
YAPQuery(YAPPredicate p, YAPTerm t[]);
/// full constructor,
///
2016-07-31 16:22:24 +01:00
/// It is given a functor, module, and an array of terms that must have at
/// least
2015-02-09 01:52:10 +00:00
/// the same arity as the functor.
YAPQuery(YAPFunctor f, YAPTerm mod, YAPTerm t[]);
/// functor/term constructor,
///
/// It is given a functor, and an array of terms that must have at least
/// the same arity as the functor. Works within the current module.
YAPQuery(YAPFunctor f, YAPTerm t[]);
/// string constructor without varnames
///
2016-07-31 16:22:24 +01:00
/// It is given a string, calls the parser and obtains a Prolog term that
/// should be a callable
2015-04-13 13:28:17 +01:00
/// goal.
2016-09-27 18:28:54 +01:00
inline YAPQuery(const char *s) : YAPPredicate(s, tgoal, names) {
BACKUP_H();
2016-11-11 07:23:34 +00:00
__android_log_print(ANDROID_LOG_INFO, "YAPDroid", "got game %ld",
2016-07-31 16:22:24 +01:00
LOCAL_CurSlot);
2016-09-27 18:28:54 +01:00
if (!ap)
return;
2016-09-21 20:41:23 +01:00
goal = YAPTerm(tgoal);
2016-07-31 16:22:24 +01:00
vnames = YAPListTerm(names);
__android_log_print(ANDROID_LOG_INFO, "YAPDroid", "%s", vnames.text());
2016-09-21 20:41:23 +01:00
openQuery();
RECOVER_H();
2016-07-31 16:22:24 +01:00
};
/// string constructor with just an atom
///
/// It is given an atom, and a Prolog term that should be a callable
/// goal, say `main`, `init`, `live`.
2016-09-27 18:28:54 +01:00
inline YAPQuery(YAPAtom g) : YAPPredicate(g) {
goal = YAPAtomTerm(g);
vnames = YAPListTerm();
openQuery();
2015-04-13 13:28:17 +01:00
};
2015-02-09 01:52:10 +00:00
/// set flags for query execution, currently only for exception handling
2016-07-31 16:22:24 +01:00
void setFlag(int flag) { q_flags |= flag; }
2015-02-09 01:52:10 +00:00
/// reset flags for query execution, currently only for exception handling
2016-07-31 16:22:24 +01:00
void resetFlag(int flag) { q_flags &= ~flag; }
/// first query
2015-02-09 01:52:10 +00:00
///
/// actually implemented by calling the next();
inline bool first() { return next(); }
/// ask for the next solution of the current query
/// same call for every solution
bool next();
2016-04-12 16:22:53 +01:00
/// does this query have open choice-points?
/// or is it deterministic?
bool deterministic();
2015-02-09 01:52:10 +00:00
/// represent the top-goal
2015-04-13 13:28:17 +01:00
const char *text();
2016-07-31 16:22:24 +01:00
/// remove alternatives in the current search space, and finish the current
/// query
2015-02-09 01:52:10 +00:00
void cut();
/// finish the current query: undo all bindings.
void close();
/// query variables.
YAPListTerm namedVars();
2016-07-31 16:22:24 +01:00
/// query variables, but copied out
YAPListTerm namedVarsCopy();
/// convert a ref to a binding.
YAPTerm getTerm(yhandle_t t);
/// simple YAP Query;
/// just calls YAP and reports success or failure, Useful when we just
/// want things done, eg YAPCommand("load_files(library(lists), )")
2016-07-31 16:22:24 +01:00
inline bool command() {
bool rc = next();
close();
return rc;
};
2015-02-09 01:52:10 +00:00
};
// Java support
2016-07-31 16:22:24 +01:00
/// This class implements a callback Prolog-side. It will be inherited by the
/// Java or Python
2015-02-09 01:52:10 +00:00
/// class that actually implements the callback.
class YAPCallback {
public:
2016-07-31 16:22:24 +01:00
virtual ~YAPCallback() {}
virtual void run() { LOG("callback"); }
virtual void run(char *s) {}
2015-02-09 01:52:10 +00:00
};
/**
* @brief YAP Engine: takes care of the execution environment
where we can go executing goals.
*
*
*/
class YAPEngine {
private:
YAPCallback *_callback;
YAP_init_args init_args;
YAPError yerror;
2016-07-31 16:22:24 +01:00
void doInit(YAP_file_type_t BootMode);
2016-10-16 23:18:51 +01:00
YAP_dogoalinfo q;
2016-07-31 16:22:24 +01:00
2015-02-09 01:52:10 +00:00
public:
2016-07-31 16:22:24 +01:00
/// construct a new engine; may use a variable number of arguments
YAPEngine(
char *savedState = (char *)NULL, char *bootFile = (char *)NULL,
size_t stackSize = 0, size_t trailSize = 0, size_t maxStackSize = 0,
size_t maxTrailSize = 0, char *libDir = (char *)NULL,
char *goal = (char *)NULL, char *topLevel = (char *)NULL,
bool script = FALSE, bool fastBoot = FALSE,
2016-10-20 04:38:17 +01:00
bool embedded = true,
2016-07-31 16:22:24 +01:00
YAPCallback *callback = (YAPCallback *)
NULL); /// construct a new engine, including aaccess to callbacks
/// construct a new engine using argc/argv list of arguments
YAPEngine(int argc, char *argv[],
YAPCallback *callback = (YAPCallback *)NULL);
/// kill engine
2015-02-09 01:52:10 +00:00
~YAPEngine() { delYAPCallback(); }
/// remove current callback
void delYAPCallback() { _callback = 0; }
/// set a new callback
2016-07-31 16:22:24 +01:00
void setYAPCallback(YAPCallback *cb) {
delYAPCallback();
_callback = cb;
}
2015-02-09 01:52:10 +00:00
/// execute the callback.
2015-03-23 07:26:03 +00:00
////void run() { if (_callback) _callback->run(); }
2015-02-09 01:52:10 +00:00
/// execute the callback with a text argument.
2016-07-31 16:22:24 +01:00
void run(char *s) {
if (_callback)
_callback->run(s);
}
2016-09-21 20:41:23 +01:00
/// stop yap
2016-09-27 18:28:54 +01:00
void close() { Yap_exit(0); }
2016-09-21 20:41:23 +01:00
2015-02-09 01:52:10 +00:00
/// execute the callback with a text argument.
2016-09-21 20:41:23 +01:00
bool hasError() { return LOCAL_Error_TYPE != YAP_NO_ERROR; }
2015-02-09 01:52:10 +00:00
/// build a query on the engine
2016-07-31 16:22:24 +01:00
YAPQuery *query(const char *s) { return new YAPQuery(s); };
2015-02-09 01:52:10 +00:00
/// current module for the engine
2016-07-31 16:22:24 +01:00
YAPModule currentModule() { return YAPModule(); }
/// given a handle, fetch a term from the engine
inline YAPTerm getTerm(yhandle_t h) { return YAPTerm(h); }
2015-07-23 01:33:30 +01:00
/// current directory for the engine
2016-09-21 20:41:23 +01:00
bool call(YAPPredicate ap, YAPTerm ts[]);
2016-09-27 18:28:54 +01:00
/// current directory for the engine
2016-10-16 23:18:51 +01:00
bool goalt(YAPTerm t);
/// current directory for the engine
bool goal(Term t);
/// reset Prolog state
void reSet();
/// release: assune that there are no stack pointers, just release memory
// for last execution
void release();
2016-09-21 20:41:23 +01:00
2016-07-31 16:22:24 +01:00
const char *currentDir() {
char dir[1024];
std::string s = Yap_getcwd(dir, 1024 - 1);
return s.c_str();
};
/// report YAP version as a string
2016-07-31 16:22:24 +01:00
const char *version() {
std::string s = Yap_version();
return s.c_str();
};
2016-10-16 23:18:51 +01:00
Term fun(Term t);
2015-02-09 01:52:10 +00:00
};
#endif /* YAPQ_HH */