Smaller updates:

constant use of longjmp
conflict with python headers
win32 support
dll support
This commit is contained in:
Vitor Santos Costa 2017-02-20 15:28:46 +00:00
parent 55879dbd6c
commit 65ff3ed471
131 changed files with 8125 additions and 5154 deletions

203
#.gitignore# Normal file
View File

@ -0,0 +1,203 @@
*~
*.itf
*.po
*.qlf
*.xwam
*.wam
*.ma
*.s
*.o
*.so
*.dylib
*.dll
docs/yap.info*
.build
tags
TGSautom4te.cache
cscope.*
GPATH
m32
GRTAGS
GTAGS
tmtags*
.autotools
.Rhistory
.zedstate
config.h
Yap.h
YapConfig.h
YapTermConfig.h
.graffiti
.#*#
*/#*#
*bak
*rej
*.db
groups
*.ede
.??*
*ggtags*
.atom-build.josn
.autotools
.cproject
.dir-locals.el
.DS_store
.kateproject
.project
.pydevproject
.Rhistory
.zedstate
.graffiti
.kateproject
autom4te.cache
*rej
#*
#*#
config.h
*.html
packages/gecode/dev
JIT/HPP/bkp
cmake_install.cmake
cmake_clean.cmake
*.build
C/myabsmi.c
*.ctags#
*.hs
CMakeFiles
*.make
C/new_iop.c
*.pdf
*.log
*.orig
JIT/HPP/#JIT_In#
*.text
yap
*startup.yss
*cmake_files
C/pl-yap.c
GitSHA1.c
.vscode
CMakeLists.txt.*
FindPackageLog.txt
GitSHA1.c
clang
cmake-build-debug
os/YapIOConfig.h
CodeBlocks
os/readterm.c.cpp
os/readterm.c.cpp
packages/ProbLog/problog_examples/output/,_query_1_cluster_1.dot
packages/ProbLog/#problog_lbdd.yap#
packages/ProbLog/problog_examples/output/,_query_1_cluster_1.dot
packages/ProbLog/problog_examples/output/out.dat
packages/ProbLog/problog_examples/outputvalues.pl
packages/ProbLog/problogbdd
packages/raptor/raptor_config.h
packages/real/rconfig.h
packages/ProbLog/problog/#completion.yap#
packages/ProbLog/problog_examples/output
packages/ProbLog/problog_examples/queries
packages/swig/java/*.java
packages/swig/java/*.class
packages/swig/java/*.jar
packages/swig/java/*wrap*
*jnilib
*.jar
*LOG
packages/cplint/approx/simplecuddLPADs/LPADBDD
packages/swi-minisat2/˜:ilp
packages/swig/android/app
packages/cplint/L
packages/CLPBN/horus/hcli
tmp
Eclipse
packages/bdd/simplecudd/problogbdd
trace
packages/bdd/cudd_config.h
Makefile
build
Debug
debug
Release
Build
xcode
Threads
droid
mxe
mxe32
msys2
caret
codelite
configure
Qt
cmake/cmake-android
sublime
yap-6.3.workspace
yap-6.3.geany
YAP.project
CBlocks
yPQ
*.tmp
YAP.sublime*
yap32
Eclipse
codeblocks
yap-6.3.tags
android
yap.prj
yap.VITORs-MBP.vsc.pui
vc
packages/myddas/pl/myddas_odbc.yap
packages/myddas/pl/myddas_postgres.yap
packages/myddas/pl/myddas_sqlite3.ypp
packages/myddas/pl/#myddas_postgres.ypp#
packages/myddas/hh
packages/myddas/DaysInHospital_Y3.csv
packages/myddas/agile.csv
*.pyc
*.cmake#
*.tex
*.c#
packages/swig/yap_wrap.cxx
packages/swig/yap_wrap.h
packages/swig/yap_wrap.cpp
packages/swig/yap.py
*.ipynb
yap
packages/python/yap_kernel/x/__init__.py
x
packages/python/yap_kernel/x/__main__.py
*.gch
mxe
build

2
#GitSHA1.c.in# Normal file
View File

@ -0,0 +1,2 @@
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee#define GIT_SHA1 "@GIT_SHA1@"
const char g_GIT_SHA1[] = GIT_SHA1;

6
.ctags
View File

@ -6,6 +6,7 @@
--regex-Prolog=/^([a-z][A-Za-z0-9_]*:)?\'(.*)\'\(.*\)\.[ \t]*.*/\2/p,predicate,predicate definition/
--regex-Prolog=/^:-[ \t]+(discontiguous|dynamic|multifile|table|thread_local)[ \t]+([a-z][_a-zA-Z0-9]*:)?([a-z0-9_][_a-zA-Z0-9]*)/\1/p,predicate,predicate metadata/
--regex-Prolog=/^[ \t]*Yap_InitCPred[ \t]*\"(\$?[A-Za-z0-9_]*)\"([ \t]*).*/\1/p,predicate,predicate definition/
--langmap=C:+.(h.cmake).(h.config)
--exclude=\._*
--exclude=*\.bak
--exclude=\.svn
@ -22,3 +23,8 @@
--exclude=\#.*
--exclude=(.)\#*
--exclude=*.dylib
--exclude=docs
--exclude=build
--exclude=cmake-build-debug
--exclude=clang

2
.gitignore vendored
View File

@ -84,7 +84,7 @@ clang
cmake-build-debug
os/YapIOConfig.h
CodeBlocks
x
os/readterm.c.cpp
os/readterm.c.cpp

View File

@ -12,8 +12,8 @@
#ifdef BEAM
#include "Yap.h"
#include "compile.h"
#include "clause.h"
#include "YapCompile.h"
#include "clause.h"
#include "eam.h"
#include "eamamasm.h"
#include <stdio.h>
@ -85,7 +85,7 @@ int X_Var(Ventry *ve)
int var;
if (ve->KindOfVE == PermVar || ve->KindOfVE == VoidVar ) {
printf("Erro no tipo de variavel X ->eamamas.c \n");
printf("Erro no tipo de variavel X ->eamamas.c \n");
exit(1);
}
var = ((ve->NoOfVE) & MaskVarAdrs);
@ -99,7 +99,7 @@ int Y_Var(Ventry *ve)
{
int var;
if (ve->KindOfVE != PermVar) {
printf("Erro no tipo de variavel Y ->eamamas.c \n");
printf("Erro no tipo de variavel Y ->eamamas.c \n");
exit(1);
}
var = ((ve->NoOfVE) & MaskVarAdrs);
@ -119,7 +119,7 @@ void eam_pass(CInstr *ppc)
{
int alloc_found=0;
int body=0;
while (ppc) {
switch ((int) ppc->op) {
@ -184,7 +184,7 @@ void eam_pass(CInstr *ppc)
} else {
emit_inst(_unify_val_Y_op);
emit_par(Y_Var((Ventry *) ppc->new4));
}
} else { emit_inst(_unify_void_op); }
break;
@ -268,7 +268,7 @@ void eam_pass(CInstr *ppc)
case put_atom_op:
emit_inst(_put_atom_op);
emit_par(ppc->new1);
emit_par(ppc->new4);
emit_par(ppc->new4);
break;
case put_list_op:
emit_inst(_put_list_op);
@ -349,7 +349,7 @@ void eam_pass(CInstr *ppc)
case cut_op:
emit_inst(_cut_op);
break;
break;
case commit_op:
emit_inst(_commit_op);
break;
@ -402,7 +402,7 @@ void eam_pass(CInstr *ppc)
}
emit_par(ppc->new4);
break;
case direct_safe_call_op:
if (ppc->new1==1) {
emit_inst(_direct_safe_call_unary_op);
@ -434,8 +434,8 @@ void eam_pass(CInstr *ppc)
if (a==NULL) a=Yap_LookupAtom("\n");
emit_inst(_put_atom_op);
emit_par(1);
emit_par((Cell) MkAtomTerm(a));
}
emit_par((Cell) MkAtomTerm(a));
}
emit_inst(_write_call);
break;
case is_op:
@ -468,50 +468,50 @@ void eam_pass(CInstr *ppc)
case remove_box_op:
case remove_last_box_op:
break;
case jump_op:
emit_inst(_jump_op);
emit_upar((Cell) Code_Start+ (Cell) labels[ppc->new4]);
break;
case label_op:
if (pass==0) labels[ppc->new4] = get_addr();
if (pass==0) labels[ppc->new4] = get_addr();
break;
case run_op:
/* se ficar vazio, retirar no eam_am.c o +5 das linhas pc=clause->code+5 no only_1_clause e no call */
emit_inst(_try_me_op);
emit_par(0);
emit_par(0);
emit_par(0);
emit_par(0);
emit_par(0);
emit_par(0);
break;
case only_1_clause_op:
emit_inst(_only_1_clause_op);
emit_par(ppc->new4);
emit_par(((struct Clauses *)ppc->new4)->predi->arity);
emit_par(((struct Clauses *)ppc->new4)->nr_vars);
emit_par(((struct Clauses *)ppc->new4)->nr_vars);
emit_par(0); /* Nr da alternativa */
break;
case try_me_op:
emit_inst(_try_me_op);
emit_par(ppc->new4);
emit_par(ppc->new4);
emit_par(((struct Clauses *)ppc->new4)->predi->arity);
emit_par(((struct Clauses *)ppc->new4)->nr_vars);
emit_par(((struct Clauses *)ppc->new4)->nr_vars);
emit_par(0); /* Nr da alternativa */
break;
case retry_me_op:
emit_inst(_retry_me_op);
emit_par(ppc->new4);
emit_par(((struct Clauses *)ppc->new4)->predi->arity);
emit_par(((struct Clauses *)ppc->new4)->nr_vars);
emit_par(((struct Clauses *)ppc->new4)->nr_vars);
emit_par(ppc->new1);
break;
case trust_me_op:
emit_inst(_trust_me_op);
emit_par(ppc->new4);
emit_par(((struct Clauses *)ppc->new4)->predi->arity);
emit_par(((struct Clauses *)ppc->new4)->nr_vars);
emit_par(((struct Clauses *)ppc->new4)->nr_vars);
emit_par(ppc->new1);
break;
@ -529,11 +529,11 @@ void eam_pass(CInstr *ppc)
}
body=1;
break;
case prepare_tries:
emit_inst(_prepare_tries);
emit_par(ppc->new1);
emit_par(ppc->new4);
emit_par(ppc->new1);
emit_par(ppc->new4);
break;
case exit_op:
@ -559,7 +559,7 @@ void eam_pass(CInstr *ppc)
printf("[ please note that beam still does not support a lot of builtins ]\n");
}
emit_inst(_fail_op);
}
ppc = ppc->nextInst;
}

View File

@ -12,8 +12,8 @@
#ifdef BEAM
#include "Yap.h"
#include "compile.h"
#include "clause.h"
#include "YapCompile.h"
#include "clause.h"
#include "eam.h"
#include <stdio.h>
#include <stdlib.h>
@ -40,13 +40,13 @@ int exists_on_table(Cell a,struct HASH_TABLE **table, int i)
struct HASH_TABLE *t;
t=table[i];
while(t) {
if (t->value==a) return(1);
t=t->next;
}
return(0);
}
@ -61,20 +61,20 @@ Cell *gera_codigo_try(struct Predicates *predi) /* gerar os try's para o predic
emit_new(prepare_tries,predi->nr_alt,predi->arity);
if (predi->nr_alt==1) {
emit_new(only_1_clause_op,0,(unsigned long) c);
} else if (predi->nr_alt>1) {
emit_new(only_1_clause_op,0,(unsigned long) c);
} else if (predi->nr_alt>1) {
while(c!=NULL) {
if (nr+1==predi->nr_alt) emit_new(trust_me_op,nr,(unsigned long) c);
if (nr+1==predi->nr_alt) emit_new(trust_me_op,nr,(unsigned long) c);
else if (nr==0) emit_new(try_me_op,predi->nr_alt,(unsigned long) c);
else emit_new(retry_me_op,nr,(unsigned long) c);
c=c->next;
nr++;
}
} else {
} else {
emit_new(fail_op,0,0);
}
return(eam_assemble(StartCode));
}
@ -91,7 +91,7 @@ Cell *gera_codigo_try_list(struct Predicates *predi) /* gerar os try's para o p
c=predi->first;
emit_new(prepare_tries,nr_preds,predi->arity);
if (nr_preds>=1) {
if (nr_preds>=1) {
while(c!=NULL) {
if (c->predi==predi && (c->idx==Lista || c->idx==Variavel)) {
if (nr_preds==1) {
@ -108,20 +108,20 @@ Cell *gera_codigo_try_list(struct Predicates *predi) /* gerar os try's para o p
} else {
emit_new(fail_op,0,0);
}
return(eam_assemble(StartCode));
}
struct HASH_TABLE **gera_codigo_try_atom(struct Predicates *predi)
struct HASH_TABLE **gera_codigo_try_atom(struct Predicates *predi)
{
int j,nr_preds,nr_atoms;
struct HASH_TABLE **table;
struct HASH_TABLE *t;
struct Clauses *cla;
nr_atoms=predi->idx_atom;
nr_atoms=predi->idx_atom;
nr_preds=nr_atoms+predi->idx_var;
table=malloc(sizeof(struct HASH_TABLE *)*(nr_atoms+1));
for (j=0;j<=nr_atoms;j++) table[j]=NULL;
@ -132,7 +132,7 @@ struct Clauses *cla;
Cell a;
unsigned int index;
int nr;
a=cla->val;
if (a && nr_atoms) {
index=index_of_hash_table_atom(a,nr_atoms);
@ -187,18 +187,18 @@ struct HASH_TABLE **table;
struct HASH_TABLE *t;
struct Clauses *cla;
nr_appls=predi->idx_functor;
nr_appls=predi->idx_functor;
nr_preds=nr_appls+predi->idx_var;
table=malloc(sizeof(struct HASH_TABLE *)*(nr_appls+1));
for (j=0;j<=nr_appls;j++) table[j]=NULL;
cla=predi->first;
while(cla) {
if (cla->idx==Estrutura) {
Cell a;
long int index;
int nr;
a=cla->val;
if (a && nr_appls) {
index=index_of_hash_table_appl(a,nr_appls);
@ -257,7 +257,7 @@ Cell *gera_codigo_try_only_vars(struct Predicates *predi) /* gerar os try's de V
c=predi->first;
emit_new(prepare_tries,nr_preds,predi->arity);
if (nr_preds>=1) {
if (nr_preds>=1) {
while(c!=NULL) {
if (c->predi==predi && c->idx==Variavel) {
if (nr_preds==1) {
@ -274,7 +274,7 @@ Cell *gera_codigo_try_only_vars(struct Predicates *predi) /* gerar os try's de V
} else {
emit_new(fail_op,0,0);
}
return(eam_assemble(StartCode));
}
@ -292,7 +292,7 @@ void do_eam_indexing(struct Predicates *p)
p->idx=1;
}
if((Print_Code & 4) && (Print_Code & 8)) {
if((Print_Code & 4) && (Print_Code & 8)) {
printf("General Case :\n");
eam_showcode(p->code);
}
@ -309,10 +309,10 @@ void ver_predicados(struct Predicates *p)
c=p->first;
while(c!=NULL) {
printf("Clausula %d do tipo %d (%d locals %d args) (val=0x%X)\n",++i,c->idx,c->nr_vars,c->predi->arity, (unsigned )c->val);
printf("Clausula %d do tipo %d (%d locals %d args) (val=0x%X)\n",++i,c->idx,c->nr_vars,c->predi->arity, (unsigned )c->val);
c=c->next;
}
}

View File

@ -188,7 +188,7 @@ static char SccsId[] = "@(#)amasm.c 1.3 3/15/90";
#include "Yap.h"
#include "clause.h"
#include "compile.h"
#include "YapCompile.h"
#include "yapio.h"
#ifdef BEAM

View File

@ -127,8 +127,7 @@ X_API yhandle_t YAP_CurrentSlot(void);
/// @brief allocate n empty new slots
///
/// Return a handle to the system's default slot.
X_API yhandle_t YAP_NewSlots(int NumberOfSlots);
/// Return a handle to the system's default slo t. iX_API yhandle_t YAP_NewSlots(int NumberOfSlots);
/// @brief allocate n empty new slots
///
@ -246,6 +245,8 @@ X_API YAP_Bool YAP_IsRationalTerm(YAP_Term t) {
#endif
}
X_API YAP_Bool YAP_IsStringTerm(YAP_Term t) { return (IsStringTerm(t)); }
X_API YAP_Bool YAP_IsVarTerm(YAP_Term t) { return (IsVarTerm(t)); }
X_API YAP_Bool YAP_IsNonVarTerm(YAP_Term t) { return (IsNonVarTerm(t)); }
@ -277,6 +278,32 @@ X_API Term YAP_MkIntTerm(Int n) {
return I;
}
X_API Term YAP_MkStringTerm(const char *n) {
CACHE_REGS
Term I;
BACKUP_H();
I = MkStringTerm(n);
RECOVER_H();
return I;
}
X_API Term YAP_MkUnsignedStringTerm(const unsigned char *n) {
CACHE_REGS
Term I;
BACKUP_H();
I = MkUStringTerm(n);
RECOVER_H();
return I;
}
X_API const char *YAP_StringOfTerm(Term t) { return StringOfTerm(t); }
X_API const unsigned char *YAP_UnsignedStringOfTerm(Term t) {
return UStringOfTerm(t);
}
X_API Int YAP_IntOfTerm(Term t) {
if (!IsApplTerm(t))
return IntOfTerm(t);
@ -1380,8 +1407,8 @@ X_API Term YAP_ReadBuffer(const char *s, Term *tp) {
tv = 0;
LOCAL_ErrorMessage = NULL;
const unsigned char *us = (const unsigned char *)s;
while (!(t = Yap_BufferToTermWithPrioBindings(
us, strlen(s) + 1, TermNil, GLOBAL_MaxPriority, tv))) {
while (!(t = Yap_BufferToTermWithPrioBindings(us, strlen(s) + 1, TermNil,
GLOBAL_MaxPriority, tv))) {
if (LOCAL_ErrorMessage) {
if (!strcmp(LOCAL_ErrorMessage, "Stack Overflow")) {
if (!Yap_dogc(0, NULL PASS_REGS)) {
@ -1638,7 +1665,6 @@ X_API PredEntry *YAP_AtomToPredInModule(Atom at, Term mod) {
static int run_emulator(USES_REGS1) {
int out;
LOCAL_PrologMode &= ~(UserCCallMode | CCallMode);
out = Yap_absmi(0);
LOCAL_PrologMode |= UserCCallMode;
return out;
@ -1661,7 +1687,7 @@ X_API bool YAP_EnterGoal(PredEntry *pe, CELL *ptr, YAP_dogoalinfo *dgi) {
// slot=%d", pe, pe->CodeOfPred->opc, FAILCODE, Deref(ARG1), Deref(ARG2),
// LOCAL_CurSlot);
dgi->b = LCL0 - (CELL *)B;
out = run_emulator(PASS_REGS1);
out = Yap_exec_absmi(true, false);
RECOVER_MACHINE_REGS();
if (out) {
dgi->EndSlot = LOCAL_CurSlot;
@ -2122,16 +2148,20 @@ X_API YAP_Term YAP_CopyTerm(Term t) {
X_API char *YAP_WriteBuffer(Term t, char *buf, size_t sze, int flags) {
CACHE_REGS
size_t length;
seq_tv_t inp, out;
size_t length = sze;
char *b;
BACKUP_MACHINE_REGS();
if ((b = Yap_TermToString(t, &length, LOCAL_encoding, flags)) != buf) {
RECOVER_MACHINE_REGS();
return b;
}
inp.val.t = t;
inp.type = YAP_STRING_TERM;
out.type = YAP_STRING_CHARS;
out.val.c = buf;
out.enc = LOCAL_encoding;
if (!Yap_CVT_Text(&inp, &out PASS_REGS))
return NULL;
RECOVER_MACHINE_REGS();
return buf;
return out.val.c;
}
/// write a a term to n user-provided buffer: make sure not tp
@ -2253,13 +2283,11 @@ static void do_bootfile(const char *bootfilename USES_REGS) {
the module.
*/
static bool initialized = false;
X_API bool YAP_initialized = false;
static int n_mdelays = 0;
static YAP_delaymodule_t *m_delays;
X_API bool YAP_DelayInit(YAP_ModInit_t f, const char s[]) {
if (initialized)
return false;
if (m_delays) {
m_delays = realloc(m_delays, (n_mdelays + 1) * sizeof(YAP_delaymodule_t));
} else {
@ -2271,6 +2299,17 @@ X_API bool YAP_DelayInit(YAP_ModInit_t f, const char s[]) {
return true;
}
bool Yap_LateInit(const char s[]) {
int i;
for (i = 0; i < n_mdelays; i++) {
if (!strcmp(m_delays[i].s, s)) {
m_delays[i].f();
return true;
}
}
return false;
}
static void start_modules(void) {
Term cm = CurrentModule;
size_t i;
@ -2296,9 +2335,8 @@ YAP_file_type_t YAP_Init(YAP_init_args *yap_init) {
const char *yroot;
/* ignore repeated calls to YAP_Init */
if (initialized)
if (YAP_initialized)
return YAP_FOUND_BOOT_ERROR;
initialized = true;
Yap_embedded = yap_init->Embedded;
Yap_page_size = Yap_InitPageSize(); /* init memory page size, required by
@ -2306,9 +2344,10 @@ YAP_file_type_t YAP_Init(YAP_init_args *yap_init) {
#if defined(YAPOR_COPY) || defined(YAPOR_COW) || defined(YAPOR_SBA)
Yap_init_yapor_global_local_memory();
#endif /* YAPOR_COPY || YAPOR_COW || YAPOR_SBA */
GLOBAL_PrologShouldHandleInterrupts = yap_init->PrologShouldHandleInterrupts &&
!yap_init->Embedded;
Yap_InitSysbits(0); /* init signal handling and time, required by later
// GLOBAL_PrologShouldHandleInterrupts =
// yap_init->PrologShouldHandleInterrupts &&
if (!yap_init->Embedded)
Yap_InitSysbits(0); /* init signal handling and time, required by later
functions */
GLOBAL_argv = yap_init->Argv;
GLOBAL_argc = yap_init->Argc;
@ -2492,6 +2531,7 @@ YAP_file_type_t YAP_Init(YAP_init_args *yap_init) {
setBooleanGlobalPrologFlag(SAVED_PROGRAM_FLAG, false);
}
start_modules();
YAP_initialized = true;
return rc;
}

View File

@ -20,7 +20,7 @@ static char SccsId[] = "@(#)cdmgr.c 1.1 05/02/98";
#include "Yap.h"
#include "clause.h"
#include "eval.h"
#include "YapEval.h"
#include "tracer.h"
#include "yapio.h"
#ifdef YAPOR

View File

@ -207,7 +207,7 @@ void Yap_RestartYap(int flag) {
#if PUSH_REGS
restore_absmi_regs(&Yap_standard_regs);
#endif
siglongjmp(LOCAL_RestartEnv, 1);
siglongjmp(*LOCAL_RestartEnv, 1);
}
static void error_exit_yap(int value) {
@ -328,7 +328,7 @@ void Yap_ThrowError__(const char *file, const char *function, int lineno,
} else {
Yap_Error__(file, function, lineno, type, where);
}
siglongjmp(LOCAL_RestartEnv, 4);
siglongjmp(*LOCAL_RestartEnv, 4);
}
/**

168
C/exec.c
View File

@ -48,7 +48,7 @@ static choiceptr cp_from_integer(Term cpt USES_REGS) {
*/
Term Yap_cp_as_integer(choiceptr cp) {
CACHE_REGS
return cp_as_integer(cp PASS_REGS);
return cp_as_integer(cp PASS_REGS);
}
/**
@ -128,7 +128,7 @@ inline static bool CallMetaCall(Term t, Term mod USES_REGS) {
*/
Term Yap_ExecuteCallMetaCall(Term mod) {
CACHE_REGS
Term ts[4];
Term ts[4];
ts[0] = ARG1;
ts[1] = cp_as_integer(B PASS_REGS); /* p_current_choice_point */
ts[2] = ARG1;
@ -141,8 +141,8 @@ Term Yap_ExecuteCallMetaCall(Term mod) {
Term Yap_PredicateIndicator(Term t, Term mod) {
CACHE_REGS
// generate predicate indicator in this case
Term ti[2];
// generate predicate indicator in this case
Term ti[2];
t = Yap_YapStripModule(t, &mod);
if (IsApplTerm(t) && !IsExtensionFunctor(FunctorOfTerm(t))) {
ti[0] = MkAtomTerm(NameOfFunctor(FunctorOfTerm(t)));
@ -210,12 +210,12 @@ static Int save_env_b(USES_REGS1) {
}
/** Look for a predicate with same functor as t,
create a new one of it cannot find it.
*/
create a new one of it cannot find it.
*/
static PredEntry *new_pred(Term t, Term tmod, char *pname) {
Term t0 = t;
restart:
restart:
if (IsVarTerm(t)) {
Yap_Error(INSTANTIATION_ERROR, t0, pname);
return NULL;
@ -273,7 +273,7 @@ inline static bool do_execute(Term t, Term mod USES_REGS) {
Term t0 = t;
t = Yap_YapStripModule(t, &mod);
/* first do predicate expansion, even before you process signals.
This way you don't get to spy goal_expansion(). */
This way you don't get to spy goal_expansion(). */
if (Yap_has_a_signal() && !LOCAL_InterruptsDisabled &&
!(LOCAL_PrologMode & (AbortMode | InterruptMode | SystemMode))) {
return EnterCreepMode(t, mod PASS_REGS);
@ -393,7 +393,7 @@ inline static bool do_execute_n(Term t, Term mod, unsigned int n USES_REGS) {
int j = -n;
Term t0 = t;
restart_exec:
restart_exec:
if (IsVarTerm(t)) {
return CallError(INSTANTIATION_ERROR, t0, mod PASS_REGS);
} else if (IsAtomTerm(t)) {
@ -432,8 +432,8 @@ restart_exec:
}
if (Yap_has_a_signal() && !LOCAL_InterruptsDisabled) {
return EnterCreepMode(
copy_execn_to_heap(f, pt, n, arity, CurrentModule PASS_REGS),
mod PASS_REGS);
copy_execn_to_heap(f, pt, n, arity, CurrentModule PASS_REGS),
mod PASS_REGS);
}
if (arity > MaxTemps) {
return CallError(TYPE_ERROR_CALLABLE, t, mod PASS_REGS);
@ -650,7 +650,7 @@ static Int execute_clause(USES_REGS1) { /* '$execute_clause'(Goal) */
yamop *code;
Term clt = Deref(ARG3);
restart_exec:
restart_exec:
if (IsVarTerm(t)) {
Yap_Error(INSTANTIATION_ERROR, ARG3, "call/1");
return FALSE;
@ -746,7 +746,7 @@ static void prune_inner_computation(choiceptr parent) {
cut_pt = B;
while (cut_pt < parent) {
/* make sure we
e C-choicepoints */
e C-choicepoints */
if (POP_CHOICE_POINT(cut_pt->cp_b)) {
POP_EXECUTE();
}
@ -791,7 +791,7 @@ static void complete_inner_computation(choiceptr old_B) {
static inline Term *GetTermAddress(CELL a) {
Term *b = NULL;
restart:
restart:
if (!IsVarTerm(a)) {
return (b);
} else if (a == (CELL)b) {
@ -845,8 +845,8 @@ static bool exit_set_call(execution_port exec_result, choiceptr B0, yamop *oCP,
Term rc;
switch (exec_result) {
// we failed
// Exception: we'll pass it through
// we failed
// Exception: we'll pass it through
case CALLED_FROM_EXCEPTION:
// internal exception
{
@ -905,8 +905,8 @@ static bool exit_set_call(execution_port exec_result, choiceptr B0, yamop *oCP,
choiceptr saved_b = B;
CELL *pt = ASP;
CUT_C_PUSH(
NEXTOP(NEXTOP(PredProtectStack->cs.p_code.FirstClause, OtapFs), OtapFs),
pt); // this is where things get complicated, we need to
NEXTOP(NEXTOP(PredProtectStack->cs.p_code.FirstClause, OtapFs), OtapFs),
pt); // this is where things get complicated, we need to
// protect the stack and be able to backtrack
pt -= 4;
pt[3] = t4;
@ -955,7 +955,7 @@ static Int protect_stack_from_cut(USES_REGS1) {
* @param USES_REGS1 [env for threaded execution]
* @return c
[next answer]
*/
*/
static Int protect_stack_from_retry(USES_REGS1) {
// called after backtracking..
//
@ -1091,9 +1091,9 @@ static Int setup_call_catcher_cleanup(USES_REGS1) {
static bool complete_ge(bool out, Term omod, yhandle_t sl, bool creeping) {
CACHE_REGS
if (creeping) {
Yap_signal(YAP_CREEP_SIGNAL);
}
if (creeping) {
Yap_signal(YAP_CREEP_SIGNAL);
}
CurrentModule = omod;
Yap_CloseSlots(sl);
if (out) {
@ -1123,7 +1123,7 @@ static Int _user_expand_goal(USES_REGS1) {
ARG1 = Yap_MkApplTerm(FunctorModule, 2, mg_args);
ARG2 = Yap_GetFromSlot(h2);
if ((pe = RepPredProp(
Yap_GetPredPropByFunc(FunctorGoalExpansion2, SYSTEM_MODULE))) &&
Yap_GetPredPropByFunc(FunctorGoalExpansion2, SYSTEM_MODULE))) &&
pe->OpcodeOfPred != FAIL_OPCODE && pe->OpcodeOfPred != UNDEF_OPCODE &&
Yap_execute_pred(pe, NULL, false PASS_REGS)) {
return complete_ge(true, omod, sl, creeping);
@ -1133,7 +1133,7 @@ static Int _user_expand_goal(USES_REGS1) {
ARG3 = Yap_GetFromSlot(h2);
/* user:goal_expansion(A,CurMod,B) */
if ((pe = RepPredProp(
Yap_GetPredPropByFunc(FunctorGoalExpansion, USER_MODULE))) &&
Yap_GetPredPropByFunc(FunctorGoalExpansion, USER_MODULE))) &&
pe->OpcodeOfPred != FAIL_OPCODE && pe->OpcodeOfPred != UNDEF_OPCODE &&
Yap_execute_pred(pe, NULL PASS_REGS, false)) {
return complete_ge(true, omod, sl, creeping);
@ -1145,7 +1145,7 @@ static Int _user_expand_goal(USES_REGS1) {
/* user:goal_expansion(A,B) */
if (cmod != USER_MODULE && /* we have tried this before */
(pe = RepPredProp(
Yap_GetPredPropByFunc(FunctorGoalExpansion2, USER_MODULE))) &&
Yap_GetPredPropByFunc(FunctorGoalExpansion2, USER_MODULE))) &&
pe->OpcodeOfPred != FAIL_OPCODE && pe->OpcodeOfPred != UNDEF_OPCODE &&
Yap_execute_pred(pe, NULL PASS_REGS, false)) {
return complete_ge(true, omod, sl, creeping);
@ -1165,7 +1165,7 @@ static Int do_term_expansion(USES_REGS1) {
ARG1 = g;
if ((pe = RepPredProp(
Yap_GetPredPropByFunc(FunctorTermExpansion, USER_MODULE))) &&
Yap_GetPredPropByFunc(FunctorTermExpansion, USER_MODULE))) &&
pe->OpcodeOfPred != FAIL_OPCODE && pe->OpcodeOfPred != UNDEF_OPCODE &&
Yap_execute_pred(pe, NULL, false PASS_REGS)) {
return complete_ge(true, omod, sl, creeping);
@ -1184,7 +1184,7 @@ static Int do_term_expansion(USES_REGS1) {
ARG1 = Yap_MkApplTerm(FunctorModule, 2, mg_args);
ARG2 = Yap_GetFromSlot(h2);
if ((pe = RepPredProp(
Yap_GetPredPropByFunc(FunctorTermExpansion, SYSTEM_MODULE))) &&
Yap_GetPredPropByFunc(FunctorTermExpansion, SYSTEM_MODULE))) &&
pe->OpcodeOfPred != FAIL_OPCODE && pe->OpcodeOfPred != UNDEF_OPCODE &&
Yap_execute_pred(pe, NULL, false PASS_REGS)) {
return complete_ge(true, omod, sl, creeping);
@ -1202,7 +1202,7 @@ static Int execute0(USES_REGS1) { /* '$execute0'(Goal,Mod) */
return EnterCreepMode(t, mod PASS_REGS);
}
t = Yap_YapStripModule(t, &mod);
restart_exec:
restart_exec:
if (IsVarTerm(t)) {
Yap_Error(INSTANTIATION_ERROR, ARG3, "call/1");
return false;
@ -1421,7 +1421,10 @@ static bool exec_absmi(bool top, yap_reset_t reset_mode USES_REGS) {
int lval, out;
Int OldBorder = LOCAL_CBorder;
LOCAL_CBorder = LCL0 - (CELL *)B;
if (top && (lval = sigsetjmp(LOCAL_RestartEnv, 1)) != 0) {
sigjmp_buf signew, *sighold = LOCAL_RestartEnv;
LOCAL_RestartEnv = &signew;
if (top && (lval = sigsetjmp(signew, 1)) != 0) {
switch (lval) {
case 1: { /* restart */
/* otherwise, SetDBForThrow will fail entering critical mode */
@ -1449,25 +1452,27 @@ static bool exec_absmi(bool top, yap_reset_t reset_mode USES_REGS) {
/* reset the registers so that we don't have trash in abstract
* machine */
Yap_set_fpu_exceptions(
getAtomicGlobalPrologFlag(ARITHMETIC_EXCEPTIONS_FLAG));
getAtomicGlobalPrologFlag(ARITHMETIC_EXCEPTIONS_FLAG));
P = (yamop *)FAILCODE;
LOCAL_PrologMode = UserMode;
} break;
case 3: { /* saved state */
LOCAL_CBorder = OldBorder;
LOCAL_RestartEnv = sighold;
return false;
}
case 4: {
/* abort */
/* can be called from anywgerre, must reset registers,
*/
LOCAL_RestartEnv = sighold;
Yap_JumpToEnv(TermDAbort);
P = (yamop *)FAILCODE;
LOCAL_PrologMode = UserMode;
} break;
default:
/* do nothing */
LOCAL_PrologMode = UserMode;
/* do nothing */
LOCAL_PrologMode = UserMode;
}
} else {
LOCAL_PrologMode = UserMode;
@ -1480,6 +1485,7 @@ static bool exec_absmi(bool top, yap_reset_t reset_mode USES_REGS) {
if (!Yap_has_a_signal())
CalculateStackGap(PASS_REGS1);
LOCAL_CBorder = OldBorder;
LOCAL_RestartEnv = sighold;
return out;
}
@ -1530,13 +1536,13 @@ void Yap_PrepGoal(arity_t arity, CELL *pt, choiceptr saved_b USES_REGS) {
static bool do_goal(yamop *CodeAdr, int arity, CELL *pt, bool top USES_REGS) {
choiceptr saved_b = B;
bool out;
Yap_PrepGoal(arity, pt, saved_b PASS_REGS);
CACHE_A1();
P = (yamop *)CodeAdr;
// S = CellPtr(RepPredProp(
// PredPropByFunc(Yap_MkFunctor(AtomCall, 1), 0))); /* A1 mishaps */
out = exec_absmi(top, YAP_EXEC_ABSMI PASS_REGS);
if (top)
Yap_flush();
@ -1550,7 +1556,7 @@ static bool do_goal(yamop *CodeAdr, int arity, CELL *pt, bool top USES_REGS) {
bool Yap_exec_absmi(bool top, yap_reset_t has_reset) {
CACHE_REGS
return exec_absmi(top, has_reset PASS_REGS);
return exec_absmi(top, has_reset PASS_REGS);
}
/**
@ -1560,7 +1566,7 @@ bool Yap_exec_absmi(bool top, yap_reset_t has_reset) {
*/
void Yap_fail_all(choiceptr bb USES_REGS) {
yamop *saved_p, *saved_cp;
saved_p = P;
saved_cp = CP;
/* prune away choicepoints */
@ -1579,7 +1585,7 @@ void Yap_fail_all(choiceptr bb USES_REGS) {
DEPTH = B->cp_depth;
#endif /* DEPTH_LIMIT */
YENV = ENV = B->cp_env;
/* recover local stack */
/* recover local stack */
#ifdef DEPTH_LIMIT
DEPTH = ENV[E_DEPTH];
#endif
@ -1606,16 +1612,16 @@ bool Yap_execute_pred(PredEntry *ppe, CELL *pt, bool pass_ex USES_REGS) {
yamop *saved_p, *saved_cp;
yamop *CodeAdr;
bool out;
saved_p = P;
saved_cp = CP;
LOCAL_PrologMode |= TopGoalMode;
PELOCK(81, ppe);
CodeAdr = ppe->CodeOfPred;
UNLOCK(ppe->PELock);
out = do_goal(CodeAdr, ppe->ArityOfPE, pt, false PASS_REGS);
if (out) {
choiceptr cut_B;
/* we succeeded, let's prune */
@ -1691,21 +1697,21 @@ bool Yap_execute_pred(PredEntry *ppe, CELL *pt, bool pass_ex USES_REGS) {
bool Yap_execute_goal(Term t, int nargs, Term mod, bool pass_ex) {
CACHE_REGS
Prop pe;
Prop pe;
PredEntry *ppe;
CELL *pt;
/* preserve the current restart environment */
/* visualc*/
/* just keep the difference because of possible garbage collections
*/
if (IsAtomTerm(t)) {
Atom a = AtomOfTerm(t);
pt = NULL;
pe = PredPropByAtom(a, mod);
} else if (IsApplTerm(t)) {
Functor f = FunctorOfTerm(t);
if (IsBlobFunctor(f)) {
Yap_Error(TYPE_ERROR_CALLABLE, t, "call/1");
return false;
@ -1728,7 +1734,7 @@ bool Yap_execute_goal(Term t, int nargs, Term mod, bool pass_ex) {
void Yap_trust_last(void) {
CACHE_REGS
ASP = B->cp_env;
ASP = B->cp_env;
CP = B->cp_cp;
HR = B->cp_h;
#ifdef DEPTH_LIMIT
@ -1746,7 +1752,7 @@ void Yap_trust_last(void) {
Term Yap_RunTopGoal(Term t, bool handle_errors) {
CACHE_REGS
yamop *CodeAdr;
yamop *CodeAdr;
Prop pe;
PredEntry *ppe;
CELL *pt;
@ -1754,7 +1760,7 @@ Term Yap_RunTopGoal(Term t, bool handle_errors) {
Term tmod = CurrentModule;
Term goal_out = 0;
LOCAL_PrologMode |= TopGoalMode;
t = Yap_YapStripModule(t, &tmod);
if (IsVarTerm(t)) {
Yap_Error(INSTANTIATION_ERROR, t, "call/1");
@ -1767,7 +1773,7 @@ Term Yap_RunTopGoal(Term t, bool handle_errors) {
arity = 0;
} else if (IsApplTerm(t)) {
Functor f = FunctorOfTerm(t);
if (IsBlobFunctor(f)) {
Yap_Error(TYPE_ERROR_CALLABLE, t, "call/1");
LOCAL_PrologMode &= ~TopGoalMode;
@ -1799,7 +1805,7 @@ Term Yap_RunTopGoal(Term t, bool handle_errors) {
ts[0] = tmod;
ts[1] = t;
Functor f = Yap_MkFunctor(Yap_LookupAtom("call"), 1);
pt = &t;
t = Yap_MkApplTerm(FunctorModule, 2, ts);
pe = Yap_GetPredPropByFunc(f, tmod);
@ -1809,7 +1815,7 @@ Term Yap_RunTopGoal(Term t, bool handle_errors) {
PELOCK(82, ppe);
CodeAdr = ppe->CodeOfPred;
UNLOCK(ppe->PELock);
#if !USE_SYSTEM_MALLOC
if (LOCAL_TrailTop - HeapTop < 2048) {
Yap_Error(RESOURCE_ERROR_TRAIL, TermNil,
@ -1825,7 +1831,7 @@ static void do_restore_regs(Term t, int restore_all USES_REGS) {
Int i;
Int max = ArityOfFunctor(FunctorOfTerm(t)) - 4;
CELL *ptr = RepAppl(t) + 5;
P = (yamop *)IntegerOfTerm(ptr[-4]);
CP = (yamop *)IntegerOfTerm(ptr[-3]);
ENV = (CELL *)(LCL0 - IntegerOfTerm(ptr[-2]));
@ -1855,11 +1861,11 @@ static Int restore_regs(USES_REGS1) {
* a
* call */
static Int restore_regs2(USES_REGS1) {
Term t = Deref(ARG1), d0;
choiceptr pt0;
Int d;
if (IsVarTerm(t)) {
Yap_Error(INSTANTIATION_ERROR, t, "support for coroutining");
return (FALSE);
@ -1969,7 +1975,7 @@ static Int cut_up_to_next_disjunction(USES_REGS1) {
bool Yap_Reset(yap_reset_t mode) {
CACHE_REGS
int res = TRUE;
int res = TRUE;
Yap_ResetException(worker_id);
/* first, backtrack to the root */
@ -2018,14 +2024,17 @@ static Int JumpToEnv() {
/* find the first choicepoint that may be a catch */
// DBTerm *dbt = Yap_RefToException();
while (handler && Yap_PredForChoicePt(handler, NULL) != PredDollarCatch) {
//printf("--handler=%p, max=%p\n", handler, LCL0-LOCAL_CBorder);
while (POP_CHOICE_POINT(handler)) {
POP_FAIL_EXECUTE(handler);
}
if (handler == (choiceptr)(LCL0-LOCAL_CBorder)) {
break;
}
/* we are already doing a catch */
/* make sure we prune C-choicepoints */
if (handler->cp_ap == NOCODE &&
(handler >= (choiceptr)(LCL0 - LOCAL_CBorder) ||
handler->cp_b == NULL)) {
if ((handler->cp_ap == NOCODE && handler->cp_b == NULL) ||
(handler->cp_b >= (choiceptr)(LCL0 - LOCAL_CBorder))) {
break;
}
handler = handler->cp_b;
@ -2065,7 +2074,7 @@ static Int JumpToEnv() {
bool Yap_JumpToEnv(Term t) {
CACHE_REGS
LOCAL_BallTerm = Yap_StoreTermInDB(t, 0);
LOCAL_BallTerm = Yap_StoreTermInDB(t, 0);
if (!LOCAL_BallTerm)
return false;
if (LOCAL_PrologMode & TopGoalMode)
@ -2080,20 +2089,20 @@ static Int jump_env(USES_REGS1) {
Yap_Error(INSTANTIATION_ERROR, t, "throw ball must be bound");
return false;
} else if (IsApplTerm(t) && FunctorOfTerm(t) == FunctorError) {
Term t2, te;
Term t2;
Yap_find_prolog_culprit(PASS_REGS1);
// LOCAL_Error_TYPE = ERROR_EVENT;
t = ArgOfTerm(1, t);
if (IsApplTerm(t) && IsAtomTerm((t2 = ArgOfTerm(1, t)))) {
LOCAL_ActiveError.errorAsText = AtomOfTerm(t2);
LOCAL_ActiveError.classAsText = NameOfFunctor(FunctorOfTerm(t));
LOCAL_ActiveError->errorAsText = AtomOfTerm(t2);
LOCAL_ActiveError->classAsText = NameOfFunctor(FunctorOfTerm(t));
} else if (IsAtomTerm(t)) {
LOCAL_ActiveError.errorAsText = AtomOfTerm(t);
LOCAL_ActiveError.classAsText = NULL;
LOCAL_ActiveError->errorAsText = AtomOfTerm(t);
LOCAL_ActiveError->classAsText = NULL;
}
} else {
//LOCAL_Error_TYPE = THROW_EVENT;
// LOCAL_Error_TYPE = THROW_EVENT;
}
LOCAL_ActiveError->prologPredName = NULL;
Yap_PutException(t);
@ -2115,27 +2124,27 @@ static Int generate_pred_info(USES_REGS1) {
void Yap_InitYaamRegs(int myworker_id) {
Term h0var;
// getchar();
// getchar();
#if PUSH_REGS
/* Guarantee that after a longjmp we go back to the original abstract
machine registers */
/* Guarantee that after a longjmp we go back to the original abstract
machine registers */
#ifdef THREADS
if (myworker_id) {
REGSTORE *rs = REMOTE_ThreadHandle(myworker_id).default_yaam_regs;
pthread_setspecific(Yap_yaamregs_key, (const void *)rs);
REMOTE_ThreadHandle(myworker_id).current_yaam_regs = rs;
}
/* may be run by worker_id on behalf on myworker_id */
/* may be run by worker_id on behalf on myworker_id */
#else
Yap_regp = &Yap_standard_regs;
#endif
#endif /* PUSH_REGS */
CACHE_REGS
Yap_ResetException(worker_id);
Yap_ResetException(worker_id);
Yap_PutValue(AtomBreak, MkIntTerm(0));
TR = (tr_fr_ptr)REMOTE_TrailBase(myworker_id);
HR = H0 = ((CELL *)REMOTE_GlobalBase(myworker_id)) +
1; // +1: hack to ensure the gc does not try to mark mistakenly
1; // +1: hack to ensure the gc does not try to mark mistakenly
LCL0 = ASP = (CELL *)REMOTE_LocalBase(myworker_id);
CurrentTrailTop = (tr_fr_ptr)(REMOTE_TrailTop(myworker_id) - MinTrailGap);
/* notice that an initial choice-point and environment
@ -2159,12 +2168,12 @@ void Yap_InitYaamRegs(int myworker_id) {
#ifdef YAPOR_SBA
BSEG =
#endif /* YAPOR_SBA */
BBREG = B_FZ = (choiceptr)REMOTE_LocalBase(myworker_id);
BBREG = B_FZ = (choiceptr)REMOTE_LocalBase(myworker_id);
TR = TR_FZ = (tr_fr_ptr)REMOTE_TrailBase(myworker_id);
#endif /* FROZEN_STACKS */
CalculateStackGap(PASS_REGS1);
/* the first real choice-point will also have AP=FAIL */
/* always have an empty slots for people to use */
/* the first real choice-point will also have AP=FAIL */
/* always have an empty slots for people to use */
#if defined(YAPOR) || defined(THREADS)
LOCAL = REMOTE(myworker_id);
worker_id = myworker_id;
@ -2179,7 +2188,7 @@ void Yap_InitYaamRegs(int myworker_id) {
REMOTE_GcGeneration(myworker_id) = Yap_NewTimedVar(h0var);
REMOTE_GcCurrentPhase(myworker_id) = 0L;
REMOTE_GcPhase(myworker_id) =
Yap_NewTimedVar(MkIntTerm(REMOTE_GcCurrentPhase(myworker_id)));
Yap_NewTimedVar(MkIntTerm(REMOTE_GcCurrentPhase(myworker_id)));
#if defined(YAPOR) || defined(THREADS)
PP = NULL;
PREG_ADDR = NULL;
@ -2192,7 +2201,7 @@ void Yap_InitYaamRegs(int myworker_id) {
#ifdef YAPOR_SBA
BSEG =
#endif /* YAPOR_SBA */
BBREG = B_FZ = (choiceptr)REMOTE_LocalBase(myworker_id);
BBREG = B_FZ = (choiceptr)REMOTE_LocalBase(myworker_id);
TR = TR_FZ = (tr_fr_ptr)REMOTE_TrailBase(myworker_id);
#endif /* FROZEN_STACKS */
CalculateStackGap(PASS_REGS1);
@ -2205,7 +2214,7 @@ void Yap_InitYaamRegs(int myworker_id) {
Term Yap_GetException(void) {
CACHE_REGS
Term t = 0;
Term t = 0;
if (LOCAL_BallTerm) {
t = Yap_PopTermFromDB(LOCAL_BallTerm);
@ -2224,8 +2233,8 @@ bool Yap_RaiseException(void) {
bool Yap_PutException(Term t) {
CACHE_REGS
if ((LOCAL_BallTerm = Yap_StoreTermInDB(t, 0)) != NULL)
return true;
if ((LOCAL_BallTerm = Yap_StoreTermInDB(t, 0)) != NULL)
return true;
return false;
}
@ -2235,7 +2244,6 @@ bool Yap_ResetException(int wid) {
Yap_PopTermFromDB(REMOTE_ActiveError(wid)->errorTerm);
}
REMOTE_ActiveError(wid)->errorTerm = NULL;
REMOTE_ActiveError(wid)->errorTerm = NULL;
return true;
}
@ -2274,7 +2282,7 @@ int Yap_dogc(int extra_args, Term *tp USES_REGS) {
void Yap_InitExecFs(void) {
CACHE_REGS
Term cm = CurrentModule;
Term cm = CurrentModule;
Yap_InitComma();
Yap_InitCPred("$execute", 1, execute, 0);
Yap_InitCPred("$execute", 2, execute2, 0);

View File

@ -666,12 +666,19 @@ static bool setYapFlagInModule(Term tflag, Term t2, Term mod) {
flag_term *tarr = GLOBAL_Flags;
if (!(fv->type(t2)))
return false;
if (fv->helper && !(fv->helper(t2)))
return false;
Term tout = tarr[fv->FlagOfVE].at;
if (IsVarTerm(tout))
Yap_PopTermFromDB(tarr[fv->FlagOfVE].DBT);
if (IsAtomOrIntTerm(t2))
if (IsVarTerm(tout)) {
Term t;
while ((t = Yap_PopTermFromDB(tarr[fv->FlagOfVE].DBT)) == 0) {
if (!Yap_gc(2, ENV, gc_P(P, CP))) {
Yap_Error(RESOURCE_ERROR_STACK, TermNil, LOCAL_ErrorMessage);
return false;
}
}
} else if (IsAtomOrIntTerm(t2))
tarr[fv->FlagOfVE].at = t2;
else {
tarr[fv->FlagOfVE].DBT = Yap_StoreTermInDB(t2, 2);

View File

@ -115,7 +115,7 @@ threads that are created <em>after</em> the registration.
#include "YapHeap.h"
#include "yapio.h"
#include "iopreds.h"
#include "eval.h"
#include "YapEval.h"
#include "attvar.h"
#include <math.h>

View File

@ -134,7 +134,7 @@ gc_growtrail(int committed, tr_fr_ptr begsTR, cont *old_cont_top0 USES_REGS)
#endif
/* could not find more trail */
save_machine_regs();
siglongjmp(LOCAL_gc_restore, 2);
siglongjmp(*LOCAL_gc_restore, 2);
}
}
@ -397,7 +397,7 @@ check_pr_trail( tr_fr_ptr rc USES_REGS)
if (!Yap_locked_growtrail(0, TRUE) || TRUE) {
/* could not find more trail */
save_machine_regs();
siglongjmp(LOCAL_gc_restore, 2);
siglongjmp(*LOCAL_gc_restore, 2);
}
rc = TR-n;
}
@ -525,7 +525,7 @@ pop_registers(Int num_regs, yamop *nextop USES_REGS)
/* error: we don't have enough room */
/* could not find more trail */
save_machine_regs();
siglongjmp(LOCAL_gc_restore, 4);
siglongjmp(*LOCAL_gc_restore, 4);
}
}
}
@ -1450,7 +1450,7 @@ mark_variable(CELL_PTR current USES_REGS)
/* error: we don't have enough room */
/* could not find more trail */
save_machine_regs();
siglongjmp(LOCAL_gc_restore, 3);
siglongjmp(*LOCAL_gc_restore, 3);
} else if (n > 0) {
CELL *ptr = LOCAL_extra_gc_cells;
@ -3934,6 +3934,9 @@ do_gc(Int predarity, CELL *current_env, yamop *nextop USES_REGS)
UInt gc_phase;
UInt alloc_sz;
int jmp_res;
sigjmp_buf jmp;
LOCAL_gc_restore = &jmp;
heap_cells = HR-H0;
gc_verbose = is_gc_verbose();
@ -3989,7 +3992,7 @@ do_gc(Int predarity, CELL *current_env, yamop *nextop USES_REGS)
}
#endif
time_start = Yap_cputime();
jmp_res = sigsetjmp(LOCAL_gc_restore, 0);
jmp_res = sigsetjmp(jmp, 0);
if (jmp_res == 2) {
UInt sz;

View File

@ -42,15 +42,15 @@ Yap_FindExecutable(void)
void *
Yap_LoadForeignFile(char *file, int flags)
{
void *ptr= (void *)LoadLibrary(file);
char *buf = malloc(1024);
printf("file=%s\n" , file );
void *ptr= (void *)LoadLibrary(file);
if (!ptr) {
CACHE_REGS
LOCAL_ErrorMessage = NULL;
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), LOCAL_ErrorMessage, 256,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buf, 1023,
NULL);
}
}
return ptr;
}
@ -83,17 +83,18 @@ LoadForeign(StringList ofiles, StringList libs,
HINSTANCE handle;
const char *file = AtomName(ofiles->name);
if (!Yap_findFile(file, NULL, NULL, LOCAL_FileNameBuf, true, YAP_OBJ, true, true) &&
if (Yap_findFile(file, NULL, NULL, LOCAL_FileNameBuf, true, YAP_OBJ, true, true) &&
(handle=LoadLibrary(LOCAL_FileNameBuf)) != 0)
{
LOCAL_ErrorMessage = NULL;
if (*init_proc == NULL)
*init_proc = (YapInitProc)GetProcAddress((HMODULE)handle, proc_name);
} else {
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), LOCAL_ErrorMessage, 256,
NULL);
char *buf = malloc(1024);
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buf, 1023,
NULL);
//fprintf(stderr,"WinError: %s\n", LOCAL_ErrorSay);
}
ofiles = ofiles->next;

View File

@ -46,7 +46,7 @@ p_load_foreign( USES_REGS1 )
YapInitProc InitProc = NULL;
Term t, t1;
StringList new;
Int returncode = FALSE;
bool returncode = FALSE;
yhandle_t CurSlot = Yap_StartSlots();
// Yap_DebugPlWrite(ARG1); printf("%s\n", " \n");
@ -80,13 +80,17 @@ p_load_foreign( USES_REGS1 )
/* get the initialization function name */
t1 = Deref(ARG3);
InitProcName = (char *)RepAtom(AtomOfTerm(t1))->StrOfAE;
// verify if it was waiting for initialization
if (Yap_LateInit( InitProcName ) ){
returncode = true;
} else
/* call the OS specific function for dynamic loading */
if(Yap_LoadForeign(ofiles,libs,InitProcName,&InitProc)==LOAD_SUCCEEDED) {
Yap_StartSlots( );
(*InitProc)();
Yap_CloseSlots(CurSlot);
returncode = TRUE;
returncode = true;
}
/* I should recover space if load foreign fails */

View File

@ -302,7 +302,7 @@ static Term VarNames(VarEntry *p, Term l USES_REGS) {
VarNames(p->VarLeft, l PASS_REGS) PASS_REGS));
if (HR > ASP - 4096) {
save_machine_regs();
siglongjmp(LOCAL_IOBotch, 1);
longjmp(*LOCAL_IOBotch, 1);
}
return (o);
} else {
@ -332,7 +332,7 @@ static Term Singletons(VarEntry *p, Term l USES_REGS) {
Singletons(p->VarLeft, l PASS_REGS) PASS_REGS));
if (HR > ASP - 4096) {
save_machine_regs();
siglongjmp(LOCAL_IOBotch, 1);
longjmp(*LOCAL_IOBotch, 1);
}
return (o);
} else {
@ -357,7 +357,7 @@ static Term Variables(VarEntry *p, Term l USES_REGS) {
Variables(p->VarRight, Variables(p->VarLeft, l PASS_REGS) PASS_REGS));
if (HR > ASP - 4096) {
save_machine_regs();
siglongjmp(LOCAL_IOBotch, 1);
siglongjmp(*LOCAL_IOBotch, 1);
}
return (o);
} else {

View File

@ -67,7 +67,7 @@ static yap_signals InteractSIGINT(int ch) {
#if PUSH_REGS
// restore_absmi_regs(&Yap_standard_regs);
#endif
siglongjmp(LOCAL_RestartEnv, 4);
siglongjmp(&LOCAL_RestartEnv, 4);
return YAP_ABORT_SIGNAL;
case 'b':
/* continue */

View File

@ -58,6 +58,9 @@ static char SccsId[] = "%W% %G%";
#include <fcntl.h>
#include <wchar.h>
extern int init_tries(void);
static Int p_setval(USES_REGS1);
static Int p_value(USES_REGS1);
static Int p_values(USES_REGS1);
@ -74,7 +77,7 @@ static Int p_halt(USES_REGS1);
#endif
static Int current_predicate(USES_REGS1);
static Int cont_current_predicate(USES_REGS1);
static OpEntry *NextOp(OpEntry *CACHE_TYPE);
static OpEntry *NextOp(Prop CACHE_TYPE);
static Int init_current_op(USES_REGS1);
static Int cont_current_op(USES_REGS1);
static Int init_current_atom_op(USES_REGS1);
@ -943,22 +946,24 @@ static Int current_predicate(USES_REGS1) {
return cont_current_predicate(PASS_REGS1);
}
static OpEntry *NextOp(OpEntry *pp USES_REGS) {
static OpEntry *NextOp(Prop pp USES_REGS) {
while (!EndOfPAEntr(pp) && pp->KindOfPE != OpProperty &&
(pp->OpModule != PROLOG_MODULE || pp->OpModule != CurrentModule))
pp = RepOpProp(pp->NextOfPE);
return (pp);
(RepOpProp(pp)->OpModule != PROLOG_MODULE
|| RepOpProp(pp)->OpModule != CurrentModule) )
pp = pp->NextOfPE;
return RepOpProp(pp);
}
int Yap_IsOp(Atom at) {
CACHE_REGS
OpEntry *op = NextOp(RepOpProp((Prop)(RepAtom(at)->PropsOfAE)) PASS_REGS);
OpEntry *op = NextOp(RepAtom(at)->PropsOfAE PASS_REGS);
return (!EndOfPAEntr(op));
}
int Yap_IsOpMaxPrio(Atom at) {
CACHE_REGS
OpEntry *op = NextOp(RepOpProp((Prop)(RepAtom(at)->PropsOfAE)) PASS_REGS);
OpEntry *op = NextOp(RepAtom(at)->PropsOfAE PASS_REGS);
int max;
if (EndOfPAEntr(op))
@ -1020,7 +1025,7 @@ static Int cont_current_atom_op(USES_REGS1) {
OpEntry *op = (OpEntry *)IntegerOfTerm(EXTRA_CBACK_ARG(5, 1)), *next;
READ_LOCK(op->OpRWLock);
next = NextOp(RepOpProp(op->NextOfPE) PASS_REGS);
next = NextOp(op->NextOfPE PASS_REGS);
if (unify_op(op PASS_REGS)) {
READ_UNLOCK(op->OpRWLock);
if (next) {
@ -1053,7 +1058,7 @@ static Int init_current_atom_op(
cut_fail();
}
ae = RepAtom(AtomOfTerm(t));
if (EndOfPAEntr((ope = NextOp(RepOpProp(ae->PropsOfAE) PASS_REGS)))) {
if (EndOfPAEntr((ope = NextOp(ae->PropsOfAE PASS_REGS)))) {
cut_fail();
}
EXTRA_CBACK_ARG(5, 1) = (CELL)MkIntegerTerm((Int)ope);
@ -1074,7 +1079,7 @@ static Int
cut_fail();
}
ae = RepAtom(AtomOfTerm(t));
if (EndOfPAEntr((ope = NextOp(RepOpProp(ae->PropsOfAE) PASS_REGS)))) {
if (EndOfPAEntr((ope = NextOp(ae->PropsOfAE PASS_REGS)))) {
cut_fail();
}
EXTRA_CBACK_ARG(5, 1) = (CELL)MkIntegerTerm((Int)ope);
@ -1629,7 +1634,6 @@ void Yap_InitCPreds(void) {
#if SUPPORT_CONDOR
init_sys();
init_random();
// init_tries();
init_regexp();
#endif
}

View File

@ -570,7 +570,7 @@ static void write_string(const unsigned char *s,
if (chr == '\0')
break;
if (delta == 0) {chr = *ptr++; }
if (delta == 0) {chr = *ptr++; }
write_quoted(chr, qt, stream);
} while (TRUE);
wrputc(qt, stream);

View File

@ -1,7 +1,7 @@
# value of 3.4.0 or lower.
# Sets the minimum version of CMake required to build the native
# library. You should either keep the default value or only pass a
# Sets the version of CMake required to build the native
# library. You should either keep the default value or pass a
# value of 3.4.0 or lower.
project( YAP )
@ -33,13 +33,13 @@ include(FindPackageHandleStandardArgs)
include (GNUInstallDirs)
# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds it for you.
# or SHARED, and provides the relative paths to its source code.z
# You can define libraries, and CMake builds it for you.
# Gradle automatically packages shared libraries with your APK.
#cross-compilation support
# Search packages for host system instead of packages for target system
# in case of cross compilation these macro should be defined by toolchain file
# in case of cross compilation define these macro by toolchain file
if(NOT COMMAND find_host_package)
macro(find_host_package)
find_package(${ARGN})
@ -53,6 +53,7 @@ endif()
option(BUILD_SHARED_LIBS "Build shared library" ON)
set (CMAKE_POSITION_INDEPENDENT_CODE TRUE)
set (CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
include(Prelims NO_POLICY_SCOPE)
@ -69,6 +70,8 @@ if (ANDROID)
)
endif (ANDROID)
set_property( SOURCE ${LIBYAP_SOURCES} APPEND PROPERTY COMPILE_DEFINITIONS YAP_KERNEL=1)
add_definitions(-DUSE_MYDDAS=1 -DMYDDAS_SQLITE3=1)
if (MYSQL_FOUND)
@ -82,6 +85,9 @@ if (ODBC_FOUND)
if (MYSQL_POSTGRES)
add_definitions(= -DMYDDAS_POSTGRES=1)
endif()
if (MYSQL_POSTGRES)
set(SWIG_SOURCES packages/swig/python/yap_PYTHONwrapper.cxx )
endif()
if (ANDROID)
@ -93,34 +99,17 @@ if (MYSQL_POSTGRES)
ADD_SUBDIRECTORY(CXX)
set (SWIG_FILES ${CMAKE_SOURCE_DIR}/../generated/jni/yap_wrap.cpp )
else ()
set(YLIBS
$<TARGET_OBJECTS:core>
$<TARGET_OBJECTS:libYAPOs>
$<TARGET_OBJECTS:libOPTYap>
$<TARGET_OBJECTS:myddas>
$<TARGET_OBJECTS:Yapsqlite3>
$<TARGET_OBJECTS:libswi>
$<TARGET_OBJECTS:utf8proc>
)
endif ()
else()
List (APPEND YLIBS $<TARGET_OBJECTS:libOPTYap> )
List (APPEND YLIBS $<TARGET_OBJECTS:libYAPOs> )
List (APPEND YLIBS $<TARGET_OBJECTS:utf8proc> )
List (APPEND YLIBS $<TARGET_OBJECTS:myddas> )
List (APPEND YLIBS $<TARGET_OBJECTS:Yapsqlite3> )
List (APPEND YLIBS $<TARGET_OBJECTS:libswi> )
if (WIN32)
list (APPEND YLIBS $<TARGET_OBJECTS:YapC++>)
endif()
add_component (core
${ENGINE_SOURCES}
${SWIG_FILES}
${C_INTERFACE_SOURCES}
${STATIC_SOURCES}
${ALL_SOURCES}
)
List (APPEND YLIBS $<TARGET_OBJECTS:YAP++> )
endif()
add_library( # Sets the name of the library.
@ -128,18 +117,26 @@ add_library( # Sets the name of the library.
# Sets the library as a shared library.
SHARED
${ENGINE_SOURCES}
${C_INTERFACE_SOURCES}
//${STATIC_SOURCES}
# cmake object libraries
${YLIBS}
${WINDLLS}
)
if (WIN32)
target_link_libraries(libYap ${WINDLLS})
endif (WIN32)
include(libYap NO_POLICY_SCOPE)
endif()
if (USE_READLINE)
target_link_libraries(libYap ${READLINE_LIBRARIES})
endif (USE_READLINE)
if (ANDROID)
add_dependencies(libYap plmyddas )
@ -148,9 +145,8 @@ if (ANDROID)
endif ()
set_target_properties(libYap
PROPERTIES OUTPUT_NAME Yap
)
PROPERTIES OUTPUT_NAME Yap
)
MY_include(Packages NO_POLICY_SCOPE)
include(Config NO_POLICY_SCOPE)
include(Config NO_POLICY_SCOPE)

View File

@ -145,7 +145,7 @@ ADDR db_vec0 =NULL
struct RB_red_blk_node* db_root =NULL
struct RB_red_blk_node* db_nil =NULL
sigjmp_buf gc_restore void
sigjmp_buf* gc_restore void
CELL* extra_gc_cells void
CELL* extra_gc_cells_base void
CELL* extra_gc_cells_top void
@ -160,8 +160,8 @@ struct mem_blk* CMemFirstBlock =NULL
UInt CMemFirstBlockSz =0L
// Variable used by the compiler to store number of permanent vars in a clause
int nperm =0L
int nperm =0
int jMP =0
// Thread Local Area for Labels
Int* LabelFirstArray =NULL
UInt LabelFirstArraySz =0L
@ -198,7 +198,7 @@ ADDR TrailTop void
yap_error_descriptor_t* ActiveError =calloc(sizeof(yap_error_descriptor_t),1)
/// pointer to an exception term, from throw
jmp_buf IOBotch void
jmp_buf* IOBotch void
TokEntry* tokptr void
TokEntry* toktide void
VarEntry* VarTable void
@ -209,7 +209,7 @@ CELL* CommentsNextChar void
wchar_t* CommentsBuff void
size_t CommentsBuffPos void
size_t CommentsBuffLim void
sigjmp_buf RestartEnv void
sigjmp_buf* RestartEnv void
char FileNameBuf[YAP_FILENAME_MAX+1] void
char FileNameBuf2[YAP_FILENAME_MAX+1] void

View File

@ -302,6 +302,8 @@ INLINE_ONLY inline EXTERN Term __MkStringTerm(const char *s USES_REGS) {
return t;
}
#define MkUStringTerm(i) __MkUStringTerm((i)PASS_REGS)
INLINE_ONLY inline EXTERN Term
__MkUStringTerm(const unsigned char *s USES_REGS);

39
H/Yap.h
View File

@ -129,37 +129,6 @@
#endif
#endif /* defined(HAVE_NULLPTR) */
/* Microsoft's Visual C++ Compiler */
#ifdef _MSC_VER /* adjust a config.h from mingw32 to work with vc++ */
#ifdef HAVE_GCC
#undef HAVE_GCC
#endif /* HAVE_GCC */
#ifdef USE_THREADED_CODE
#undef USE_THREADED_CODE
#endif /* USE_THREADED_CODE */
#define inline __inline
#define YAP_VERSION "YAP-6.3.4"
#define BIN_DIR "c:\\Yap\\bin"
#define LIB_DIR "c:\\Yap\\lib\\Yap"
#define SHARE_DIR "c:\\Yap\\share\\Yap"
#ifdef HOST_ALIAS
#undef HOST_ALIAS
#endif /* HOST_ALIAS */
#define HOST_ALIAS "i386-pc-win32"
#ifdef HAVE_IEEEFP_H
#undef HAVE_IEEEFP_H
#endif /* HAVE_IEEEFP_H */
#ifdef HAVE_UNISTD_H
#undef HAVE_UNISTD_H
#endif /* HAVE_UNISTD_H */
#ifdef HAVE_SYS_TIME_H
#undef HAVE_SYS_TIME_H
#endif /* HAVE_SYS_TIME_H */
#endif /* _MSC_VER */
#if HAVE_TIME_H
#include <time.h>
#endif
#ifdef __MINGW32__
#ifndef _WIN32
@ -727,10 +696,10 @@ typedef struct thandle {
struct timeval *start_of_times_sysp;
struct timeval *last_time_sysp;
#elif _WIN32
struct _FILETIME *start_of_timesp;
struct _FILETIME *last_timep;
struct _FILETIME *start_of_times_sysp;
struct _FILETIME *last_time_sysp;
win64_time_t *start_of_timesp;
win64_time_t *last_timep;
win64_time_t *start_of_times_sysp;
win64_time_t *last_time_sysp;
#endif
} yap_thandle;
#endif /* THREADS */

View File

@ -8,7 +8,7 @@
* *
**************************************************************************
* *
* File: compile.h *
* File: YapCompile.h *
* Last rev: *
* mods: *
* comments: compiler data structures and routines *

View File

@ -1,6 +1,6 @@
/*************************************************************************
* *
* YAP Prolog @(#)eval.h 1.2
* YAP Prolog @(#)YapEval.h 1.2
* *
* Yap Prolog was developed at NCCUP - Universidade do Porto *
* *
@ -8,7 +8,7 @@
* *
**************************************************************************
* *
* File: eval.h *
* File: YapEval.h *
* Last rev: *
* mods: *
* comments: arithmetical functions info *
@ -17,7 +17,7 @@
/**
@file eval.h
@file YapEval.h
@defgroup arithmetic Arithmetic in YAP

View File

@ -154,7 +154,7 @@ typedef struct thandle {
/*******************
this is the data base: everything here should be possible to restore
********************/
#if __INIT_C__
#if __INIT_C__ || defined(MSC_VER)
#define EXTERNAL
#else
#define EXTERNAL extern

View File

@ -166,13 +166,15 @@ INLINE_ONLY inline EXTERN Term *VarOfTerm(Term t) { return (Term *)(t); }
INLINE_ONLY inline EXTERN Term MkVarTerm__(USES_REGS1);
INLINE_ONLY inline EXTERN Term MkVarTerm__(USES_REGS1) {
INLINE_ONLY
inline EXTERN Term MkVarTerm__(USES_REGS1) {
return (Term)((*HR = 0, HR++));
}
INLINE_ONLY inline EXTERN bool IsUnboundVar(Term *);
INLINE_ONLY inline EXTERN bool IsUnboundVar(Term *t) { return (int)(*(t) ==
INLINE_ONLY
inline EXTERN bool IsUnboundVar(Term *t) { return (int)(*(t) ==
0); }
#else
@ -181,13 +183,15 @@ INLINE_ONLY inline EXTERN bool IsUnboundVar(Term *t) { return (int)(*(t) ==
INLINE_ONLY inline EXTERN Term MkVarTerm__(USES_REGS1);
INLINE_ONLY inline EXTERN Term MkVarTerm__(USES_REGS1) {
INLINE_ONLY
inline EXTERN Term MkVarTerm__(USES_REGS1) {
return (Term)((*HR = (CELL)HR, HR++));
}
INLINE_ONLY inline EXTERN bool IsUnboundVar(Term *);
INLINE_ONLY inline EXTERN bool IsUnboundVar(Term *t) {
INLINE_ONLY
inline EXTERN bool IsUnboundVar(Term *t) {
return *(t) == (Term)(t);
}
@ -195,13 +199,15 @@ INLINE_ONLY inline EXTERN bool IsUnboundVar(Term *t) {
INLINE_ONLY inline EXTERN CELL *PtrOfTerm(Term);
INLINE_ONLY inline EXTERN CELL *PtrOfTerm(Term t) {
INLINE_ONLY
inline EXTERN CELL *PtrOfTerm(Term t) {
return (CELL *)(*(CELL *)(t));
}
INLINE_ONLY inline EXTERN Functor FunctorOfTerm(Term);
INLINE_ONLY inline EXTERN Functor FunctorOfTerm(Term t) {
INLINE_ONLY
inline EXTERN Functor FunctorOfTerm(Term t) {
return (Functor)(*RepAppl(t));
}
@ -209,13 +215,15 @@ INLINE_ONLY inline EXTERN Functor FunctorOfTerm(Term t) {
INLINE_ONLY inline EXTERN Term MkAtomTerm(Atom);
INLINE_ONLY inline EXTERN Term MkAtomTerm(Atom a) {
INLINE_ONLY
inline EXTERN Term MkAtomTerm(Atom a) {
return (Term)(AtomTag | (CELL)(a));
}
INLINE_ONLY inline EXTERN Atom AtomOfTerm(Term t);
INLINE_ONLY inline EXTERN Atom AtomOfTerm(Term t) {
INLINE_ONLY
inline EXTERN Atom AtomOfTerm(Term t) {
return (Atom)((~AtomTag & (CELL)(t)));
}
@ -223,13 +231,15 @@ INLINE_ONLY inline EXTERN Atom AtomOfTerm(Term t) {
INLINE_ONLY inline EXTERN Term MkAtomTerm(Atom);
INLINE_ONLY inline EXTERN Term MkAtomTerm(Atom at) {
INLINE_ONLY
inline EXTERN Term MkAtomTerm(Atom at) {
return (Term)(TAGGEDA((CELL)AtomTag, (CELL)(at)));
}
INLINE_ONLY inline EXTERN Atom AtomOfTerm(Term t);
INLINE_ONLY inline EXTERN Atom AtomOfTerm(Term t) {
INLINE_ONLY
inline EXTERN Atom AtomOfTerm(Term t) {
return (Atom)(NonTagPart(t));
}
@ -237,13 +247,15 @@ INLINE_ONLY inline EXTERN Atom AtomOfTerm(Term t) {
INLINE_ONLY inline EXTERN bool IsAtomTerm(Term);
INLINE_ONLY inline EXTERN bool IsAtomTerm(Term t) {
INLINE_ONLY
inline EXTERN bool IsAtomTerm(Term t) {
return CHKTAG((t), AtomTag);
}
INLINE_ONLY inline EXTERN Term MkIntTerm(Int);
INLINE_ONLY inline EXTERN Term MkIntTerm(Int n) {
INLINE_ONLY
inline EXTERN Term MkIntTerm(Int n) {
return (Term)(TAGGED(NumberTag, (n)));
}
@ -254,19 +266,22 @@ INLINE_ONLY inline EXTERN Term MkIntTerm(Int n) {
INLINE_ONLY inline EXTERN Term MkIntConstant(Int);
INLINE_ONLY inline EXTERN Term MkIntConstant(Int n) {
INLINE_ONLY
inline EXTERN Term MkIntConstant(Int n) {
return (Term)(NONTAGGED(NumberTag, (n)));
}
INLINE_ONLY inline EXTERN bool IsIntTerm(Term);
INLINE_ONLY inline EXTERN bool IsIntTerm(Term t) {
INLINE_ONLY
inline EXTERN bool IsIntTerm(Term t) {
return CHKTAG((t), NumberTag);
}
INLINE_ONLY EXTERN inline Term MkPairTerm__(Term head, Term tail USES_REGS);
INLINE_ONLY EXTERN inline Term MkPairTerm__(Term head, Term tail USES_REGS) {
INLINE_ONLY
EXTERN inline Term MkPairTerm__(Term head, Term tail USES_REGS) {
CELL *p = HR;
HR[0] = head;
@ -308,20 +323,23 @@ INLINE_ONLY EXTERN inline Term MkPairTerm__(Term head, Term tail USES_REGS) {
INLINE_ONLY inline EXTERN Term __MkIntegerTerm(Int USES_REGS);
INLINE_ONLY inline EXTERN Term __MkIntegerTerm(Int n USES_REGS) {
INLINE_ONLY
inline EXTERN Term __MkIntegerTerm(Int n USES_REGS) {
return (Term)(IntInBnd(n) ? MkIntTerm(n) : MkLongIntTerm(n));
}
#endif
INLINE_ONLY inline EXTERN bool IsIntegerTerm(Term);
INLINE_ONLY inline EXTERN bool IsIntegerTerm(Term t) {
INLINE_ONLY
inline EXTERN bool IsIntegerTerm(Term t) {
return (int)(IsIntTerm(t) || IsLongIntTerm(t));
}
INLINE_ONLY inline EXTERN Int IntegerOfTerm(Term);
INLINE_ONLY inline EXTERN Int IntegerOfTerm(Term t) {
INLINE_ONLY
inline EXTERN Int IntegerOfTerm(Term t) {
return (Int)(IsIntTerm(t) ? IntOfTerm(t) : LongIntOfTerm(t));
}
@ -332,7 +350,8 @@ INLINE_ONLY inline EXTERN Int IntegerOfTerm(Term t) {
INLINE_ONLY inline EXTERN Term __MkAddressTerm(void *USES_REGS);
INLINE_ONLY inline EXTERN Term __MkAddressTerm(void *n USES_REGS) {
INLINE_ONLY
inline EXTERN Term __MkAddressTerm(void *n USES_REGS) {
return __MkIntegerTerm((Int)n PASS_REGS);
}
@ -340,20 +359,23 @@ INLINE_ONLY inline EXTERN Term __MkAddressTerm(void *n USES_REGS) {
INLINE_ONLY inline EXTERN bool IsAddressTerm(Term);
INLINE_ONLY inline EXTERN bool IsAddressTerm(Term t) {
INLINE_ONLY
inline EXTERN bool IsAddressTerm(Term t) {
return (bool)IsIntegerTerm(t);
}
INLINE_ONLY inline EXTERN void *AddressOfTerm(Term);
INLINE_ONLY inline EXTERN void *AddressOfTerm(Term t) {
INLINE_ONLY
inline EXTERN void *AddressOfTerm(Term t) {
return (void *)(IsIntTerm(t) ? IntOfTerm(t) : LongIntOfTerm(t));
}
INLINE_ONLY inline EXTERN Int IsPairTermOrNil (Term);
INLINE_ONLY inline EXTERN Int
INLINE_ONLY
inline EXTERN Int
IsPairOrNilTerm (Term t)
{
return IsPairTerm(t) || t == TermNil;

View File

@ -33,7 +33,7 @@ typedef void *Atom;
(((CELL)(X) + (sizeof(TYPE) - 1)) & ~(sizeof(TYPE) - 1))
#ifndef EXTERN
#ifdef _MSC_VER
#ifdef MSC_VER
#define EXTERN
#else
#define EXTERN extern
@ -44,51 +44,30 @@ typedef void *Atom;
** and integer types Short and UShort with half the size of a ptr */
#if defined(PRIdPTR)
#define Int_FORMAT "%" PRIdPTR
#define Int_ANYFORMAT "%" PRIuPTR
#define UInt_FORMAT "%" PRIuPTR
#define Int_F PRIdPTR
#define Int_ANYF PRIuPTR
#define UInt_F PRIuPTR
typedef intptr_t Int;
typedef uintptr_t UInt;
#elif defined(_WIN64)
typedef int64_t Int;
typedef uint64_t UInt;
#define Int_FORMAT "%I64d"
#define UInt_FORMAT "%I64u"
#define Int_F "I64d"
#define UInt_F "I64u"
#elif defined(_WIN32)
typedef int32_t Int;
typedef uint32_t UInt;
#define Int_FORMAT "%I32d"
#define UInt_FORMAT "%I32u"
#define Int_F "I32d"
#define UInt_F "I32u"
#elif SIZEOF_LONG_INT == SIZEOF_INT_P
typedef long int Int;
typedef unsigned long int UInt;
#define Int_FORMAT "%ld"
#define UInt_FORMAT "%uld"
#define Int_F "ld"
#define UInt_F "uld"
#elif SIZEOF_INT == SIZEOF_INT_P
typedef int Int;
typedef unsigned int UInt;
#define Int_FORMAT "%l"
#define UInt_FORMAT "%ul"
#define Int_F "l"
#define UInt_F "ul"
#else
#error Yap require integer types of the same size as a pointer
@ -107,6 +86,8 @@ typedef uint32_t BITS32;
#define CellSize sizeof(CELL)
#define SmallSize sizeof(SMALLUNSGN)
#include "YapFormat.h"
/*************************************************************************************************
type casting macros
*************************************************************************************************/

View File

@ -31,6 +31,23 @@
#include "../utf8proc/utf8proc.h"
#include "Yap.h"
#define ReleaseAndReturn(r) \
{ \
pop_text_stack(l); \
return r; \
}
#define release_cut_fail() \
{ \
pop_text_stack(l); \
cut_fail(); \
}
#define release_cut_succeed() \
{ \
pop_text_stack(l); \
cut_succeed(); \
}
/// allocate a temporary text block
///
extern void *Malloc(size_t sz USES_REGS);

View File

@ -13,12 +13,6 @@
* version: $Id: Yapproto.h,v 1.90 2008-08-07 20:51:23 vsc Exp $ *
*************************************************************************/
#if defined(_WIN32)
#define X_API __declspec(dllexport)
#else
#define X_API
#endif
/* prototype file for Yap */
/* absmi.c */
@ -309,6 +303,7 @@ extern struct vfs *Yap_InitAssetManager(void);
/* load_foreign.c */
extern void Yap_InitLoadForeign(void);
extern bool Yap_LateInit(const char s[]);
/* mavar.c */
extern void Yap_InitMaVarCPreds(void);

View File

@ -139,7 +139,7 @@ register struct yami *P1REG asm("bp"); /* can't use yamop before Yap.h */
#include "Yap.h"
#include "clause.h"
#include "eval.h"
#include "YapEval.h"
#ifdef HAVE_STRING_H
#include <string.h>
#endif
@ -2327,6 +2327,8 @@ static inline void prune(choiceptr cp USES_REGS) {
if (POP_CHOICE_POINT(B->cp_b)) {
POP_EXECUTE();
}
if (B->cp_b == NULL)
break;
B = B->cp_b;
}
if (POP_CHOICE_POINT(B->cp_b)) {

View File

@ -11,7 +11,7 @@
#ifndef BLOBS_H
#define BLOBS_H
#ifndef X_API
#if !defined(X_API) && !defined(SWIGYAP)
#if (defined(_MSC_VER) || defined(__MINGW32__)) && defined(PL_KERNEL)
#define X_API __declspec(dllexport)
#else

View File

@ -250,6 +250,8 @@
#define LOCAL_nperm LOCAL->nperm_
#define REMOTE_nperm(wid) REMOTE(wid)->nperm_
#define LOCAL_jMP LOCAL->jMP_
#define REMOTE_jMP(wid) REMOTE(wid)->jMP_
#define LOCAL_LabelFirstArray LOCAL->LabelFirstArray_
#define REMOTE_LabelFirstArray(wid) REMOTE(wid)->LabelFirstArray_

View File

@ -126,7 +126,7 @@ typedef struct worker_local {
ADDR db_vec0_;
struct RB_red_blk_node* db_root_;
struct RB_red_blk_node* db_nil_;
sigjmp_buf gc_restore_;
sigjmp_buf* gc_restore_;
CELL* extra_gc_cells_;
CELL* extra_gc_cells_base_;
CELL* extra_gc_cells_top_;
@ -140,6 +140,7 @@ typedef struct worker_local {
UInt CMemFirstBlockSz_;
// Variable used by the compiler to store number of permanent vars in a clause
int nperm_;
int jMP_;
// Thread Local Area for Labels
Int* LabelFirstArray_;
UInt LabelFirstArraySz_;
@ -166,7 +167,7 @@ typedef struct worker_local {
/* error handling info, designed to be easy to pass to the foreign world */
yap_error_descriptor_t* ActiveError_;
/// pointer to an exception term, from throw
jmp_buf IOBotch_;
jmp_buf* IOBotch_;
TokEntry* tokptr_;
TokEntry* toktide_;
VarEntry* VarTable_;
@ -177,7 +178,7 @@ typedef struct worker_local {
wchar_t* CommentsBuff_;
size_t CommentsBuffPos_;
size_t CommentsBuffLim_;
sigjmp_buf RestartEnv_;
sigjmp_buf* RestartEnv_;
char FileNameBuf_[YAP_FILENAME_MAX+1];
char FileNameBuf2_[YAP_FILENAME_MAX+1];
struct TextBuffer_manager* TextBuffer_;

File diff suppressed because it is too large Load Diff

View File

@ -139,7 +139,8 @@ static void InitWorker(int wid) {
REMOTE_CMemFirstBlock(wid) = NULL;
REMOTE_CMemFirstBlockSz(wid) = 0L;
REMOTE_nperm(wid) = 0L;
REMOTE_nperm(wid) = 0;
REMOTE_jMP(wid) = 0;
REMOTE_LabelFirstArray(wid) = NULL;
REMOTE_LabelFirstArraySz(wid) = 0L;

File diff suppressed because it is too large Load Diff

View File

@ -145,6 +145,7 @@ static void RestoreWorker(int wid USES_REGS) {
#ifdef THREADS
#endif /* THREADS */

File diff suppressed because it is too large Load Diff

View File

@ -38,8 +38,8 @@ typedef enum {
#define low_level_trace(Port, pred, args) low_level_trace__(Port, pred, args)
#endif
void low_level_trace__(yap_low_level_port, PredEntry *, CELL *);
void Yap_InitLowLevelTrace(void);
void toggle_low_level_trace(void);
extern bool low_level_trace__(yap_low_level_port, PredEntry *, CELL *);
extern void Yap_InitLowLevelTrace(void);
extern void toggle_low_level_trace(void);
#endif

View File

@ -1,7 +1,7 @@
#include "Yap.h"
#include "amijit.h"
#include "clause.h"
#include "eval.h"
#include "YapEval.h"
#if HAVE_ERRNO_H
#include <errno.h>
#else

View File

@ -76,16 +76,17 @@ endif (WITH_YAPOR_SBA)
if (WITH_YAPOR)
set_property(DIRECTORY .. APPEND PROPERTY COMPILE_DEFINITIONS YAPOR=1)
set_property(DIRECTORY .. APPEND PROPERTY COMPILE_DEFINITIONS YAPOR=1;YAP_KERNEL=1)
endif ()
set (POSITION_INDEPENDENT_CODE TRUE)
SET_PROPERTY(DIRECTORY PROPERTY COMPILE_DEFINITIONS YAP_KERNEL=1 )
add_component (libOPTYap
${OPTYap_SOURCES} )
MY_set_target_properties(libOPTYap
My_set_target_properties(libOPTYap
PROPERTIES
# RPATH ${libdir} VERSION ${LIBYAPTAI_FULL_VERSION}
# SOVERSION ${LIBYAPTAI_MAJOR_VERSION}.${LIBYAPTAI_MINOR_VERSION}

View File

@ -170,7 +170,7 @@ struct page_statistics {
#define INCREMENT_AUX_STATS(STATS, BYTES, PAGES) \
BYTES += PgEnt_bytes_in_use(STATS)
#define SHOW_PAGE_STATS_MSG(STR_NAME) \
" %s %10" Int_F "s bytes (%ld structs in use)\n", STR_NAME
" %s %10" Int_F "s bytes (%" Sizet_F " ; structs in use)\n", STR_NAME
#define SHOW_PAGE_STATS_ARGS(STATS, STR_TYPE) \
PgEnt_strs_in_use(STATS) * sizeof(STR_TYPE), PgEnt_strs_in_use(STATS)
#endif /* USE_PAGES_MALLOC */

View File

@ -19,7 +19,7 @@
#ifdef TABLING
#include "Yatom.h"
#include "YapHeap.h"
#include "eval.h"
#include "YapEval.h"
#include "tab.macros.h"
static inline sg_node_ptr

View File

@ -38,6 +38,8 @@ ENDIF(WITH_CPLINT)
#must be last
add_subDIRECTORY (packages/python)
OPTION (WITH_SWIG " Enable SWIG interfaces to foreign languages" ON)
IF (WITH_SWIG)
add_subDIRECTORY (packages/swig)
@ -67,7 +69,6 @@ endif()
add_subDIRECTORY (packages/real)
add_subDIRECTORY (packages/python)
add_subDIRECTORY (packages/jpl)

View File

@ -167,13 +167,13 @@ HEADERS = \
H/attvar.h \
H/blobs.h \
H/clause.h \
H/compile.h \
H/YapCöompile.h \
H/corout.h \
H/dlmalloc.h \
H/dglobals.h \
H/dlocals.h \
H/dhstruct.h \
H/eval.h \
H/YapEval.h \
H/heapgc.h \
H/hglobals.h \
H/hlocals.h \

View File

@ -145,30 +145,30 @@ endif (HAVE_LIBDL)
if (WIN32)
check_library_exists(comdlg32 FindText "" HAVE_LIBCOMDLG32)
if (HAVE_LIBCOMDLG32)
#if (HAVE_LIBCOMDLG32)
set(EXTRALIBS ${EXTRALIBS} comdlg32)
endif (HAVE_LIBCOMDLG32)
set(WINDLLS ${WINDLLS} comdlg32)
#endif (HAVE_LIBCOMDLG32)
check_library_exists(msvcrt strtok "" HAVE_LIBMSCRT)
if (HAVE_LIBMSCRT)
set(EXTRALIBS ${EXTRALIBS} mscrt)
endif (HAVE_LIBMSCRT)
#if (HAVE_LIBMSCRT)
set(WINDLLS ${WINDLLS} mscrt)
#endif (HAVE_LIBMSCRT)
check_library_exists(shell32 main "" HAVE_LIBSHELL32)
if (HAVE_LIBSHELL32)
set(EXTRALIBS ${EXTRALIBS} shell32)
endif (HAVE_LIBSHELL32)
#if (HAVE_LIBSHELL32)
set(WINDLLS ${WINDLLS} shell32)
#endif (HAVE_LIBSHELL32)
check_library_exists(wsock32 main "" HAVE_LIBWSOCK32)
if (HAVE_LIBWSOCK32)
set(EXTRALIBS ${EXTRALIBS} wsock32)
endif (HAVE_LIBWSOCK32)
#if (HAVE_LIBWSOCK32)
set(WINDLLS ${WINDLLS} wsock32)
#endif (HAVE_LIBWSOCK32)
check_library_exists(ws2_32 main "" HAVE_LIBWS2_32)
if (HAVE_LIBWS2_32)
set(EXTRALIBS ${EXTRALIBS} ws2_32)
endif (HAVE_LIBWS2_32)
#if (HAVE_LIBWS2_32 OR TRUE)
set(WINDLLS ${WINDLLS} ws2_32)
#endif (HAVE_LIBWS2_32)
endif ()
check_library_exists(judy Judy1Set "" HAVE_LIBJUDY)

View File

@ -17,6 +17,7 @@ site_name( YAP_SITE )
if (WIN32)
set (YAP_ARCH $ENV{PROCESSOR_ARCHITECTURE})
set_property( DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS "MS_WIN64=1" )
set(YAP_SYSTEM_OPTIONS "windows " ${YAP_SYSTEM_OPTIONS})
endif()
if (UNIX)

View File

@ -138,11 +138,11 @@ endif()
set ( includedir "${prefix}/include")
set ( exec_prefix "${prefix}")
set ( libdir "${exec_prefix}/lib")
set ( dlls "${exec_prefix}/lib/Yap")
set ( datadir "${datarootdir}")
set ( mandir "${datarootdir}/man")
set ( bindir "${exec_prefix}/bin")
set ( docdir "${datarootdir}/doc/Yap")
set ( dlls "${exec_prefix}/lib/Yap")
set(YAP_ROOTDIR ${prefix})
@ -164,4 +164,3 @@ set(YAP_ROOTDIR "${prefix}")
include (cudd NO-POLICY-SCOPE)
include (python NO-POLICY-SCOPE)
include (java NO-POLICY-SCOPE)

View File

@ -124,13 +124,13 @@ list(APPEND LIBYAP_SOURCES ${C_INTERFACE_SOURCES} ${ENGINE_SOURCES})
H/attvar.h
H/blobs.h
H/clause.h
H/compile.h
H/YapCompile.h
H/corout.h
H/dlmalloc.h
H/generated/dglobals.h
H/generated/dlocals.h
H/generated/dhstruct.h
H/eval.h
H/YapEval.h
H/heapgc.h
H/generated/hglobals.h
H/generated/hlocals.h

View File

@ -1,40 +1,73 @@
option (WITH_PYTHON
"Allow Python->YAP and YAP->Python" ON)
"Allow Python->YAP and YAP->Python" ON)
# PYTHONLIBS_FOUND - have the Python libs been found
# PYTHON_LIBRARIES - path to the python library
# PYTHON_INCLUDE_PATH - path to where Python.h is found (deprecated)
# PYTHON_INCLUDE_DIRS - path to where Python.h is found
# PYTHON_DEBUG_LIBRARIES - path to the debug library (deprecated)
# PYTHONLIBS_VERSION_STRING - version of the Python libs found (since CMake 2.8.8)
#
#
IF (WITH_PYTHON)
set (Python_ADDITIONAL_VERSIONS 3.5 3.6 3.4 3.3)
#BREW install for Python3
find_package(PythonInterp)
# find_package(PythonLibs)
if (APPLE)
foreach (i 3.6 3.5 3.4 3.3 3.2 3.1 3.0)
set (PYTHON_INCLUDE_DIRS /usr/local/Frameworks/Python.framework/Versions/${i}/Headers)
message("Trying Python ${i}")
if (EXISTS ${PYTHON_INCLUDE_DIRS})
set (PYTHON_EXECUTABLE /usr/local/bin/python${i} CACHE FILEPATH "Path to a program" FORCE )
set (PYTHON_INCLUDE_DIR /usr/local/Frameworks/Python.framework/Versions/${i}/include/python${i}m
CACHE PATH "Path to a file." FORCE )
set (PYTHON_LIBRARY /usr/local/Frameworks/Python.framework/Versions/${i}/lib/libpython${i}.dylib
CACHE FILEPATH "Path to a library" FORCE )
break()
endif()
endforeach()
execute_process ( COMMAND ${PYTHON_EXECUTABLE} -c "import sysconfig; print( sysconfig.get_path( 'include' ) )"
OUTPUT_VARIABLE _ABS_PYTHON_INCLUDE_PATH
OUTPUT_STRIP_TRAILING_WHITESPACE )
get_filename_component ( ABS_PYTHON_INCLUDE_PATH ${_ABS_PYTHON_INCLUDE_PATH} ABSOLUTE )
set ( PYTHON_INCLUDE_DIR
${ABS_PYTHON_INCLUDE_PATH}
CACHE "PATH" "Directory with Python.h "
)
set ( PYTHON_INCLUDE_DIRS
${ABS_PYTHON_INCLUDE_PATH}
CACHE "PATH" "Python.h Dir (Deprecated)"
)
execute_process ( COMMAND ${PYTHON_EXECUTABLE} -c "import sysconfig; print( sysconfig.get_path( 'stdlib' ) )"
OUTPUT_VARIABLE _ABS_PYTHON_SYSLIB_PATH
OUTPUT_STRIP_TRAILING_WHITESPACE )
set( _ABS_PYTHON_SYSLIB_PATH
${_ABS_PYTHON_SYSLIB_PATH}/../${CMAKE_SHARED_LIBRARY_PREFIX}python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}m${CMAKE_SHARED_LIBRARY_SUFFIX} )
message("${_ABS_PYTHON_SYSLIB_PATH}")
get_filename_component ( ABS_PYTHON_SYSLIB_PATH ${_ABS_PYTHON_SYSLIB_PATH} ABSOLUTE )
set ( PYTHON_LIBRARY
${ABS_PYTHON_SYSLIB_PATH}
CACHE "FILEPATH" "Python Library"
)
set ( PYTHON_LIBRARIES
${PYTHON_LIBRARY}
CACHE "FILEPATH" "Python Library (Deprecated)"
)
if ( (EXISTS PYTHON_LIBRARY) AND ( EXISTS ${PYTHON_INCLUDE_DIR}) )
set ( PYTHONLIBS_FOUND ON)
else()
set (Python_ADDITIONAL_VERSIONS 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.8 2.6 2.5)
find_package(PythonLibs)
endif()
find_package(PythonInterp)
find_package(PythonLibs)
macro_log_feature (PYTHONLIBS_FOUND "Python"
"Use Python System"
"http://www.python.org" FALSE)
macro_log_feature (PYTHONLIBS_FOUND "Python"
"Use Python System"
"http://www.python.org" FALSE)
#include_directories( ${PYTHON_INCLUDE_DIRS} )
include_directories( BEFORE ${PYTHON_INCLUDE_DIR} )
LIST( APPEND
CMAKE_REQUIRED_INCLUDES ${PYTHON_INCLUDE_DIR} ${CMAKE_REQUIRED_INCLUDES} )
check_include_file(Python.h HAVE_PYTHON_H)
set( CMAKE_REQUIRED_INCLUDES ${PYTHON_INCLUDE_DIRS} ${CMAKE_REQUIRED_INCLUDES} )
check_include_file(Python.h HAVE_PYTHON_H)
endif(WITH_PYTHON)

View File

@ -2036,5 +2036,30 @@ calls it, or to nothing if 'inline' is not supported under any name. */
#define free(pt) my_free(pt)
#endif
#ifdef _WIN32
#ifndef __WINDOWS__
#define __WINDOWS__ 1
#endif
#endif
/**
* X_API macro
*
* @brief Linux exports all symbols by default, but WIN32 does
* not. cmake can enable exports, using CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS
*
* @param _WIN32
*
* @return
*/
#if _WIN32 && !defined(YAP_KERNEL)
#define X_API __declspec(dllimport)
#else
#define X_API
#endif
#define O_API
#endif

17
configure vendored
View File

@ -28,13 +28,14 @@ BUILD_TYPE="Debug"
PREFIX=/usr/local
LIBDIR=
CMAKE_ARGS=
GENERATOR=""
if [ -e "${TOP_SRCDIR}/.configure-custom.sh" ]; then
. "${TOP_SRCDIR}/.configure-custom.sh"
fi
quote() {
echo "$1" | sed -e "s|'|'\\\\''|g; 1s/^/'/; \$s/\$/'/"
echo "$*" | sed -e "s|'|'\\\\''|g; 1s/^/'/; \$s/\$/'/"
}
extract_var_string() {
@ -163,6 +164,8 @@ print_help() {
--localedir=DIR locale-dependent data [DATAROOTDIR/locale]
--mandir=DIR man documentation [DATAROOTDIR/man]
--docdir=DIR documentation root [DATAROOTDIR/doc/PROJECT_NAME]
--generato=Generator Specify the tool used to send callss
EOF
first=y
@ -288,6 +291,13 @@ while [ $# != 0 ]; do
"--docdir")
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_DOCDIR=$(quote "$2")"; shift;;
"--generator="*)
GENERATOR="$CMAKE_ARGS -G $(1#*=)";;
"-G"|"--generator")
GENERATOR="$CMAKE_ARGS -G$(quote "$2")";
shift;;
"CC="*)
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_C_COMPILER=$(quote "${1#*=}")";;
"CXX="*)
@ -295,7 +305,7 @@ while [ $# != 0 ]; do
"CFLAGS="*)
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_C_FLAGS=$(quote "${1#*=}")";;
"CXXFLAGS="*)
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_CXX_FLAGS=$(quote "${1#*=}")";;
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_CXX_FLAGS=$(quote "${1#*=}")";;
"LDFLAGS="*)
LDFLAGS="$LDFLAGS ${1#*=}";;
@ -362,4 +372,5 @@ if [ "x${LDFLAGS}" != "x" ]; then
fi
CMAKE_CMD="${CMAKE} ${TOP_SRCDIR}"
${CMAKE_CMD} ${TOP_SRCDIR} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${PREFIX} -DCMAKE_INSTALL_LIBDIR=${LIBDIR} ${CMAKE_ARGS}
${CMAKE_CMD} "${GENERATOR}" ${TOP_SRCDIR} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${PREFIX} -DCMAKE_INSTALL_LIBDIR=${LIBDIR} ${CMAKE_ARGS}

46
gtags.conf Normal file
View File

@ -0,0 +1,46 @@
#
# Copyright (c) 1998, 1999, 2000, 2001, 2002, 2003, 2010, 2011, 2013,
# 2015, 2016
# Tama Communications Corporation
#
# This file is part of GNU GLOBAL.
#
# This file is free software; as a special exception the author gives
# unlimited permission to copy and/or distribute it, with or without
# modifications, as long as this notice is preserved.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# *
# Configuration file for GNU GLOBAL source code tag system.
#
# Basically, GLOBAL doesn't need this file ('gtags.conf'), because it has
# default values in itsself. If you have the file as '/etc/gtags.conf' or
# "$HOME/.globalrc" in your system then GLOBAL overwrite the default values
# with the values in the file.
#
# The format is similar to termcap(5). You can specify a target with
# GTAGSLABEL environment variable. Default target is 'default'.
#
# If you want to have a common record for yourself, it is recommended to
# use the following method:
#
common:
:skip=Debug/,Release/,Threads/,mxe/,xcode/,codeblocks/,Qt/,xcode/,android/,compile_commands.json,xml/,YAPDroid/app/build/,YAPDroid/lib/build/:HTML/,HTML.pub/,tags,TAGS,ID,y.tab.c,y.tab.h,gtags.files,cscope.files,cscope.out,cscope.po.out,cscope.in.out,SCCS/,RCS/,CVS/,CVSROOT/,{arch}/,autom4te.cache/,*.orig,*.rej,*.bak,*~,#*#,*.swp,*.tmp,*_flymake.*,*_flymake:
#
# A common map for both Exuberant Ctags and Universal Ctags.
# Don't include definitions of ctagscom and ctagslib in this entry.
#
default:\
yap:native:user:
yap:\
:tc=common:\
:langmap=Prolog\:.pl.yap.ypp.P.prolog:\
:gtags_parser=Prolog\:$ctagslib:

View File

@ -18,7 +18,7 @@ extern "C" {
#endif
//=== includes ===============================================================
#ifdef _YAP_NOT_INSTALLED_
#ifdef YAP_KERNEL
#include "config.h"
#ifdef __cplusplus
@ -26,9 +26,13 @@ extern "C" {
#endif
#if USE_GMP && !defined(__cplusplus)
#if USE_GMP
#if defined(__cplusplus)
#include <gmpxx.h>
#else
#include <gmp.h>
#endif
#endif
#ifdef __cplusplus
extern "C" {
@ -36,12 +40,14 @@ extern "C" {
#include "YapInterface.h"
#else
#include <Yap/src/config.h>
#if USE_GMP
#include <gmp.h>
#endif
#if _YAP_NOT_INSTALLED_
#include <config.h>
#include <YapInterface.h>
#else
#include <Yap/pl/config.h>
#include <Yap/YapInterface.h>
#endif
#endif
#include <stdarg.h>
#include <stddef.h>
#include <wchar.h>
@ -85,35 +91,9 @@ See SWI-Prolog.h, containing the same code for an explanation on this
stuff.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#ifndef _PL_EXPORT_DONE
#define _PL_EXPORT_DONE
#if (defined(__WINDOWS__) || defined(__CYGWIN__) || defined(__MINGW32__)) && !defined(__LCC__)
#define HAVE_DECLSPEC
#endif
#ifdef HAVE_DECLSPEC
# ifdef _YAP_NOT_INSTALLED_
#define PL_EXPORT(type) __declspec(dllexport) type
#define PL_EXPORT_DATA(type) __declspec(dllexport) type
#define install_t void
# else
# ifdef __BORLANDC__
#define PL_EXPORT(type) type _stdcall
#define PL_EXPORT_DATA(type) extern type
# else
#define PL_EXPORT(type) extern type
#define PL_EXPORT_DATA(type) __declspec(dllimport) type
# endif
#define install_t __declspec(dllexport) void
# endif
#else /*HAVE_DECLSPEC*/
#define PL_EXPORT(type) extern type
#define PL_EXPORT_DATA(type) extern type
#define install_t void
#endif /*HAVE_DECLSPEC*/
#endif /*_PL_EXPORT_DONE*/
#define PL_EXPORT(type) extern X_API type
#define PL_EXPORT_DATA(type) extern X_API type
#define install_t O_API void
/*******************************
* GCC ATTRIBUTES *
@ -403,102 +383,101 @@ PL_EXPORT(int) PL_chars_to_term(const char *chars,
#define PL_fail return FALSE /* fail */
#define PL_succeed return TRUE /* success */
extern X_API PL_agc_hook_t PL_agc_hook(PL_agc_hook_t);
extern X_API char* PL_atom_chars(atom_t);
extern X_API char* PL_atom_nchars(atom_t, size_t *);
extern X_API term_t PL_copy_term_ref(term_t);
extern X_API term_t PL_new_term_ref(void);
extern X_API term_t PL_new_term_refs(int);
extern X_API void PL_reset_term_refs(term_t);
PL_EXPORT( PL_agc_hook_t ) PL_agc_hook(PL_agc_hook_t);
PL_EXPORT( char* ) PL_atom_chars(atom_t);
PL_EXPORT( char* ) PL_atom_nchars(atom_t, size_t *);
PL_EXPORT( term_t ) PL_copy_term_ref(term_t);
PL_EXPORT( term_t ) PL_new_term_ref(void);
PL_EXPORT( term_t ) PL_new_term_refs(int);
PL_EXPORT( void ) PL_reset_term_refs(term_t);
/* begin PL_get_* functions =============================*/
extern X_API int PL_get_arg(int, term_t, term_t);
extern X_API int _PL_get_arg(int, term_t, term_t);
extern X_API int PL_get_atom(term_t, atom_t *);
extern X_API int PL_get_atom_chars(term_t, char **);
extern X_API int PL_get_atom_nchars(term_t, size_t *, char **);
extern X_API int PL_get_bool(term_t, int *);
extern X_API int PL_get_chars(term_t, char **, unsigned);
extern X_API int PL_get_nchars(term_t, size_t *, char **, unsigned);
extern X_API int PL_get_wchars(term_t, size_t *, wchar_t **, unsigned);
extern X_API int PL_get_functor(term_t, functor_t *);
extern X_API int PL_get_compound_name_arity(term_t t, atom_t *ap, int *ip);
extern X_API int PL_get_float(term_t, double *);
extern X_API int PL_get_head(term_t, term_t);
extern X_API int PL_get_int64(term_t, int64_t *);
extern X_API int PL_get_integer(term_t, int *);
extern X_API int PL_get_list(term_t, term_t, term_t);
extern X_API int PL_get_long(term_t, long *);
extern X_API int PL_get_list_chars(term_t, char **, unsigned);
extern X_API int PL_get_list_nchars(term_t, size_t *, char **, unsigned);
extern X_API int PL_get_module(term_t, module_t *);
extern X_API module_t PL_context(void);
extern X_API int PL_strip_module(term_t, module_t *, term_t);
extern X_API atom_t PL_module_name(module_t);
extern X_API module_t PL_new_module(atom_t);
extern X_API int PL_get_name_arity(term_t, atom_t *, int *);
extern X_API int PL_get_nil(term_t);
extern X_API int PL_get_pointer(term_t, void **);
extern X_API int PL_get_intptr(term_t, intptr_t *);
extern X_API int PL_get_uintptr(term_t, uintptr_t *);
extern X_API int PL_get_tail(term_t, term_t);
PL_EXPORT( int ) PL_get_arg(int, term_t, term_t);
PL_EXPORT( int ) PL_get_atom(term_t, atom_t *);
PL_EXPORT( int ) PL_get_atom_chars(term_t, char **);
PL_EXPORT( int ) PL_get_atom_nchars(term_t, size_t *, char **);
PL_EXPORT( int ) PL_get_bool(term_t, int *);
PL_EXPORT( int ) PL_get_chars(term_t, char **, unsigned);
PL_EXPORT( int ) PL_get_nchars(term_t, size_t *, char **, unsigned);
PL_EXPORT( int ) PL_get_wchars(term_t, size_t *, wchar_t **, unsigned);
PL_EXPORT( int ) PL_get_functor(term_t, functor_t *);
PL_EXPORT( int ) PL_get_compound_name_arity(term_t t, atom_t *ap, int *ip);
PL_EXPORT( int ) PL_get_float(term_t, double *);
PL_EXPORT( int ) PL_get_head(term_t, term_t);
PL_EXPORT( int ) PL_get_int64(term_t, int64_t *);
PL_EXPORT( int ) PL_get_integer(term_t, int *);
PL_EXPORT( int ) PL_get_list(term_t, term_t, term_t);
PL_EXPORT( int ) PL_get_long(term_t, long *);
PL_EXPORT( int ) PL_get_list_chars(term_t, char **, unsigned);
PL_EXPORT( int ) PL_get_list_nchars(term_t, size_t *, char **, unsigned);
PL_EXPORT( int ) PL_get_module(term_t, module_t *);
PL_EXPORT( module_t ) PL_context(void);
PL_EXPORT( int ) PL_strip_module(term_t, module_t *, term_t);
PL_EXPORT( atom_t ) PL_module_name(module_t);
PL_EXPORT( module_t ) PL_new_module(atom_t);
PL_EXPORT( int ) PL_get_name_arity(term_t, atom_t *, int *);
PL_EXPORT( int ) PL_get_nil(term_t);
PL_EXPORT( int ) PL_get_pointer(term_t, void **);
PL_EXPORT( int ) PL_get_intptr(term_t, intptr_t *);
PL_EXPORT( int ) PL_get_uintptr(term_t, uintptr_t *);
PL_EXPORT( int ) PL_get_tail(term_t, term_t);
/* end PL_get_* functions =============================*/
/* begin PL_new_* functions =============================*/
extern X_API atom_t PL_new_atom(const char *);
extern X_API atom_t PL_new_atom_nchars(size_t, const char *);
extern X_API atom_t PL_new_atom_wchars(size_t, const pl_wchar_t *);
extern X_API char *PL_atom_nchars(atom_t, size_t *);
extern X_API pl_wchar_t *PL_atom_wchars(atom_t, size_t *);
extern X_API functor_t PL_new_functor(atom_t, int);
extern X_API atom_t PL_functor_name(functor_t);
extern X_API int PL_functor_arity(functor_t);
PL_EXPORT( atom_t ) PL_new_atom(const char *);
PL_EXPORT( atom_t ) PL_new_atom_nchars(size_t, const char *);
PL_EXPORT( atom_t ) PL_new_atom_wchars(size_t, const pl_wchar_t *);
PL_EXPORT( char *) PL_atom_nchars(atom_t, size_t *);
PL_EXPORT( pl_wchar_t *) PL_atom_wchars(atom_t, size_t *);
PL_EXPORT( functor_t ) PL_new_functor(atom_t, int);
PL_EXPORT( atom_t ) PL_functor_name(functor_t);
PL_EXPORT( int ) PL_functor_arity(functor_t);
/* end PL_new_* functions =============================*/
/* begin PL_put_* functions =============================*/
extern X_API int PL_cons_functor(term_t, functor_t,...);
extern X_API int PL_cons_functor_v(term_t, functor_t,term_t);
extern X_API int PL_cons_list(term_t, term_t, term_t);
extern X_API int PL_put_atom(term_t, atom_t);
extern X_API int PL_put_atom_chars(term_t, const char *);
extern X_API int PL_put_atom_nchars(term_t, size_t ,const char *);
extern X_API int PL_put_boolean(term_t, uintptr_t);
extern X_API int PL_put_float(term_t, double);
extern X_API int PL_put_functor(term_t, functor_t t);
extern X_API int PL_put_int64(term_t, int64_t);
extern X_API int PL_put_integer(term_t, long);
extern X_API int PL_put_list(term_t);
extern X_API int PL_put_list_chars(term_t, const char *);
extern X_API void PL_put_nil(term_t);
extern X_API int PL_put_pointer(term_t, void *);
extern X_API int PL_put_string_chars(term_t, const char *);
extern X_API int PL_put_string_nchars(term_t, size_t, const char *);
extern X_API int PL_put_term(term_t, term_t);
extern X_API int PL_put_variable(term_t);
extern X_API int PL_put_intptr(term_t t, intptr_t n);
extern X_API int PL_put_uintptr(term_t t, uintptr_t n);
extern X_API int PL_compare(term_t, term_t);
PL_EXPORT( int ) PL_cons_functor(term_t, functor_t,...);
PL_EXPORT( int ) PL_cons_functor_v(term_t, functor_t,term_t);
PL_EXPORT( int ) PL_cons_list(term_t, term_t, term_t);
PL_EXPORT( int ) PL_put_atom(term_t, atom_t);
PL_EXPORT( int ) PL_put_atom_chars(term_t, const char *);
PL_EXPORT( int ) PL_put_atom_nchars(term_t, size_t ,const char *);
PL_EXPORT( int ) PL_put_boolean(term_t, uintptr_t);
PL_EXPORT( int ) PL_put_float(term_t, double);
PL_EXPORT( int ) PL_put_functor(term_t, functor_t t);
PL_EXPORT( int ) PL_put_int64(term_t, int64_t);
PL_EXPORT( int ) PL_put_integer(term_t, long);
PL_EXPORT( int ) PL_put_list(term_t);
PL_EXPORT( int ) PL_put_list_chars(term_t, const char *);
PL_EXPORT( void ) PL_put_nil(term_t);
PL_EXPORT( int ) PL_put_pointer(term_t, void *);
PL_EXPORT( int ) PL_put_string_chars(term_t, const char *);
PL_EXPORT( int ) PL_put_string_nchars(term_t, size_t, const char *);
PL_EXPORT( int ) PL_put_term(term_t, term_t);
PL_EXPORT( int ) PL_put_variable(term_t);
PL_EXPORT( int ) PL_put_intptr(term_t t, intptr_t n);
PL_EXPORT( int ) PL_put_uintptr(term_t t, uintptr_t n);
PL_EXPORT( int ) PL_compare(term_t, term_t);
/* end PL_put_* functions =============================*/
/* begin PL_unify_* functions =============================*/
extern X_API int PL_unify(term_t, term_t);
extern X_API int PL_unify_atom(term_t, atom_t);
extern X_API int PL_unify_arg(int, term_t, term_t);
extern X_API int PL_unify_atom_chars(term_t, const char *);
extern X_API int PL_unify_atom_nchars(term_t, size_t len, const char *);
extern X_API int PL_unify_float(term_t, double);
extern X_API int PL_unify_functor(term_t, functor_t);
extern X_API int PL_unify_int64(term_t, int64_t);
extern X_API int PL_unify_intptr(term_t, intptr_t);
extern X_API int PL_unify_uintptr(term_t, uintptr_t);
extern X_API int PL_unify_integer(term_t, long);
extern X_API int PL_unify_list(term_t, term_t, term_t);
extern X_API int PL_unify_list_chars(term_t, const char *);
extern X_API int PL_unify_list_ncodes(term_t, size_t, const char *);
extern X_API int PL_unify_nil(term_t);
extern X_API int PL_unify_pointer(term_t, void *);
extern X_API int PL_unify_bool(term_t, int);
extern X_API int PL_unify_string_chars(term_t, const char *);
extern X_API int PL_unify_string_nchars(term_t, size_t, const char *);
extern X_API int PL_unify_term(term_t,...);
extern X_API int PL_unify_chars(term_t, int, size_t, const char *);
extern X_API int PL_unify_chars_diff(term_t, term_t, int, size_t, const char *);
PL_EXPORT( int ) PL_unify(term_t, term_t);
PL_EXPORT( int ) PL_unify_atom(term_t, atom_t);
PL_EXPORT( int ) PL_unify_arg(int, term_t, term_t);
PL_EXPORT( int ) PL_unify_atom_chars(term_t, const char *);
PL_EXPORT( int ) PL_unify_atom_nchars(term_t, size_t len, const char *);
PL_EXPORT( int ) PL_unify_float(term_t, double);
PL_EXPORT( int ) PL_unify_functor(term_t, functor_t);
PL_EXPORT( int ) PL_unify_int64(term_t, int64_t);
PL_EXPORT( int ) PL_unify_intptr(term_t, intptr_t);
PL_EXPORT( int ) PL_unify_uintptr(term_t, uintptr_t);
PL_EXPORT( int ) PL_unify_integer(term_t, long);
PL_EXPORT( int ) PL_unify_list(term_t, term_t, term_t);
PL_EXPORT( int ) PL_unify_list_chars(term_t, const char *);
PL_EXPORT( int ) PL_unify_list_ncodes(term_t, size_t, const char *);
PL_EXPORT( int ) PL_unify_nil(term_t);
PL_EXPORT( int ) PL_unify_pointer(term_t, void *);
PL_EXPORT( int ) PL_unify_bool(term_t, int);
PL_EXPORT( int ) PL_unify_string_chars(term_t, const char *);
PL_EXPORT( int ) PL_unify_string_nchars(term_t, size_t, const char *);
PL_EXPORT( int ) PL_unify_term(term_t,...);
PL_EXPORT( int ) PL_unify_chars(term_t, int, size_t, const char *);
PL_EXPORT( int ) PL_unify_chars_diff(term_t, term_t, int, size_t, const char *);
/*******************************
* LISTS *
*******************************/
@ -506,92 +485,92 @@ extern X_API int PL_unify_chars_diff(term_t, term_t, int, size_t, const char *)
PL_EXPORT(int) PL_skip_list(term_t list, term_t tail, size_t *len);
extern X_API int PL_unify_wchars(term_t, int, size_t, const pl_wchar_t *);
extern X_API int PL_unify_wchars_diff(term_t, term_t, int, size_t, const pl_wchar_t *);
extern X_API int PL_chars_to_term(const char *,term_t);
PL_EXPORT( int ) PL_unify_wchars(term_t, int, size_t, const pl_wchar_t *);
PL_EXPORT( int ) PL_unify_wchars_diff(term_t, term_t, int, size_t, const pl_wchar_t *);
PL_EXPORT( int ) PL_chars_to_term(const char *,term_t);
/* begin PL_is_* functions =============================*/
extern X_API int PL_is_atom(term_t);
extern X_API int PL_is_atomic(term_t);
extern X_API int PL_is_compound(term_t);
extern X_API int PL_is_float(term_t);
extern X_API int PL_is_functor(term_t, functor_t);
extern X_API int PL_is_ground(term_t);
extern X_API int PL_is_callable(term_t);
extern X_API int PL_is_integer(term_t);
extern X_API int PL_is_pair(term_t);
extern X_API int PL_is_list(term_t);
extern X_API int PL_is_pair(term_t);
extern X_API int PL_is_number(term_t);
extern X_API int PL_is_string(term_t);
extern X_API int PL_is_variable(term_t);
extern X_API int PL_term_type(term_t);
extern X_API int PL_is_inf(term_t);
extern X_API int PL_is_acyclic(term_t t);
PL_EXPORT( int ) PL_is_atom(term_t);
PL_EXPORT( int ) PL_is_atomic(term_t);
PL_EXPORT( int ) PL_is_compound(term_t);
PL_EXPORT( int ) PL_is_float(term_t);
PL_EXPORT( int ) PL_is_functor(term_t, functor_t);
PL_EXPORT( int ) PL_is_ground(term_t);
PL_EXPORT( int ) PL_is_callable(term_t);
PL_EXPORT( int ) PL_is_integer(term_t);
PL_EXPORT( int ) PL_is_pair(term_t);
PL_EXPORT( int ) PL_is_list(term_t);
PL_EXPORT( int ) PL_is_pair(term_t);
PL_EXPORT( int ) PL_is_number(term_t);
PL_EXPORT( int ) PL_is_string(term_t);
PL_EXPORT( int ) PL_is_variable(term_t);
PL_EXPORT( int ) PL_term_type(term_t);
PL_EXPORT( int ) PL_is_inf(term_t);
PL_EXPORT( int ) PL_is_acyclic(term_t t);
/* end PL_is_* functions =============================*/
extern X_API void PL_halt(int);
extern X_API int PL_initialise(int, char **);
extern X_API int PL_is_initialised(int *, char ***);
extern X_API void PL_close_foreign_frame(fid_t);
extern X_API void PL_discard_foreign_frame(fid_t);
extern X_API void PL_rewind_foreign_frame(fid_t);
extern X_API fid_t PL_open_foreign_frame(void);
extern X_API int PL_raise_exception(term_t);
extern X_API int PL_throw(term_t);
extern X_API void PL_clear_exception(void);
extern X_API void PL_register_atom(atom_t);
extern X_API void PL_unregister_atom(atom_t);
extern X_API predicate_t PL_pred(functor_t, module_t);
extern X_API predicate_t PL_predicate(const char *, int, const char *);
PL_EXPORT( void ) PL_halt(int);
PL_EXPORT( int ) PL_initialise(int, char **);
PL_EXPORT( int ) PL_is_initialised(int *, char ***);
PL_EXPORT( void ) PL_close_foreign_frame(fid_t);
PL_EXPORT( void ) PL_discard_foreign_frame(fid_t);
PL_EXPORT( void ) PL_rewind_foreign_frame(fid_t);
PL_EXPORT( fid_t ) PL_open_foreign_frame(void);
PL_EXPORT( int ) PL_raise_exception(term_t);
PL_EXPORT( int ) PL_throw(term_t);
PL_EXPORT( void ) PL_clear_exception(void);
PL_EXPORT( void ) PL_register_atom(atom_t);
PL_EXPORT( void ) PL_unregister_atom(atom_t);
PL_EXPORT( predicate_t ) PL_pred(functor_t, module_t);
PL_EXPORT( predicate_t ) PL_predicate(const char *, int, const char *);
#define GP_NAMEARITY 0x100 /* or'ed mask */
extern X_API int PL_unify_predicate(term_t head, predicate_t pred, int how);
extern X_API void PL_predicate_info(predicate_t, atom_t *, int *, module_t *);
extern X_API qid_t PL_open_query(module_t, int, predicate_t, term_t);
extern X_API int PL_next_solution(qid_t);
extern X_API void PL_cut_query(qid_t);
extern X_API void PL_close_query(qid_t);
extern X_API int PL_toplevel(void);
extern X_API term_t PL_exception(qid_t);
extern X_API term_t PL_exception(qid_t);
extern X_API int PL_call_predicate(module_t, int, predicate_t, term_t);
extern X_API int PL_call(term_t, module_t);
extern X_API void PL_register_foreign(const char *, int, pl_function_t, int);
extern X_API void PL_register_foreign_in_module(const char *, const char *, int, pl_function_t, int);
extern X_API void PL_register_extensions(const PL_extension *);
extern X_API void PL_register_extensions_in_module(const char *module, const PL_extension *);
extern X_API void PL_load_extensions(const PL_extension *);
extern X_API int PL_handle_signals(void);
extern X_API int PL_thread_self(void);
extern X_API int PL_unify_thread_id(term_t, int);
extern X_API int PL_thread_attach_engine(const PL_thread_attr_t *);
extern X_API int PL_thread_destroy_engine(void);
extern X_API int PL_thread_at_exit(void (*)(void *), void *, int);
extern X_API int PL_thread_raise(int tid, int sig);
extern X_API PL_engine_t PL_create_engine(const PL_thread_attr_t *);
extern X_API int PL_destroy_engine(PL_engine_t);
extern X_API int PL_set_engine(PL_engine_t,PL_engine_t *);
extern X_API int PL_get_string(term_t, char **, size_t *);
extern X_API int PL_get_string_chars(term_t, char **, size_t *);
extern X_API record_t PL_record(term_t);
extern X_API int PL_recorded(record_t, term_t);
extern X_API record_t PL_duplicate_record(record_t);
extern X_API void PL_erase(record_t);
PL_EXPORT( int ) PL_unify_predicate(term_t head, predicate_t pred, int how);
PL_EXPORT( void ) PL_predicate_info(predicate_t, atom_t *, int *, module_t *);
PL_EXPORT( qid_t ) PL_open_query(module_t, int, predicate_t, term_t);
PL_EXPORT( int ) PL_next_solution(qid_t);
PL_EXPORT( void ) PL_cut_query(qid_t);
PL_EXPORT( void ) PL_close_query(qid_t);
PL_EXPORT( int ) PL_toplevel(void);
PL_EXPORT( term_t ) PL_exception(qid_t);
PL_EXPORT( term_t ) PL_exception(qid_t);
PL_EXPORT( int ) PL_call_predicate(module_t, int, predicate_t, term_t);
PL_EXPORT( int ) PL_call(term_t, module_t);
PL_EXPORT( void ) PL_register_foreign(const char *, int, pl_function_t, int);
PL_EXPORT( void ) PL_register_foreign_in_module(const char *, const char *, int, pl_function_t, int);
PL_EXPORT( void ) PL_register_extensions(const PL_extension *);
PL_EXPORT( void ) PL_register_extensions_in_module(const char *module, const PL_extension *);
PL_EXPORT( void ) PL_load_extensions(const PL_extension *);
PL_EXPORT( int ) PL_handle_signals(void);
PL_EXPORT( int ) PL_thread_self(void);
PL_EXPORT( int ) PL_unify_thread_id(term_t, int);
PL_EXPORT( int ) PL_thread_attach_engine(const PL_thread_attr_t *);
PL_EXPORT( int ) PL_thread_destroy_engine(void);
PL_EXPORT( int ) PL_thread_at_exit(void (*)(void *), void *, int);
PL_EXPORT( int ) PL_thread_raise(int tid, int sig);
PL_EXPORT( PL_engine_t ) PL_create_engine(const PL_thread_attr_t *);
PL_EXPORT( int ) PL_destroy_engine(PL_engine_t);
PL_EXPORT( int ) PL_set_engine(PL_engine_t,PL_engine_t *);
PL_EXPORT( int ) PL_get_string(term_t, char **, size_t *);
PL_EXPORT( int ) PL_get_string_chars(term_t, char **, size_t *);
PL_EXPORT( record_t ) PL_record(term_t);
PL_EXPORT( int ) PL_recorded(record_t, term_t);
PL_EXPORT( record_t ) PL_duplicate_record(record_t);
PL_EXPORT( void ) PL_erase(record_t);
/* only partial implementation, does not guarantee export between different architectures and versions of YAP */
extern X_API char *PL_record_external(term_t, size_t *);
extern X_API int PL_recorded_external(const char *, term_t);
extern X_API int PL_erase_external(char *);
extern X_API int PL_action(int,...);
extern X_API void PL_on_halt(int (*)(int, void *), void *);
extern X_API void *PL_malloc(size_t);
extern X_API void *PL_malloc_uncollectable(size_t s);
extern X_API void *PL_realloc(void*,size_t);
extern X_API void PL_free(void *);
extern X_API int PL_eval_expression_to_int64_ex(term_t t, int64_t *val);
extern X_API void PL_cleanup_fork(void);
extern X_API int PL_get_signum_ex(term_t sig, int *n);
PL_EXPORT( char *) PL_record_external(term_t, size_t *);
PL_EXPORT( int ) PL_recorded_external(const char *, term_t);
PL_EXPORT( int ) PL_erase_external(char *);
PL_EXPORT( int ) PL_action(int,...);
PL_EXPORT( void ) PL_on_halt(int (*)(int, void *), void *);
PL_EXPORT( void *) PL_malloc(size_t);
PL_EXPORT( void *) PL_malloc_uncollectable(size_t s);
PL_EXPORT( void *) PL_realloc(void*,size_t);
PL_EXPORT( void ) PL_free(void *);
PL_EXPORT( int ) PL_eval_expression_to_int64_ex(term_t t, int64_t *val);
PL_EXPORT( void ) PL_cleanup_fork(void);
PL_EXPORT( int ) PL_get_signum_ex(term_t sig, int *n);
extern X_API size_t PL_utf8_strlen(const char *s, size_t len);
PL_EXPORT( size_t ) PL_utf8_strlen(const char *s, size_t len);
extern X_API int PL_unify_list_codes(term_t l, const char *chars);
PL_EXPORT( int ) PL_unify_list_codes(term_t l, const char *chas);
@ -607,8 +586,6 @@ extern X_API void PL_fatal_error(const char *msg);
extern X_API int Sprintf(const char * fm,...);
extern X_API int Sdprintf(const char *,...);
extern X_API char *PL_prompt_string(int fd);
/*******************************
* FILENAME SUPPORT *
*******************************/

View File

@ -23,8 +23,12 @@
#ifdef _WIN32
#include <stdint.h>
typedef uintptr_t uid_t;
typedef uintptr_t gid_t;
#ifndef uid_t
#define uid_t int
#endif
#ifndef gid_t
#define gid_t int
#endif
#endif
typedef struct {

View File

@ -42,7 +42,11 @@ struct yami *Yap_Error__(const char *file, const char *function, int lineno,
yap_error_number err, YAP_Term wheret, ...);
void Yap_ThrowError__(const char *file, const char *function, int lineno,
yap_error_number err, YAP_Term wheret, ...) __attribute__ ((noreturn));
yap_error_number err, YAP_Term wheret, ...)
#ifndef MSC_VER
__attribute__ ((noreturn))
#endif
;
#define Yap_NilError(id, ...) \

61
include/YapFormat.h Normal file
View File

@ -0,0 +1,61 @@
#ifndef YAP_FORMAT
#if defined(_WIN64)
typedef int64_t Int;
typedef uint64_t UInt;
#define Int_FORMAT "%I64d"
#define UInt_FORMAT "%I64u"
#define Int_F "I64d"
#define UInt_F "I64u"
#define UXInt_F "I64xu"
#define Sizet_F "Id"
#elif defined(_WIN32)
typedef int32_t Int;
typedef uint32_t UInt;
#define Int_FORMAT "%I32d"
#define UInt_FORMAT "%I32u"
#define Int_F "I32d"
#define UInt_F "I32u"
#define UInt_FORMAT "%I32u"
#define UXInt_FORMAT "%I32xu"
#define Sizet_F "Id"
#elif defined(PRIdPTR)
#define Int_FORMAT "%" PRIdPTR
#define Int_ANYFORMAT "%" PRIuPTR
#define UInt_FORMAT "%" PRIuPTR
#define Int_F PRIdPTR
#define Int_ANYF PRIuPTR
#define UInt_F PRIuPTR
#define UXInt_F PRIxPTR
#define Sizet_F "zd"
#elif SIZEOF_LONG_INT == SIZEOF_INT_P
typedef long int Int;
typedef unsigned long int UInt;
#define Int_FORMAT "%ld"
#define UInt_FORMAT "%uld"
#define Int_F "ld"
#define UInt_F "uld"
#define UXInt_F "ulxd"
#define Sizet_F "uld"
#elif SIZEOF_INT == SIZEOF_INT_P
typedef int Int;
typedef unsigned int UInt;
#define Int_FORMAT "%l"
#define UInt_FORMAT "%ul"
#define Int_F "l"
#define UInt_F "ul"
#define UXInt_F "uld"
#define Sizet_F "ux"
#endif
#endif

View File

@ -72,50 +72,9 @@ __BEGIN_DECLS
*
* @return
*/
#if defined(_WIN32)
#if YAP_H
#define X_API __declspec(dllexport)
#else
#define X_API __declspec(dllimport)
#endif
#else
#define X_API
#endif
#ifndef Int_FORMAT
#include "YapFormat.h"
#ifdef PRIdPTR
#define Int_FORMAT "%" PRIdPTR
#elif _WIN64
#define Int_FORMAT "%I64d"
#elif _WIN32
#define Int_FORMAT "%I32d"
#else
#define Int_FORMAT "%ld"
#endif
#ifdef PRIiPTR
#define Int_ANYFORMAT "%" PRIiPTR
#elif _WIN64
#define Int_ANYFORMAT "%I64i"
#elif _WIN32
#define Int_ANYFORMAT "%I32i"
#else
#define Int_ANYFORMAT "%li"
#endif
#ifdef PRIuPTR
#define UInt_FORMAT "%" PRIuPTR
#elif _WIN64
#define UInt_FORMAT "%I64ud"
#elif _WIN32
#define UInt_FORMAT "%I32ud"
#else
#define UInt_FORMAT "%lu"
#endif
/* portable form of formatted output for Prolog terms */
#endif
/* Primitive Functions */
@ -173,6 +132,9 @@ extern X_API YAP_Bool YAP_IsDbRefTerm(YAP_Term);
/* YAP_Bool IsAtomTerm(YAP_Term) */
extern X_API YAP_Bool YAP_IsAtomTerm(YAP_Term);
/* YAP_Bool IsAtomTerm(YAP_Term) */
extern X_API YAP_Bool YAP_IsStringTerm(YAP_Term);
/* YAP_Bool IsPairTerm(YAP_Term) */
extern X_API YAP_Bool YAP_IsPairTerm(YAP_Term);
@ -185,12 +147,24 @@ extern X_API YAP_Bool YAP_IsCompoundTerm(YAP_Term);
/* Term MkIntTerm(YAP_Int) */
extern X_API YAP_Term YAP_MkIntTerm(YAP_Int);
/* Term MkIntTerm(YAP_Int) */
extern X_API YAP_Term YAP_MkStringTerm(const char *);
/* Term MkIntTerm(YAP_Int) */
extern X_API YAP_Term YAP_MkUnsignedStringTerm(const unsigned char *);
/* Term MkBigNumTerm(void *) */
extern X_API YAP_Term YAP_MkBigNumTerm(void *);
/* Term MkRationalTerm(void *) */
extern X_API YAP_Term YAP_MkRationalTerm(void *);
/* YAP_Int IntOfTerm(Term) */
extern X_API const unsigned char *YAP_UnsignedStringOfTerm(YAP_Term);
/* YAP_Int StribgOfTerm(Term) */
extern X_API const char *YAP_StringOfTerm(YAP_Term);
/* YAP_Int IntOfTerm(Term) */
extern X_API YAP_Int YAP_IntOfTerm(YAP_Term);

View File

@ -36,7 +36,9 @@ static char SccsId[] = "%W% %G%";
#define ALIASES_BLOCK_SIZE 8
#if _WIN32
#ifndef USE_SOCKET
#define USE_SOCKET 1
#endif
#define HAVE_SOCKET 1
#endif

View File

@ -17,7 +17,6 @@ string(TIMESTAMP YAP_TIMESTAMP)
string( SUBSTRING ${CMAKE_SHARED_LIBRARY_SUFFIX} 1 -1 SO_EXT )
set_property(DIRECTORY PROPERTY CXX_STANDARD 11)
# rpath stuff, hopefully it works

View File

@ -13,6 +13,8 @@ MY_set_target_properties(libswi
POSITION_INDEPENDENT_CODE ON
)
SET_PROPERTY(DIRECTORY PROPERTY COMPILE_DEFINITIONS YAP_KERNEL=1 )
include_directories (../../../H ../.../../include ../os ${CMAKE_BINARY_DIR} ${GMP_INCLUDE_DIR})
set (YAP_SWILIB $<TARGET_FILE_NAME:libswi> )

View File

@ -29,8 +29,8 @@ Moyle. All rights reserved.
#include <wchar.h>
#include <Yap.h>
#include <YapEval.h>
#include <Yatom.h>
#include <eval.h>
#include "swi.h"
#include <YapHeap.h>
@ -216,6 +216,7 @@ X_API int PL_get_nchars(term_t l, size_t *lengthp, char **s, unsigned flags) {
if (flags & BUF_MALLOC) {
out.type |= YAP_STRING_MALLOC;
out.val.c = NULL;
}
if (lengthp) {
out.type |= YAP_STRING_NCHARS;
@ -245,6 +246,7 @@ int PL_get_wchars(term_t l, size_t *lengthp, wchar_t **s, unsigned flags) {
out.type = YAP_STRING_WCHARS;
if (flags & BUF_MALLOC) {
out.type |= YAP_STRING_MALLOC;
out.val.c = NULL;
}
if (lengthp) {
out.type |= YAP_STRING_NCHARS;
@ -278,9 +280,7 @@ X_API int PL_unify_chars(term_t l, int flags, size_t length, const char *s) {
} else if (flags & PL_CHAR_LIST) {
out.type = YAP_STRING_ATOMS;
}
if (length != (size_t)-1) {
out.max = length;
}
if (!Yap_CVT_Text(&inp, &out PASS_REGS))
return 0L;
return Yap_unify(Yap_GetFromSlot(l), out.val.t);
@ -345,8 +345,7 @@ X_API term_t PL_new_term_refs(int n) {
*/
X_API void PL_reset_term_refs(term_t after) {
CACHE_REGS
term_t new = Yap_NewSlots(1);
Yap_RecoverSlots(after - new, new);
LOCAL_CurSlot = after;
}
/** @}
@ -629,9 +628,17 @@ X_API int PL_get_atom_chars(term_t ts, char **a) /* SAM check type */
{
CACHE_REGS
Term t = Yap_GetFromSlot(ts);
if (!IsAtomTerm(t))
char *src;
if (!IsAtomTerm(t)) {
return 0;
*a = RepAtom(AtomOfTerm(t))->StrOfAE;
}
src = (char *)RepAtom(AtomOfTerm(t))->StrOfAE;
if (!a)
return 0;
if (*a && *a != src)
strcpy(*a, src);
else
*a = src;
return 1;
}
@ -644,10 +651,14 @@ X_API int PL_get_atom_nchars(term_t ts, size_t *len,
{
CACHE_REGS
Term t = Yap_GetFromSlot(ts);
if (!IsAtomTerm(t))
if (!IsAtomTerm(t)) {
return 0;
*s = RepAtom(AtomOfTerm(t))->StrOfAE;
}
if (s)
*s = (char*)RepAtom(AtomOfTerm(t))->StrOfAE;
if (len) {
*len = strlen(*s);
}
return 1;
}
@ -800,7 +811,7 @@ X_API int PL_unify_bool(term_t t, int a) {
#if USE_GMP
/*******************************
* GMP *
* GMP *
*******************************/
X_API int PL_get_mpz(term_t t, mpz_t mpz) {

View File

@ -29,7 +29,7 @@
#ifdef __YAP_PROLOG__
#include "Yatom.h"
#include "pl-ctype.h"
#include "eval.h"
#include "YapEval.h"
#else
#include "os/pl-ctype.h"
#endif

View File

@ -82,6 +82,7 @@ if (MPI_C_FOUND)
install(TARGETS yap_mpi
LIBRARY DESTINATION ${dlls}
RUNTIME DESTINATION ${dlls}
ARCHIVE DESTINATION ${dlls}
)

View File

@ -78,7 +78,7 @@ extern int GLOBAL_argc;
static hashtable requests=NULL;
static hashtable broadcasts=NULL;
void init_mpi(void);
X_API void init_mpi(void);
/********************************************************************
* Time accounting
@ -1003,7 +1003,7 @@ mpi_default_buffer_size(void)
/********************************************************************
* Init
*******************************************************************/
void
X_API void
init_mpi(void) {
requests=new_hashtable(HASHSIZE);

View File

@ -17,7 +17,7 @@ if (MATLAB_FOUND)
target_link_libraries(matlab libYap $(MATLAB_LIBRARIES) )
install(TARGETS matlab
LIBRARY DESTINATION ${dlls}
RUNTIME DESTINATION ${dlls}
ARCHIVE DESTINATION ${dlls} )
endif (MATLAB_FOUND)

View File

@ -6,7 +6,8 @@ target_link_libraries(matrix libYap)
set_target_properties (matrix PROPERTIES PREFIX "")
install(TARGETS matrix
LIBRARY DESTINATION ${dlls}
RUNTIME DESTINATION ${dlls}
ARCHIVE DESTINATION ${dlls}
LIBRARY DESTINATION ${dlls}
)

View File

@ -3244,9 +3244,9 @@ is_matrix(void)
return TRUE;
}
void init_matrix( void );
X_API void init_matrix( void );
void
X_API void
init_matrix(void)
{
AtomC = YAP_LookupAtom("c");

View File

@ -22,7 +22,7 @@
#include <windows.h>
#endif
void init_random( void );
X_API void init_random( void );
static short a1 = 27314, b1 = 9213, c1 = 17773;
@ -59,7 +59,7 @@ p_getrand(void)
YAP_Unify(YAP_ARG3,YAP_MkIntTerm(c1)));
}
void
X_API void
init_random(void)
{
YAP_UserCPredicate("random", p_random, 1);

View File

@ -1,17 +1,23 @@
set ( REGEX_SOURCES
set ( REGEX_INCLUDES
cclass.h
cname.h
collate.h
utils.h
yapregex.h
engine.c
)
set ( REGEX_SOURCES
regcomp.c
regerror.c
regexec.c
regfree.c
)
INCLUDE_DIRECTORIES(BEFORE
.
)
add_library (regexp SHARED regexp.c ${REGEX_SOURCES})
target_link_libraries(regexp libYap)
@ -19,6 +25,7 @@ target_link_libraries(regexp libYap)
set_target_properties (regexp PROPERTIES PREFIX "")
install(TARGETS regexp
LIBRARY DESTINATION ${dlls}
LIBRARY DESTINATION ${libdir}
RUNTIME DESTINATION ${dlls}
ARCHIVE DESTINATION ${dlls} )

View File

@ -52,7 +52,7 @@ static char sccsid[] = "@(#)regexec.c 8.3 (Berkeley) 3/20/94";
#ifndef HAVE_REGEXEC
#include "c_interface.h"
#include "YapInterface.h"
#if HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
@ -68,8 +68,8 @@ static char sccsid[] = "@(#)regexec.c 8.3 (Berkeley) 3/20/94";
#include <limits.h>
#endif
#include "regex2.h"
#include "utils.h"
#include "regex2.h"
#include "yapregex.h"
#if used

File diff suppressed because it is too large Load Diff

View File

@ -41,7 +41,8 @@ set_target_properties (sys PROPERTIES PREFIX "")
endif()
MY_install(TARGETS sys
LIBRARY DESTINATION ${dlls}
ARCHIVE DESTINATION ${dlls} )
LIBRARY DESTINATION ${dlls}
RUNTIME DESTINATION ${dlls}
ARCHIVE DESTINATION ${dlls} )
configure_file ("sys_config.h.cmake" "sys_config.h" )

View File

@ -85,7 +85,7 @@
#include <android/log.h>
#endif
void init_sys(void);
X_API void init_sys(void);
#if defined(__MINGW32__) || _MSC_VER
static YAP_Term WinError(void) {
@ -1034,7 +1034,7 @@ static YAP_Bool error_message(void) {
return YAP_Unify(YAP_ARG2, YAP_ARG1);
#endif
}
void init_sys(void) {
X_API void init_sys(void) {
#if HAVE_MKTIME
tzset();
#endif

View File

@ -1,3 +1,4 @@
set (CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
set ( TRIES_SOURCES
core_tries.c
@ -12,7 +13,8 @@ target_link_libraries(tries libYap)
set_target_properties (tries PROPERTIES PREFIX "")
install(TARGETS tries
LIBRARY DESTINATION ${dlls}
LIBRARY DESTINATION ${dlls}
RUNTIME DESTINATION ${dlls}
ARCHIVE DESTINATION ${dlls})
@ -22,6 +24,9 @@ set ( ITRIES_SOURCES
itries.c
)
if (ANDROID OR WIN32)
add_component ( otries ${TRIES_SOURCES} )
endif()
add_library (itries SHARED ${ITRIES_SOURCES})
target_link_libraries(itries libYap)
@ -29,6 +34,7 @@ target_link_libraries(itries libYap)
set_target_properties (itries PROPERTIES PREFIX "")
install(TARGETS itries
LIBRARY DESTINATION ${dlls}
LIBRARY DESTINATION ${dlls}
RUNTIME DESTINATION ${dlls}
ARCHIVE DESTINATION ${dlls} )

View File

@ -843,7 +843,7 @@ int traverse_get_counter(TrNode node) {
YAP_Term generate_label(YAP_Int Index) {
char label[20];
sprintf(label,"L%ld", Index);
sprintf(label,"L%" Int_F, Index);
return YAP_MkAtomTerm(YAP_LookupAtom(label));
}
@ -1004,7 +1004,7 @@ YAP_Int core_db_trie_get_optimization_level_count(YAP_Int opt_level) {
void displaynode(TrNode node) {
if (node != NULL) {
if (IS_HASH_NODE(node))
printf("HASH n%i, b%i, p%li\n", TrHash_num_nodes((TrHash) node), TrHash_num_buckets((TrHash) node), (long) node);
printf("HASH n%i, b%i, p%p\n", TrHash_num_nodes((TrHash) node), TrHash_num_buckets((TrHash) node), node);
else if (TrNode_entry(node) == PairInitTag)
printf("PairInitTag\n");
else if (TrNode_entry(node) == PairEndTag)
@ -1012,7 +1012,7 @@ void displaynode(TrNode node) {
else if (IS_FUNCTOR_NODE(node))
printf("functor(%s)\n", YAP_AtomName(YAP_NameOfFunctor((YAP_Functor)( ~ApplTag & TrNode_entry(node)))));
else if (YAP_IsIntTerm(TrNode_entry(node)))
printf("int(%ld)\n", YAP_IntOfTerm(TrNode_entry(node)));
printf("int(%"Int_F")\n", YAP_IntOfTerm(TrNode_entry(node)));
else if (YAP_IsAtomTerm(TrNode_entry(node)))
printf("atom(%s)\n", YAP_AtomName(YAP_AtomOfTerm(TrNode_entry(node))));
else
@ -1040,7 +1040,7 @@ void displayterm(YAP_Term term) {
else if (YAP_IsApplTerm(term))
printf("functor(%s)\n", YAP_AtomName(YAP_NameOfFunctor((YAP_Functor)( ~ApplTag & term))));
else if (YAP_IsIntTerm(term))
printf("int(%ld)\n", YAP_IntOfTerm(term));
printf("int(%"Int_F")\n", YAP_IntOfTerm(term));
else if (YAP_IsAtomTerm(term))
printf("atom(%s)\n", YAP_AtomName(YAP_AtomOfTerm(term)));
else
@ -1070,7 +1070,7 @@ void display_trie_inner(TrNode node) {
void trie_display_node(TrNode node) {
if (node != NULL) {
if (IS_HASH_NODE(node))
printf("HASH(n%i, b%i, p%li), ", TrHash_num_nodes((TrHash) node), TrHash_num_buckets((TrHash) node), (long) node);
printf("HASH(n%i, b%i, p%p), ", TrHash_num_nodes((TrHash) node), TrHash_num_buckets((TrHash) node), node);
else if (TrNode_entry(node) == PairInitTag)
printf("PairInitTag, ");
else if (TrNode_entry(node) == PairEndTag)
@ -1078,7 +1078,7 @@ void trie_display_node(TrNode node) {
else if (IS_FUNCTOR_NODE(node))
printf("functor(%s), ", YAP_AtomName(YAP_NameOfFunctor((YAP_Functor)( ~ApplTag & TrNode_entry(node)))));
else if (YAP_IsIntTerm(TrNode_entry(node)))
printf("int(%ld), ", YAP_IntOfTerm(TrNode_entry(node)));
printf("int(%" Int_F"), ", YAP_IntOfTerm(TrNode_entry(node)));
else if (YAP_IsAtomTerm(TrNode_entry(node)))
printf("atom(%s), ", YAP_AtomName(YAP_AtomOfTerm(TrNode_entry(node))));
else

View File

@ -31,7 +31,7 @@ typedef struct {
/* Procedures */
/* -------------------------- */
void init_tries(void);
O_API void init_tries(void);
static YAP_Bool p_trie_open(void);
static YAP_Bool p_trie_close(void);
static YAP_Bool p_trie_close_all(void);
@ -87,7 +87,7 @@ static YAP_Bool p_print_trie(void);
/* Module Init Procedure */
/* -------------------------- */
void init_tries(void) {
O_API void init_tries(void) {
trie_init_module();
YAP_UserCPredicate("trie_open", p_trie_open, 1);
@ -955,3 +955,27 @@ static YAP_Bool p_trie_db_opt_min_prefix(void) {
return FALSE;
}
#undef min_prefix
#ifdef _WIN32
#include <windows.h>
int WINAPI win_tries(HANDLE, DWORD, LPVOID);
int WINAPI win_tries(HANDLE hinst, DWORD reason, LPVOID reserved)
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return 1;
}
#endif

View File

@ -12,7 +12,7 @@
:- yap_flag(write_strings,on).
main :-
warning(Warning),
warning(Warning),
file_filter_with_init('H/ATOMS','H/generated/tatoms.h',gen_fields, Warning, ['tatoms.h']),
file_filter_with_init('H/ATOMS','H/generated/iatoms.h',gen_decl, Warning, ['iatoms.h']),
file_filter_with_init('H/ATOMS','H/generated/ratoms.h',gen_rcov, Warning, ['ratoms.h']).
@ -23,13 +23,13 @@ gen_fields(Inp,Out) :-
split_unquoted(Inp," ",["A",Atom,_,_]), !,
( Atom = [C|_], code_type(C, alpha), Atom \= "Trail"
->
append(["EXTERNAL Atom Atom",Atom,"; EXTERNAL Term Term",Atom,";"], Out)
append(["X_API EXTERNAL Atom Atom",Atom,"; X_API EXTERNAL Term Term",Atom,";"], Out)
;
append(["EXTERNAL Atom Atom",Atom,";"], Out)
append(["X_API EXTERNAL Atom Atom",Atom,";"], Out)
).
gen_fields(Inp,Out) :-
split_unquoted(Inp," ",["F",Name,_,_]), !,
append(["EXTERNAL Functor Functor",Name,";\n"],Out).
append(["X_API EXTERNAL Functor Functor",Name,";\n"],Out).
gen_rcov(Inp,Out) :-
split_unquoted(Inp," ",["A",Atom,_,_]), !,

13
misc/mktags Normal file
View File

@ -0,0 +1,13 @@
# etags
/bin/rm -f TAGS
find . -name '*.c' | xargs etags -a -Q
find . -name '*.h' | xargs etags -a -Q
find . -name '*.pl' | xargs etags -a -Q -lprolog
find . -name '*.yap' | xargs etags -a -Q -lprolog
find . -name '*.cxx' | xargs etags -a -Q
find . -name '*.hh' | xargs etags -a -Q
find . -name '*.py' | xargs etags -a -Q

View File

@ -38,7 +38,9 @@ set (YAPOS_HEADERS
include_directories (../H ../include ../OPTYap . ${GMP_INCLUDE_DIR} ${PROJECT_BINARY_DIR})
set (POSITION_INDEPENDENT_CODE TRUE)
SET_PROPERTY(DIRECTORY PROPERTY COMPILE_DEFINITIONS YAP_KERNEL=1 )
set (POSITION_INDEPENDENT_CODE TRUE)
add_component (libYAPOs
${YAPOS_SOURCES}

View File

@ -30,7 +30,7 @@ static char SccsId[] = "%W% %G%";
#include "YapHeap.h"
#include "YapText.h"
#include "Yatom.h"
#include "eval.h"
#include "YapEval.h"
#include "yapio.h"
#include <stdlib.h>
#if HAVE_STDARG_H
@ -500,33 +500,40 @@ static void reset_regs(TokEntry *tokstart, FEnv *fe) {
static Term get_variables(FEnv *fe, TokEntry *tokstart) {
CACHE_REGS
Term v;
jmp_buf j;
LOCAL_IOBotch = &j;
if (fe->vp) {
while (true) {
fe->old_H = HR;
if (setjmp(LOCAL_IOBotch) == 0) {
if (setjmp(j) == 0) {
if ((v = Yap_Variables(LOCAL_VarTable, TermNil))) {
fe->old_H = HR;
return v;
LOCAL_IOBotch = NULL;
return v;
}
} else {
reset_regs(tokstart, fe);
}
}
}
LOCAL_IOBotch = NULL;
return 0;
}
static Term get_varnames(FEnv *fe, TokEntry *tokstart) {
CACHE_REGS
Term v;
jmp_buf j;
LOCAL_IOBotch = &j;
if (fe->np) {
while (true) {
fe->old_H = HR;
if (setjmp(LOCAL_IOBotch) == 0) {
if (setjmp(j) == 0) {
if ((v = Yap_VarNames(LOCAL_VarTable, TermNil))) {
fe->old_H = HR;
LOCAL_IOBotch = NULL;
return v;
}
} else {
@ -534,24 +541,30 @@ static Term get_varnames(FEnv *fe, TokEntry *tokstart) {
}
}
}
LOCAL_IOBotch = NULL;
return 0;
}
static Term get_singletons(FEnv *fe, TokEntry *tokstart) {
CACHE_REGS
Term v;
jmp_buf j;
LOCAL_IOBotch = &j;
if (fe->sp) {
while (TRUE) {
fe->old_H = HR;
if (setjmp(LOCAL_IOBotch) == 0) {
if ((v = Yap_Singletons(LOCAL_VarTable, TermNil)))
return v;
if (setjmp(j) == 0) {
if ((v = Yap_Singletons(LOCAL_VarTable, TermNil))) {
LOCAL_IOBotch = NULL;
return v;
}
} else {
reset_regs(tokstart, fe);
}
}
}
LOCAL_IOBotch = NULL;
return 0;
}
@ -580,19 +593,24 @@ static void warn_singletons(FEnv *fe, TokEntry *tokstart) {
static Term get_stream_position(FEnv *fe, TokEntry *tokstart) {
CACHE_REGS
Term v;
jmp_buf j;
LOCAL_IOBotch = &j;
if (fe->tp) {
while (true) {
fe->old_H = HR;
if (setjmp(LOCAL_IOBotch) == 0) {
if ((v = CurrentPositionToTerm()))
if (setjmp(j) == 0) {
if ((v = CurrentPositionToTerm())) {
LOCAL_IOBotch = NULL;
return v;
}
} else {
reset_regs(tokstart, fe);
}
}
}
return 0;
LOCAL_IOBotch = NULL;
return 0;
}
static bool complete_processing(FEnv *fe, TokEntry *tokstart) {

129
os/time.c
View File

@ -142,18 +142,23 @@ void Yap_systime_interval(Int *now, Int *interval) {
#include <time.h>
static FILETIME StartOfTimes, last_time;
typedef union {
FILETIME f;
__int64 t;
} win64_time_t;
static FILETIME StartOfTimes_sys, last_time_sys;
static win64_time_t StartOfTimes, last_time;
static win64_time_t StartOfTimes_sys, last_time_sys;
static clock_t TimesStartOfTimes, Times_last_time;
/* store user time in this variable */
void Yap_InitTime(int wid) {
HANDLE hProcess = GetCurrentProcess();
FILETIME CreationTime, ExitTime, KernelTime, UserTime;
if (!GetProcessTimes(hProcess, &CreationTime, &ExitTime, &KernelTime,
&UserTime)) {
win64_time_t CreationTime, ExitTime, KernelTime, UserTime;
if (!GetProcessTimes(hProcess, &CreationTime.f, &ExitTime.f, &KernelTime.f,
&UserTime.f)) {
/* WIN98 */
clock_t t;
t = clock();
@ -161,125 +166,89 @@ void Yap_InitTime(int wid) {
} else {
#if THREADS
REMOTE_ThreadHandle(wid).start_of_timesp =
(struct _FILETIME *)malloc(sizeof(FILETIME));
(struct _win64_time_t *)malloc(sizeof(win64_time_t));
REMOTE_ThreadHandle(wid).last_timep =
(struct _FILETIME *)malloc(sizeof(FILETIME));
(struct _win64_time_t *)malloc(sizeof(win64_time_t));
REMOTE_ThreadHandle(wid).start_of_times_sysp =
(struct _FILETIME *)malloc(sizeof(FILETIME));
(struct _win64_time_t *)malloc(sizeof(win64_time_t));
REMOTE_ThreadHandle(wid).last_time_sysp =
(struct _FILETIME *)malloc(sizeof(FILETIME));
(*REMOTE_ThreadHandle(wid).last_timep).dwLowDateTime =
(struct _win64_time_t *)malloc(sizeof(win64_time_t));
(*REMOTE_ThreadHandle(wid).last_timep).f.dwLowDateTime =
UserTime.dwLowDateTime;
(*REMOTE_ThreadHandle(wid).last_timep).dwHighDateTime =
UserTime.dwHighDateTime;
(*REMOTE_ThreadHandle(wid).start_of_timesp).dwLowDateTime =
(*REMOTE_ThreadHandle(wid).start_of_timesp).f.dwLowDateTime =
UserTime.dwLowDateTime;
(*REMOTE_ThreadHandle(wid).start_of_timesp).dwHighDateTime =
(*REMOTE_ThreadHandle(wid).start_of_timesp).f.dwHighDateTime =
UserTime.dwHighDateTime;
(*REMOTE_ThreadHandle(wid).last_time_sysp).dwLowDateTime =
(*REMOTE_ThreadHandle(wid).last_time_sysp).f.dwLowDateTime =
KernelTime.dwLowDateTime;
(*REMOTE_ThreadHandle(wid).last_time_sysp).dwHighDateTime =
(*REMOTE_ThreadHandle(wid).last_time_sysp).f.dwHighDateTime =
KernelTime.dwHighDateTime;
(*REMOTE_ThreadHandle(wid).start_of_times_sysp).dwLowDateTime =
(*REMOTE_ThreadHandle(wid).start_of_times_sysp).f.dwLowDateTime =
KernelTime.dwLowDateTime;
(*REMOTE_ThreadHandle(wid).start_of_times_sysp).dwHighDateTime =
(*REMOTE_ThreadHandle(wid).start_of_times_sysp).f.dwHighDateTime =
KernelTime.dwHighDateTime;
#else
last_time.dwLowDateTime = UserTime.dwLowDateTime;
last_time.dwHighDateTime = UserTime.dwHighDateTime;
StartOfTimes.dwLowDateTime = UserTime.dwLowDateTime;
StartOfTimes.dwHighDateTime = UserTime.dwHighDateTime;
last_time_sys.dwLowDateTime = KernelTime.dwLowDateTime;
last_time_sys.dwHighDateTime = KernelTime.dwHighDateTime;
StartOfTimes_sys.dwLowDateTime = KernelTime.dwLowDateTime;
StartOfTimes_sys.dwHighDateTime = KernelTime.dwHighDateTime;
last_time.f.dwLowDateTime = UserTime.f.dwLowDateTime;
last_time.f.dwHighDateTime = UserTime.f.dwHighDateTime;
StartOfTimes.f.dwLowDateTime = UserTime.f.dwLowDateTime;
StartOfTimes.f.dwHighDateTime = UserTime.f.dwHighDateTime;
last_time_sys.f.dwLowDateTime = KernelTime.f.dwLowDateTime;
last_time_sys.f.dwHighDateTime = KernelTime.f.dwHighDateTime;
StartOfTimes_sys.f.dwLowDateTime = KernelTime.f.dwLowDateTime;
StartOfTimes_sys.f.dwHighDateTime = KernelTime.f.dwHighDateTime;
#endif
}
}
#ifdef __GNUC__
static unsigned long long int sub_utime(FILETIME t1, FILETIME t2) {
ULARGE_INTEGER u[2];
memcpy((void *)u, (void *)&t1, sizeof(FILETIME));
memcpy((void *)(u + 1), (void *)&t2, sizeof(FILETIME));
return u[0].QuadPart - u[1].QuadPart;
}
#endif
UInt Yap_cputime(void) {
HANDLE hProcess = GetCurrentProcess();
FILETIME CreationTime, ExitTime, KernelTime, UserTime;
if (!GetProcessTimes(hProcess, &CreationTime, &ExitTime, &KernelTime,
&UserTime)) {
win64_time_t CreationTime, ExitTime, KernelTime, UserTime;
if (!GetProcessTimes(hProcess, &CreationTime.f, & ExitTime.f, &KernelTime.f,
&UserTime.f)) {
clock_t t;
t = clock();
return (((t - TimesStartOfTimes) * 1000) / CLOCKS_PER_SEC);
} else {
#ifdef __GNUC__
unsigned long long int t = sub_utime(UserTime, StartOfTimes);
do_div(t, 10000);
return ((Int)t);
#endif
#ifdef _MSC_VER
__int64 t = *(__int64 *)&UserTime - *(__int64 *)&StartOfTimes;
__int64 t = UserTime.t - StartOfTimes.t;
return ((Int)(t / 10000));
#endif
}
}
void Yap_cputime_interval(Int *now, Int *interval) {
HANDLE hProcess = GetCurrentProcess();
FILETIME CreationTime, ExitTime, KernelTime, UserTime;
if (!GetProcessTimes(hProcess, &CreationTime, &ExitTime, &KernelTime,
&UserTime)) {
win64_time_t CreationTime, ExitTime, KernelTime, UserTime;
if (!GetProcessTimes(hProcess, &CreationTime.f, & ExitTime.f, &KernelTime.f,
&UserTime.f)) {
clock_t t;
t = clock();
*now = ((t - TimesStartOfTimes) * 1000) / CLOCKS_PER_SEC;
*interval = (t - Times_last_time) * 1000 / CLOCKS_PER_SEC;
Times_last_time = t;
} else {
#ifdef __GNUC__
unsigned long long int t1 = sub_utime(UserTime, StartOfTimes);
unsigned long long int t2 = sub_utime(UserTime, last_time);
do_div(t1, 10000);
*now = (Int)t1;
do_div(t2, 10000);
*interval = (Int)t2;
#endif
#ifdef _MSC_VER
__int64 t1 = *(__int64 *)&UserTime - *(__int64 *)&StartOfTimes;
__int64 t2 = *(__int64 *)&UserTime - *(__int64 *)&last_time;
__int64 t1 = UserTime.t - StartOfTimes.t;
__int64 t2 = UserTime.t - last_time.t;
*now = (Int)(t1 / 10000);
*interval = (Int)(t2 / 10000);
#endif
last_time.dwLowDateTime = UserTime.dwLowDateTime;
last_time.dwHighDateTime = UserTime.dwHighDateTime;
last_time.f.dwLowDateTime = UserTime.f.dwLowDateTime;
last_time.f.dwHighDateTime = UserTime.f.dwHighDateTime;
}
}
void Yap_systime_interval(Int *now, Int *interval) {
HANDLE hProcess = GetCurrentProcess();
FILETIME CreationTime, ExitTime, KernelTime, UserTime;
if (!GetProcessTimes(hProcess, &CreationTime, &ExitTime, &KernelTime,
&UserTime)) {
win64_time_t CreationTime, ExitTime, KernelTime, UserTime;
if (!GetProcessTimes(hProcess, &CreationTime.f, &ExitTime.f, &KernelTime.f,
&UserTime.f)) {
*now = *interval = 0; /* not available */
} else {
#ifdef __GNUC__
unsigned long long int t1 = sub_utime(KernelTime, StartOfTimes_sys);
unsigned long long int t2 = sub_utime(KernelTime, last_time_sys);
do_div(t1, 10000);
*now = (Int)t1;
do_div(t2, 10000);
*interval = (Int)t2;
#endif
#ifdef _MSC_VER
__int64 t1 = *(__int64 *)&KernelTime - *(__int64 *)&StartOfTimes_sys;
__int64 t2 = *(__int64 *)&KernelTime - *(__int64 *)&last_time_sys;
__int64 t1 = KernelTime.t - StartOfTimes_sys.t;
__int64 t2 = KernelTime.t - last_time_sys.t;
*now = (Int)(t1 / 10000);
*interval = (Int)(t2 / 10000);
#endif
last_time_sys.dwLowDateTime = KernelTime.dwLowDateTime;
last_time_sys.dwHighDateTime = KernelTime.dwHighDateTime;
last_time_sys.f.dwLowDateTime = KernelTime.f.dwLowDateTime;
last_time_sys.f.dwHighDateTime = KernelTime.f.dwHighDateTime;
}
}
@ -376,9 +345,9 @@ static void InitTime(int wid) {
struct timeval tp;
gettimeofday(&tp, NULL);
(*REMOTE_ThreadHandle(wid).last_timep).tv_sec =
(*REMOTE_ThreadHandle(wid).last_timep).f.tv_sec =
(*REMOTE_ThreadHandle.start_of_timesp(wid)).tv_sec = tp.tv_sec;
(*REMOTE_ThreadHandle(wid).last_timep).tv_usec =
(*REMOTE_ThreadHandle(wid).last_timep).f.tv_usec =
(*REMOTE_ThreadHandle.start_of_timesp(wid)).tv_usec = tp.tv_usec;
}

View File

@ -28,7 +28,7 @@ static char SccsId[] = "%W% %G%";
#include "Yatom.h"
#include "YapHeap.h"
#include "yapio.h"
#include "eval.h"
#include "YapEval.h"
#include "YapText.h"
#include <stdlib.h>
#if HAVE_STDARG_H

62
packages/CMakeLists.txt Normal file
View File

@ -0,0 +1,62 @@
#TODO: change macro_log_feature to check both WITH_{$name} and ${name}_FOUND
#TODO: improve FindGecode.cmake to be similar to other Find*.cmake
#CHECK: GECODE
macro_optional_find_package (Gecode ON)
macro_log_feature (GECODE_FOUND "libgecode"
"Use Generic Constraint Development Environment (GECODE) library"
"http://www.gecode.org" FALSE)
if (GECODE_FOUND)
#DEFINES:
# GECODE_INCLUDE_DIR
# GECODE_VERSION
# GECODE_LIBRARIES
#set (EXTRALIBS gecode)
string(SUBSTRING ${GECODE_VERSION} 0 1 GECODE_MAJOR )
set (GECODE_SOURCES gecode${GECODE_MAJOR}_yap.cc
gecode${GECODE_MAJOR}-common.icc
${GECODE_VERSION}/gecode_yap_cc_impl_auto_generated.icc
${GECODE_VERSION}/gecode_yap_cc_init_auto_generated.icc
${GECODE_VERSION}/gecode_yap_cc_forward_auto_generated.icc
disjunctor.icc
disjunctor.hh )
add_custom_target (gecodeyap ALL DEPENDS gecode${GECODE_MAJOR}_yap_hand_written.yap ${GECODE_VERSION}/gecode_yap_auto_generated.yap gecode_yap
) # WORKING_DIRECTORY ${CMAKE_BINARY_DIR} )
# create a startup.yss on the top directory.
add_custom_command (TARGET gecodeyap
COMMAND cat ${CMAKE_CURRENT_SOURCE_DIR}/gecode${GECODE_MAJOR}_yap_hand_written.yap ${CMAKE_CURRENT_SOURCE_DIR}/${GECODE_VERSION}/gecode_yap_auto_generated.yap > gecode.yap
VERBATIM
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)
add_library (gecode_yap SHARED ${GECODE_SOURCES})
target_link_libraries(gecode_yap libYap ${GECODE_LIBRARIES})
set_target_properties (gecode_yap PROPERTIES PREFIX "")
include_directories (${GECODE_INCLUDE_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/${GECODE_VERSION})
install(TARGETS gecode_yap
LIBRARY DESTINATION ${dlls}
RUNTIME DESTINATION ${dlls}
ARCHIVE DESTINATION ${dlls}
)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/gecode.yap
DESTINATION ${libpl}
)
install(FILES clpfd.yap
DESTINATION ${libpl}/gecode
)
endif (GECODE_FOUND)

84
packages/Makefile.in Normal file
View File

@ -0,0 +1,84 @@
#
# default base directory for YAP installation
# (EROOT for architecture-dependent files)
#
prefix = @prefix@
exec_prefix = @exec_prefix@
ROOTDIR = $(prefix)
EROOTDIR = @exec_prefix@
abs_top_builddir = @abs_top_builddir@
#
# where the binary should be
#
BINDIR = $(EROOTDIR)/bin
#
# where YAP should look for libraries
#
LIBDIR=@libdir@
YAPLIBDIR=@libdir@/Yap
#
# where YAP should look for architecture-independent Prolog libraries
#
SHAREDIR=$(ROOTDIR)/share
#
#
CXX=@CXX@
CXXFLAGS= @SHLIB_CXXFLAGS@ $(YAP_EXTRAS) $(DEFS) -I. -I$(srcdir) -I../.. -I$(srcdir)/../../include -I$(srcdir)/../../os -I @GECODE_INCLUDES@
#
#
# You shouldn't need to change what follows.
#
INSTALL=@INSTALL@
INSTALL_DATA=@INSTALL_DATA@
INSTALL_PROGRAM=@INSTALL_PROGRAM@
SHELL=/bin/sh
RANLIB=@RANLIB@
srcdir=@srcdir@
SO=@SO@
#4.1VPATH=@srcdir@:@srcdir@/OPTYap
CWD=$(PWD)
#
OBJS=gecode_yap.o
SOBJS=gecode_yap.@SO@
GECODE_VERSION = @GECODE_VERSION@
DISJUNCTOR = -DDISJUNCTOR
GECODE_LIBS = @GECODE_EXTRALIBS@
GECODE_MAJOR = @GECODE_MAJOR@
all: $(SOBJS) gecode.yap
gecode_yap.o: \
$(srcdir)/gecode$(GECODE_MAJOR)_yap.cc \
$(srcdir)/gecode$(GECODE_MAJOR)-common.icc \
$(srcdir)/$(GECODE_VERSION)/gecode_yap_cc_impl_auto_generated.icc \
$(srcdir)/$(GECODE_VERSION)/gecode_yap_cc_init_auto_generated.icc \
$(srcdir)/$(GECODE_VERSION)/gecode_yap_cc_forward_auto_generated.icc \
$(srcdir)/disjunctor.icc \
$(srcdir)/disjunctor.hh
$(CXX) -c -I$(srcdir)/$(GECODE_VERSION) $(CXXFLAGS) $(DISJUNCTOR) -o $@ $<
@DO_SECOND_LD@gecode_yap.@SO@: gecode_yap.o
@DO_SECOND_LD@ @SHLIB_CXX_LD@ -o gecode_yap.@SO@ gecode_yap.o $(LDFLAGS) $(GECODE_LIBS) @EXTRA_LIBS_FOR_DLLS@
gecode.yap: $(srcdir)/gecode$(GECODE_MAJOR)_yap_hand_written.yap $(srcdir)/$(GECODE_VERSION)/gecode_yap_auto_generated.yap
cat $^ > $@
.PHONY: all clean install
clean:
-rm -f *.o $(SOBJS) *~ gecode.yap
distclean:
-rm -f $(SOBJS) Makefile
install: all install-examples
mkdir -p $(DESTDIR)$(YAPLIBDIR)
mkdir -p $(DESTDIR)$(SHAREDIR)/Yap
mkdir -p $(DESTDIR)$(SHAREDIR)/Yap/gecode
$(INSTALL_PROGRAM) $(SOBJS) $(DESTDIR)$(YAPLIBDIR)
$(INSTALL) gecode.yap $(DESTDIR)$(SHAREDIR)/Yap
$(INSTALL) $(srcdir)/clpfd.yap $(DESTDIR)$(SHAREDIR)/Yap/gecode
install-examples:

12
packages/README Normal file
View File

@ -0,0 +1,12 @@
Development of gecode/yap takes place in:
git@github.com:denys-duchier/yap-6.3.git
which tracks the official yap repository and is also regularly pulled into it.
see:
https://github.com/denys-duchier/yap-6.3
Enquiries/bug reports can be made either on the yap mailing list or to the
author denys.duchier /AT/ univ-orleans.fr.
What litle documentation there is can be found in file DOC.txt.

View File

@ -51,7 +51,8 @@ IF (CUDD_FOUND)
set(YAP_SYSTEM_OPTIONS "cudd " ${YAP_SYSTEM_OPTIONS} PARENT_SCOPE)
install(TARGETS cudd
LIBRARY DESTINATION ${dlls}
LIBRARY DESTINATION ${dlls}
RUNTIME DESTINATION ${dlls}
ARCHIVE DESTINATION ${dlls}
)

View File

@ -6,7 +6,7 @@ This library provides an interface to the BDD package CUDD. It requires
CUDD compiled as a dynamic library. In Linux this is available out of
box in Fedora, but can easily be ported to other Linux
distributions. CUDD is available in the ports OSX package, and in
cygwin. To use it, call
cygwin. To use it, call
~~~~~
:-use_module(library(bdd))`.
@ -15,7 +15,7 @@ cygwin. To use it, call
The following predicates construct a BDD:
\toc
*/
:- module(bdd, [
@ -24,12 +24,12 @@ The following predicates construct a BDD:
bdd_from_list/3,
mtbdd_new/2,
mtbdd_new/3,
bdd_eval/2,
mtbdd_eval/2,
bdd_eval/2,
mtbdd_eval/2,
bdd_tree/2,
bdd_size/2,
bdd_print/2,
bdd_print/3,
bdd_print/2,
bdd_print/3,
bdd_to_probability_sum_product/2,
bdd_to_probability_sum_product/3,
bdd_reorder/2,
@ -50,7 +50,7 @@ tell_warning :-
:- catch(load_foreign_files([cudd], [], init_cudd),_,fail) -> true ; tell_warning.
/**
@pred bdd_new(? _Exp_, - _BddHandle_)
@pred bdd_new(? _Exp_, - _BddHandle_)
create a new BDD from the logical expression _Exp_. The expression
may include:
@ -93,7 +93,7 @@ bdd_new(T, Bdd) :-
bdd_new(T, Vars, Bdd).
/**
@pred bdd_new(? _Exp_, +_Vars_, - _BddHandle_)
@pred bdd_new(? _Exp_, +_Vars_, - _BddHandle_)
Same as bdd_new/2, but receives a term of the form
`vs(V1,....,Vn)`. This allows incremental construction of BDDs.
@ -104,11 +104,21 @@ bdd_new(T, Vars, cudd(M,X,VS,TrueVars)) :-
VS =.. [vs|TrueVars],
findall(Manager-Cudd, set_bdd(T, VS, Manager, Cudd), [M-X]).
/** @pred bdd_from_list(? _List_, ?_Vars_, - _BddHandle_)
set_bdd(T, VS, Manager, Cudd) :-
numbervars(VS,0,_),
( ground(T)
->
term_to_cudd(T,Manager,Cudd)
;
writeln(throw(error(instantiation_error,T)))
).
/** @pred bdd_from_list(? _List_, ?_Vars_, - _BddHandle_)
Convert a _List_ of logical expressions of the form above, that
includes the set of free variables _Vars_, into a BDD accessible
through _BddHandle_.
through _BddHandle_.
*/
% create a new BDD from a list.
bdd_from_list(List, Vars, cudd(M,X,VS,TrueVars)) :-
@ -116,15 +126,6 @@ bdd_from_list(List, Vars, cudd(M,X,VS,TrueVars)) :-
VS =.. [vs|TrueVars],
findall(Manager-Cudd, set_bdd_from_list(List, VS, Manager, Cudd), [M-X]).
set_bdd(T, VS, Manager, Cudd) :-
numbervars(VS,0,_),
( ground(T)
->
term_to_cudd(T,Manager,Cudd)
;
writeln(throw(error(instantiation_error,T)))
).
set_bdd_from_list(T0, VS, Manager, Cudd) :-
numbervars(VS,0,_),
generate_releases(T0, Manager, T),
@ -133,7 +134,7 @@ set_bdd_from_list(T0, VS, Manager, Cudd) :-
list_to_cudd(T,Manager,_Cudd0,Cudd).
generate_releases(T0, Manager, T) :-
rb_empty(RB0),
rb_empty(RB0),
reverse(T0, [H|R]),
add_releases(R, RB0, [H], Manager, T).
@ -190,7 +191,7 @@ list_to_cudd([(V=Tree)|T], Manager, _Cudd0, CuddF) :-
V = cudd(Cudd),
list_to_cudd(T, Manager, Cudd, CuddF).
/** @pred mtbdd_new(? _Exp_, - _BddHandle_)
/** @pred mtbdd_new(? _Exp_, - _BddHandle_)
create a new algebraic decision diagram (ADD) from the logical
expression _Exp_. The expression may include:
@ -207,7 +208,7 @@ sum
subtraction
+ or( _X_, _Y_), _X_ \/ _Y_
logical or
*/
mtbdd_new(T, Mtbdd) :-
term_variables(T, Vars),
@ -218,15 +219,15 @@ mtbdd_new(T, Vars, add(M,X,VS,Vars)) :-
functor(VS,vs,Sz),
findall(Manager-Cudd, (numbervars(VS,0,_),term_to_add(T,Sz,Manager,Cudd)), [M-X]).
/** @pred bdd_eval(+ _BDDHandle_, _Val_)
/** @pred bdd_eval(+ _BDDHandle_, _Val_)
Unify _Val_ with the value of the logical expression compiled in
_BDDHandle_ given an assignment to its variables.
~~~~~
bdd_new(X+(Y+X)*(-Z), BDD),
[X,Y,Z] = [0,0,0],
bdd_eval(BDD, V),
bdd_new(X+(Y+X)*(-Z), BDD),
[X,Y,Z] = [0,0,0],
bdd_eval(BDD, V),
writeln(V).
~~~~~
would write 0 in the standard output stream.
@ -249,7 +250,7 @@ computing the disjunction of the two cases and binding the output
variable. The top node gives the full expression value. Notice that
`(1- _X_)` implements negation.
*/
bdd_eval(cudd(M, X, Vars, _), Val) :-
cudd_eval(M, X, Vars, Val).
@ -260,15 +261,15 @@ mtbdd_eval(add(M,X, Vars, _), Val) :-
add_eval(M, X, Vars, Val).
% get the BDD as a Prolog list from the CUDD C object
/** @pred bdd_tree(+ _BDDHandle_, _Term_)
/** @pred bdd_tree(+ _BDDHandle_, _Term_)
Convert the BDD or ADD represented by _BDDHandle_ to a Prolog term
of the form `bdd( _Dir_, _Nodes_, _Vars_)` or `mtbdd( _Nodes_, _Vars_)`, respectively. The arguments are:
+
+
_Dir_ direction of the BDD, usually 1
+
_Nodes_ list of nodes in the BDD or ADD.
+
_Nodes_ list of nodes in the BDD or ADD.
In a BDD nodes may be <tt>pp</tt> (both terminals are positive) or <tt>pn</tt>
(right-hand-side is negative), and have four arguments: a logical
@ -277,7 +278,7 @@ variable corresponding to the node, a logical variable, a 0 or a 1 with
the value of the left-hand side, and a logical variable, a 0 or a 1
with the right-hand side.
+
+
_Vars_ are the free variables in the original BDD, or the parameters of the BDD/ADD.
As an example, the BDD for the expression `X+(Y+X)\*(-Z)` becomes:
@ -286,19 +287,19 @@ As an example, the BDD for the expression `X+(Y+X)\*(-Z)` becomes:
bdd(1,[pn(N2,X,1,N1),pp(N1,Y,N0,1),pn(N0,Z,1,1)],vs(X,Y,Z))
~~~~~
*/
bdd_tree(cudd(M, X, Vars, _Vs), bdd(Dir, List, Vars)) :-
cudd_to_term(M, X, Vars, Dir, List).
bdd_tree(add(M, X, Vars, _), mtbdd(Tree, Vars)) :-
add_to_term(M, X, Vars, Tree).
/** @pred bdd_to_probability_sum_product(+ _BDDHandle_, - _Prob_)
/** @pred bdd_to_probability_sum_product(+ _BDDHandle_, - _Prob_)
Each node in a BDD is given a probability _Pi_. The total
probability of a corresponding sum-product network is _Prob_.
*/
bdd_to_probability_sum_product(cudd(M,X,_,Probs), Prob) :-
cudd_to_probability_sum_product(M, X, Probs, Prob).
@ -323,13 +324,13 @@ eval_prob(pp(P,X,L,R), _, P) :-
eval_prob(pn(P,X,L,R), _, P) :-
P is X * L + (1-X) * (1-R).
~~~~~
*/
bdd_to_probability_sum_product(cudd(M,X,_,_Probs), Probs, Prob) :-
cudd_to_probability_sum_product(M, X, Probs, Prob).
/** @pred bdd_close( _BDDHandle_)
/** @pred bdd_close( _BDDHandle_)
close the BDD and release any resources it holds.
@ -339,7 +340,7 @@ bdd_close(cudd(M,_,_Vars, _)) :-
bdd_close(add(M,_,_Vars, _)) :-
cudd_die(M).
/** @pred bdd_close( _BDDHandle_)
/** @pred bdd_close( _BDDHandle_)
close the BDD and release any resources it holds.
@ -347,22 +348,22 @@ bdd_close(add(M,_,_Vars, _)) :-
bdd_reorder(cudd(M,Top,_Vars, _), How) :-
cudd_reorder(M, Top,How).
/** @pred bdd_size(+ _BDDHandle_, - _Size_)
/** @pred bdd_size(+ _BDDHandle_, - _Size_)
Unify _Size_ with the number of nodes in _BDDHandle_.
*/
bdd_size(cudd(M,Top,_Vars, _), Sz) :-
cudd_size(M,Top,Sz).
bdd_size(add(M,Top,_Vars, _), Sz) :-
cudd_size(M,Top,Sz).
/** @pred bdd_print(+ _BDDHandle_, + _File_)
/** @pred bdd_print(+ _BDDHandle_, + _File_)
Output bdd _BDDHandle_ as a dot file to _File_.
*/
bdd_print(cudd(M,Top,_Vars, _), File) :-
absolute_file_name(File, AFile, []),
@ -374,11 +375,11 @@ bdd_print(add(M,Top,_Vars, _), File) :-
bdd_print(cudd(M,Top, Vars, _), File, Names) :-
Vars =.. [_|LVars],
%trace,
maplist( fetch_name(Names), LVars, Ss),
maplist( fetch_name(Names), LVars, Ss),
absolute_file_name(File, AFile, []),
cudd_print(M, Top, AFile, Ss).
bdd_print(add(M,Top, Vars, _), File, Names) :-
Vars =.. [_|LVars],
Vars =.. [_|LVars],
maplist( fetch_name(Names), LVars, Ss),
absolute_file_name(File, AFile, []),
cudd_print(M, Top, AFile, Ss).
@ -398,7 +399,7 @@ bdd_to_sp(bdd(Dir, Tree, _Vars, IVars), Binds, Prob) :-
sp(Dir, Tree, Vars, Vars, P) :-
run_sp(Tree),
fetch(Tree, Dir, P).
fetch(Tree, Dir, P).
run_sp([]).
run_sp(pp(P,X,L,R).Tree) :-

View File

@ -33,9 +33,10 @@ extract_vars((_-V).MapList, V.Vs) :-
extract_vars(MapList, Vs).
complex_to_andor(empty, Map, Map, 0).
complex_to_andor([endlist], Map, Map, 0) :- !.
complex_to_andor([list(Els)], Map0, MapF, Tree) :- !,
complex_to_andor(Els, Map0, MapF, Tree).
complex_to_andor(Els, Map0, MapF, Tree).
complex_to_andor([endlist|_], Map, Map, 1) :- !.
El1 == endlist, !.
complex_to_andor([El1,El2|Els], Map0, MapF, or(T1,T2)) :- !,
complex_to_and(El1, Map0, MapI, T1),
complex_to_andor([El2|Els], MapI, MapF, T2).
@ -44,8 +45,8 @@ complex_to_andor([Els], Map0, MapF, V) :-
complex_to_and(int(A1,[endlist]), Map0, MapF, V) :- !,
check(Map0, A1, V, MapF).
complex_to_and(atom(true,[endlist]), Map0, MapF, 1) :- !.
complex_to_and(atom(A1,[endlist]), Map0, MapF, V) :- !,
check(Map0, A1, V, MapF).
complex_to_and(functor(not,1,[int(A1,[endlist])]), Map0, MapF, not(V)) :- !,
check(Map0, A1, V, MapF).
complex_to_and(functor(not,1,[atom(A1,[endlist])]), Map0, MapF, not(V)) :- !,
@ -63,7 +64,7 @@ complex_to_and(functor(not,1,[atom(A1,Els)]), Map0, MapF, and(not(V),T2)) :- !,
check(Map0, A1, V, MapI),
complex_to_andor(Els, MapI, MapF, T2).
% HASH TABLE, it can be an OR or an AND.
complex_to_and(functor(not,1,[int(A1,Els)|More]), Map0, MapF, or(NOTV1,O2)) :-
complex_to_and(functor(not,1,[int(A1,Els)|More]), Map0, MapF, or(NOTV1,O2)) :-
check(Map0, A1, V, MapI),
(Els == [endlist]
->
@ -74,8 +75,9 @@ complex_to_and(functor(not,1,[int(A1,Els)|More]), Map0, MapF, or(NOTV1,O2)) :-
NOTV1 = and(not(V), T2)
),
complex_to_and(functor(not,1,More), MapI2, MapF, O2).
complex_to_and(functor(not,1,[atom(A1,Els)|More]), Map0, MapF, or(NOTV1,O2)) :-
complex_to_and(functor(not,1,[atom(A1,Els)|More]), Map0, MapF, or(NOTV1,O2)) :-
check(Map0, A1, V, MapI),
check(Map0, A1, V, MapF).
(Els == [endlist]
->
NOTV1 = not(V),
@ -86,17 +88,18 @@ complex_to_and(functor(not,1,[atom(A1,Els)|More]), Map0, MapF, or(NOTV1,O2)) :-
),
complex_to_and(functor(not,1,More), MapI2, MapF, O2).
tabled_complex_to_andor(T, Map, Map, Tab, Tab, V) :-
tabled_complex_to_andor(empty, Map, Map, Tab, Tab, 0).
tabled_complex_to_andor(T, Map, Map, Tab, Tab, V) :-
rb_lookup(T, V, Tab), !,
increment_ref_count(V).
tabled_complex_to_andor(IN, Map0, MapF, Tab0, TabF, OUT) :-
IN = [El1,El2|Els], !,
OUT = or(0,_,T1,T2),
rb_insert(Tab0, IN, OUT, Tab1),
tabled_complex_to_and(El1, Map0, MapI, Tab1, TabI, T1),
tabled_complex_to_andor(El2.Els, MapI, MapF, TabI, TabF, T2).
tabled_complex_to_andor(IN, Map, Map, Tab, Tab, 1) :-
IN = !.
tabled_complex_to_andor([Els], Map0, MapF, Tab0, TabF, V) :-
tabled_complex_to_and(Els, Map0, MapF, Tab0, TabF, V).
rb_insert(Tab0, IN, OUT, Tab1),
tabled_complex_to_andor([El1,Dl2], Map0, MapF, Tab0, TabF, or(T1,T2)) :-
tabled_complex_to_and(El1, Map0, MapI, Tab1, TabI, T1),
tabled_complex_to_andor(El2.Els, MapI, MapF, TabI, TabF, T2).
tabled_complex_to_and(int(A1,[endlist]), Map0, MapF, Tab, Tab, V) :- !,
check(Map0, A1, V, MapF).
@ -106,16 +109,16 @@ tabled_complex_to_and(functor(not,1,[int(A1,[endlist])]), Map0, MapF, Tab, Tab,
check(Map0, A1, V, MapF).
tabled_complex_to_and(functor(not,1,[atom(A1,[endlist])]), Map0, MapF, Tab, Tab, not(V)) :- !,
check(Map0, A1, V, MapF).
tabled_complex_to_and(T, Map, Map, Tab, Tab, V) :-
tabled_complex_to_and(T, Map, Map, Tab, Tab, V) :-
rb_lookup(T, V, Tab), !,
increment_ref_count(V).
tabled_complex_to_and(IN, Map0, MapF, Tab0, TabF, OUT) :-
tabled_complex_to_and(IN, Map0, MapF, Tab0, TabF, OUT) :-
IN = int(A1,Els), !,
check(Map0, A1, V, MapI),
rb_insert(Tab0, IN, OUT, TabI),
OUT = and(0, _, V, T2),
tabled_complex_to_andor(Els, MapI, MapF, TabI, TabF, T2).
tabled_complex_to_and(IN, Map0, MapF, Tab0, TabF, OUT) :-
tabled_complex_to_and(IN, Map0, MapF, Tab0, TabF, OUT) :-
IN = atom(A1,Els), !,
check(Map0, A1, V, MapI),
rb_insert(Tab0, IN, OUT, TabI),
@ -141,5 +144,3 @@ increment_ref_count(V) :-
arg(1,V,I0),
I is I0+1,
setarg(1,V,I).

View File

@ -0,0 +1,129 @@
% Example with matrices,based on:
%
% Three jugs problem in Minzinc modelled as a shortest path problem.
%
% Problem from Taha "Introduction to Operations Research", page 245
%
% Model created by Hakan Kjellerstrand, hakank@bonetmail.com
% See also my MiniZinc page: http://www.hakank.org/minizinc
%
% VSC: had to transpose the matrix, and change the constraints....
%
:- style_check( all ).
:- use_module(library(gecode/clpfd)).
:- use_module(library(maplist)).
:- use_module(library(lists)).
main :-
problem(Z, X, InFlow, OutFlow, N),
out(Z, X, InFlow, OutFlow, N),
fail.
main.
problem(Z, X, InFlow, OutFlow, N) :-
N = 15,
Start = 1,
End = 15,
M = 999,
d( M, DD ),
D <== array[1..N,1..N] of DD, % distance
RHS <== array[1..N] of _, % requirements (right hand statement)
X <== array[1..N, 1..N] of 0..1, % the resulting matrix, 1 if connected, 0 else
OutFlow <== array[1..N] of 0..1,
InFlow <== array[1..N] of 0..1,
% objective to minimize
Z in 0..M,
Z #= sum( [I in 1..N, J in 1..N] where D[I,J]<M,
D[I,J]*X[I,J]),
% solve minimize z;
% alternative solve statements which may give faster solution
%solve :: int_search([ x[i,j] | i,j in 1..n], first_fail, indomain_min, complete) minimize z;
% solve minimize z;
minimize(Z),
% constraint
foreach(I in 1..N,
( I == Start ->
RHS[I] <== 1 ;
I == End ->
RHS[I] <== -1 ;
RHS[I] <== 0 )
),
% must be larger than 0??
foreach( [I in 1..N, J in 1..N],
( D[J,I] = M ->
X[J,I] #= 0 ;
true )
),
% outflow constraint
foreach(I in 1..N,
OutFlow[I] #= sum(J in 1..N where D[J,I]<M, X[J,I])
),
% inflow constraint
foreach(J in 1..N,
InFlow[J] #= sum(I in 1..N where D[J,I]<M, X[J,I])
),
% inflow = outflow
foreach(I in 1..N, OutFlow[I]-InFlow[I]#=RHS[I]),
% labeling
labeling( [], X).
% data
d(M, [
M, 1, M, M, M, M, M, M, 1, M, M, M, M, M, M,
M, M, 1, M, M, M, M, M, M, M, M, M, M, M, M,
M, M, M, 1, M, M, M, M, 1, M, M, M, M, M, M,
M, M, M, M, 1, M, M, M, M, M, M, M, M, M, M,
M, M, M, M, M, 1, M, M, 1, M, M, M, M, M, M,
M, M, M, M, M, M, 1, M, M, M, M, M, M, M, M,
M, M, M, M, M, M, M, 1, 1, M, M, M, M, M, M,
M, M, M, M, M, M, M, M, M, M, M, M, M, M, 1,
M, M, M, M, M, M, M, M, M, 1, M, M, M, M, M,
M, 1, M, M, M, M, M, M, M, M, 1, M, M, M, M,
M, M, M, M, M, M, M, M, M, M, M, 1, M, M, M,
M, 1, M, M, M, M, M, M, M, M, M, M, 1, M, M,
M, M, M, M, M, M, M, M, M, M, M, M, M, 1, M,
M, 1, M, M, M, M, M, M, M, M, M, M, M, M, 1,
M, M, M, M, M, M, M, M, M, M, M, M, M, M, M
]).
/*
% shows the result matrix
output [
if i = 1 /\ j = 1 then
"z: " ++ show(z) ++ "\n" ++
"inFlow: " ++ show(inFlow) ++ "\n" ++ "outFlow: " ++ show(outFlow) ++ "\n" ++
" 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5\n"
else "" endif ++
if j = 1 then show(i) ++ " : " else "" endif ++
show(x[i,j]) ++ if j = n then "\n" else " " endif
| i in 1..n, j in 1..n
];
*/
out(Cost, Ts, Ins, Out, N) :-
format('cost = ~d~n', [Cost]),
InsL <== list(Ins),
OutL <== list(Out),
format('Inputs =', []), maplist(out, InsL), nl,
format('Outputs =', []), maplist(out, OutL), nl,
format('transitions =~n', []),
foreach(I in 1..N, outl(Ts[_,I]) ).
outl( X ) :-
L <== X, % evaluate matrix notation to Prolog lists.
format(' ', []),
maplist(out, L), nl.
out(0) :- format(' .', []).
out(1) :- format(' 1', []).

View File

@ -0,0 +1,85 @@
%% -*- prolog -*-
%%=============================================================================
%% Copyright (C) 2011 by Denys Duchier
%%
%% This program is free software: you can redistribute it and/or modify it
%% under the terms of the GNU Lesser General Public License as published by the
%% Free Software Foundation, either version 3 of the License, or (at your
%% option) any later version.
%%
%% This program is distributed in the hope that it will be useful, but WITHOUT
%% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
%% FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
%% more details.
%%
%% You should have received a copy of the GNU Lesser General Public License
%% along with this program. If not, see <http://www.gnu.org/licenses/>.
%%=============================================================================
:- use_module(library(gecode/clpfd)).
:- use_module(library(maplist)).
main :- ex(Ex, People, Names, _Preferences),
photo(Ex, People, Amount ),
format( 'Example ~a: ~w~n', [Ex, Amount]),
maplist(join, People, Names, PeopleNames),
keysort( PeopleNames, SortedPeopleNames),
maplist(join, _People, SortedNames, SortedPeopleNames),
maplist(output, SortedNames ),
fail.
main.
join( Key, El, Key-El ).
output( Name ) :- format(' ~a~n', [Name]).
% 5 people want to have a photograph together, but they have preferences.
photo(Ex, People, Amount) :-
ex(Ex, People, _, Preferences),
length(People, Len),
Len0 is Len-1,
People ins 0..Len0,
all_distinct(People),
% Bools are the satisfied constraints
maplist(preference_satisfied, Preferences, Bools),
length(Preferences, PLen),
Amount in 0..PLen,
sum( Bools ) #= Amount,
% add all satisfied constraints
maximize(Amount),
labeling([], People).
%reification, use with care
preference_satisfied(X-Y, B) :-
abs(X - Y) #= 1 #<==> B.
ex(s,[Alice,Bob,Carl,Deb,Evan],
['Alice','Bob','Carl','Deb','Evan'],
[Alice-Carl,
Carl-Deb,
Deb-Alice,
Evan-Alice,
Bob-Evan,
Carl-Evan,
Deb-Evan,
Evan-Bob]).
ex(l,[Betty,Chris,Donald,Fred,Gary,Mary,Paul,Peter,Susan],
['Betty','Chris','Donald','Fred','Gary','Mary','Paul','Peter','Susan'],
[Betty-Donald,
Betty-Gary,
Betty-Peter,
Chris-Gary,
Chris-Susan,
Donald-Fred,
Donald-Gary,
Fred-Betty,
Fred-Gary,
Gary-Mary,
Gary-Betty,
Mary-Betty,
Mary-Susan,
Paul-Donald,
Paul-Peter,
Peter-Susan,
Peter-Paul]).

View File

@ -0,0 +1,49 @@
:- use_module(library(gecode/clpfd)).
:- use_module(library(maplist)).
main :-
between(1,10,N),
I is N*100,
statistics( runtime, _ ),
once( queens(I, _Queens) ),
statistics( runtime, [DT|_] ),
% findall(Queens, queens(I, Queens), Solutions ),
% length( Solutions, N),
format('~d took ~w msec to find first solution.~n', [I, DT]),
fail.
main.
queens(N, Queens) :-
length(Queens, N),
Queens ins 1..N,
all_distinct(Queens),
foldl(inc, Queens, Inc, 0, _), % [0, 1, 2, .... ]
foldl(dec, Queens, Dec, 0, _), % [0, -1, -2, ... ]
all_distinct(Inc,Queens),
all_distinct(Dec,Queens),
labeling([], Queens).
inc(_, I0, I0, I) :-
I is I0+1.
dec(_, I0, I0, I) :-
I is I0-1.
lqueens(N, Queens) :-
length(Queens, N),
Queens ins 1..N,
all_distinct(Queens),
lconstrain( Queens, 0 ),
labeling([], Queens).
lconstrain([], _).
lconstrain( [Q|Queens], I0) :-
I is I0+1,
foldl(constrain(Q, I0), Queens, I, _),
lconstrain( Queens, I).
constrain(Q, I, R, J, J1) :-
J1 is J+1,
Q + I #\= R + J,
Q - I #\= R - J.

View File

@ -0,0 +1,44 @@
%% -*- prolog -*-
%%=============================================================================
%% Copyright (C) 2011, 2013 by Denys Duchier, Vitor Santos Costa
%%
%% This program is free software: you can redistribute it and/or modify it
%% under the terms of the GNU Lesser General Public License as published by the
%% Free Software Foundation, either version 3 of the License, or (at your
%% option) any later version.
%%
%% This program is distributed in the hope that it will be useful, but WITHOUT
%% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
%% FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
%% more details.
%%
%% You should have received a copy of the GNU Lesser General Public License
%% along with this program. If not, see <http://www.gnu.org/licenses/>.
%%=============================================================================
:- use_module(library(gecode/clpfd)).
main :-
statistics( runtime, _ ),
once( send_more_money(Letters) ),
statistics( runtime, [DT|_] ),
% findall(Queens, queens(I, Queens), Solutions ),
% length( Solutions, N),
format('took ~w msec to find first solution, ~w.~n', [I, DT, Letters]),
fail.
main.
% S E N D
% + M O R E
% ---------
% M O N E Y
send_more_money(Letters) :-
[S,E,N,D,M,O,R,Y] = Letters,
Letters ins 0..9,
M #\= 0,
S #\= 0,
all_distinct(Letters),
1000*S + 100*E + 10*N + D +
1000*M + 100*O + 10*R + E #=
10000*M + 1000*O + 100*N + 10*E + Y,
labeling([], Letters).

View File

@ -0,0 +1,47 @@
%% -*- prolog -*-
%%=============================================================================
%% Copyright (C) 2011, 2013 by Denys Duchier, Vitor Santos Costa
%%
%% This program is free software: you can redistribute it and/or modify it
%% under the terms of the GNU Lesser General Public License as published by the
%% Free Software Foundation, either version 3 of the License, or (at your
%% option) any later version.
%%
%% This program is distributed in the hope that it will be useful, but WITHOUT
%% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
%% FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
%% more details.
%%
%% You should have received a copy of the GNU Lesser General Public License
%% along with this program. If not, see <http://www.gnu.org/licenses/>.
%%=============================================================================
:- use_module(library(gecode/clpfd)).
main :-
statistics( runtime, _ ),
once( send_most_money(Letters, Money) ),
statistics( runtime, [DT|_] ),
% findall(Queens, queens(I, Queens), Solutions ),
% length( Solutions, N),
format('took ~w msec to find first solution, ~w.~n', [DT, Letters:Money]),
fail.
main.
% S E N D
% + M O S T
% ---------
% M O N E Y
send_most_money(Letters, Money) :-
[S,E,N,D,M,O,T,Y] = Letters,
Letters ins 0..9,
Money in 0..99999,
M #\= 0,
S #\= 0,
all_distinct(Letters),
1000*S + 100*E + 10*N + D +
1000*M + 100*O + 10*S + T #= Money,
10000*M + 1000*O + 100*N + 10*E + Y #= Money,
maximize(Money),
labeling([], Letters).

View File

@ -0,0 +1,84 @@
:- style_check(all).
:- use_module(library(gecode/clpfd)).
:- use_module(library(maplist)).
main :-
ex(Ex, _),
sudoku(Ex, _My),
fail.
main.
sudoku( Ex, Els ) :-
problem(Ex, Els),
output(Els).
%
% gecode constraints
%
problem(Ex, Els) :-
length(Els, 81),
Els ins 1..9,
M <== matrix( Els, [dim=[9,9]] ),
% select rows
foreach( I in 0..8 , all_different(M[I,_]) ),
% select cols
foreach( J in 0..8, all_different(M[_,J]) ),
% select squares
foreach( [I,J] ins 0..2 ,
all_different(M[I*3+(0..2),J*3+(0..2)]) ),
ex(Ex, Els),
% maplist( bound, Els, Exs),
labeling( [], Els ).
% The gecode interface doesn't support wake-ups on binding constained variables, this is the closest.
%
bound(El, X) :-
( nonvar(X) -> El #= X ; true ).
%
% output using matrix library
%
output(Els) :-
M <== matrix( Els, [dim=[9,9]] ),
foreach( I in 0..2 , output(M, I) ),
output_line.
output(M, I) :-
output_line,
foreach( J in 0..2 , output_row(M, J+I*3) ).
output_row( M, Row ) :-
L <== M[Row,_],
format('| ~d ~d ~d | ~d ~d ~d | ~d ~d ~d |~n', L).
output_line :-
format(' ~|~`-t~24+~n', []).
ex( 1, [
_,6,_,1,_,4,_,5,_,
_,_,8,3,_,5,6,_,_,
2,_,_,_,_,_,_,_,1,
8,_,_,4,_,7,_,_,6,
_,_,6,_,_,_,3,_,_,
7,_,_,9,_,1,_,_,4,
5,_,_,_,_,_,_,_,2,
_,_,7,2,_,6,9,_,_,
_,4,_,5,_,8,_,7,_
] ).
ex(2, [
_,_,1,_,8,_,6,_,4,
_,3,7,6,_,_,_,_,_,
5,_,_,_,_,_,_,_,_,
_,_,_,_,_,5,_,_,_,
_,_,6,_,1,_,8,_,_,
_,_,_,4,_,_,_,_,_,
_,_,_,_,_,_,_,_,3,
_,_,_,_,_,7,5,2,_,
8,_,2,_,9,_,7,_,_
] ).

Binary file not shown.

1318
packages/clpfd.yap Normal file

File diff suppressed because it is too large Load Diff

View File

@ -147,7 +147,8 @@ IF (CUDD_FOUND)
)
install(TARGETS bddem
LIBRARY DESTINATION ${dlls}
LIBRARY DESTINATION ${libdir}
RUNTIME DESTINATION ${dlls}
ARCHIVE DESTINATION ${dlls}
)
@ -169,7 +170,8 @@ IF (CUDD_FOUND)
add_subDIRECTORY ( approx/simplecuddLPADs )
install(TARGETS cplint
LIBRARY DESTINATION ${dlls}
LIBRARY DESTINATION ${libdir}
RUNTIME DESTINATION ${dlls}
ARCHIVE DESTINATION ${dlls}
)

Some files were not shown because too many files have changed in this diff Show More