merge
This commit is contained in:
commit
36b376d447
56
C/absmi.c
56
C/absmi.c
@ -916,24 +916,26 @@ static int interrupt_dexecute(USES_REGS1) {
|
||||
|
||||
static void undef_goal(USES_REGS1) {
|
||||
PredEntry *pe = PredFromDefCode(P);
|
||||
BEGD(d0);
|
||||
/* avoid trouble with undefined dynamic procedures */
|
||||
/* I assume they were not locked beforehand */
|
||||
#if defined(YAPOR) || defined(THREADS)
|
||||
/* avoid trouble with undefined dynamic procedures */
|
||||
/* I assume they were not locked beforehand */
|
||||
#if defined(YAPOR) || defined(THREADS)
|
||||
if (!PP) {
|
||||
PELOCK(19, pe);
|
||||
PP = pe;
|
||||
}
|
||||
#endif
|
||||
if (pe->PredFlags & (DynamicPredFlag | LogUpdatePredFlag | MultiFileFlag) ) {
|
||||
BACKUP_MACHINE_REGS();
|
||||
if (pe->PredFlags & (DynamicPredFlag | LogUpdatePredFlag | MultiFileFlag) ) {
|
||||
#if defined(YAPOR) || defined(THREADS)
|
||||
UNLOCKPE(19, PP);
|
||||
PP = NULL;
|
||||
#endif
|
||||
CalculateStackGap(PASS_REGS1);
|
||||
P = FAILCODE;
|
||||
RECOVER_MACHINE_REGS();
|
||||
return;
|
||||
}
|
||||
#if DEBUG
|
||||
if (UndefCode == NULL || UndefCode->OpcodeOfPred == UNDEF_OPCODE) {
|
||||
fprintf(stderr,"call to undefined Predicates %s ->", IndicatorOfPred(pe));
|
||||
Yap_DebugPlWriteln(ARG1);
|
||||
@ -946,16 +948,28 @@ static void undef_goal(USES_REGS1) {
|
||||
#endif
|
||||
CalculateStackGap(PASS_REGS1);
|
||||
P = FAILCODE;
|
||||
RECOVER_MACHINE_REGS();
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
#if defined(YAPOR) || defined(THREADS)
|
||||
UNLOCKPE(19, PP);
|
||||
PP = NULL;
|
||||
#endif
|
||||
if (pe->ArityOfPE == 0) {
|
||||
d0 = MkAtomTerm((Atom)(pe->FunctorOfPred));
|
||||
#endif
|
||||
CELL o = AbsPair(HR);
|
||||
if (pe->ModuleOfPred == PROLOG_MODULE) {
|
||||
if (CurrentModule == PROLOG_MODULE)
|
||||
HR[0] = TermProlog;
|
||||
else
|
||||
HR[0] = CurrentModule;
|
||||
} else {
|
||||
d0 = AbsAppl(HR);
|
||||
HR[0] = Yap_Module_Name(pe);
|
||||
}
|
||||
HR += 2;
|
||||
if (pe->ArityOfPE == 0) {
|
||||
HR[-1] = MkAtomTerm((Atom)(pe->FunctorOfPred));
|
||||
} else {
|
||||
HR[-1] = AbsAppl(HR);
|
||||
*HR++ = (CELL)pe->FunctorOfPred;
|
||||
CELL *ip=HR;
|
||||
UInt imax = pe->ArityOfPE;
|
||||
@ -984,30 +998,20 @@ static void undef_goal(USES_REGS1) {
|
||||
ENDD(d1);
|
||||
}
|
||||
}
|
||||
ARG1 = AbsPair(HR);
|
||||
HR[1] = d0;
|
||||
ENDD(d0);
|
||||
if (pe->ModuleOfPred == PROLOG_MODULE) {
|
||||
if (CurrentModule == PROLOG_MODULE)
|
||||
HR[0] = TermProlog;
|
||||
else
|
||||
HR[0] = CurrentModule;
|
||||
} else {
|
||||
HR[0] = Yap_Module_Name(pe);
|
||||
}
|
||||
ARG2 = Yap_getUnknownModule(Yap_GetModuleEntry(HR[0]));
|
||||
HR += 2;
|
||||
ARG1 = o;
|
||||
ARG2 = MkVarTerm();
|
||||
|
||||
#ifdef LOW_LEVEL_TRACER
|
||||
if (Yap_do_low_level_trace)
|
||||
low_level_trace(enter_pred, UndefCode, XREGS + 1);
|
||||
#endif /* LOW_LEVEL_TRACE */
|
||||
P = UndefCode->CodeOfPred;
|
||||
RECOVER_MACHINE_REGS();
|
||||
}
|
||||
|
||||
static void spy_goal(USES_REGS1) {
|
||||
PredEntry *pe = PredFromDefCode(P);
|
||||
|
||||
BACKUP_MACHINE_REGS();
|
||||
#if defined(YAPOR) || defined(THREADS)
|
||||
if (!PP) {
|
||||
PELOCK(14, pe);
|
||||
@ -1027,6 +1031,7 @@ static void spy_goal(USES_REGS1) {
|
||||
PP = NULL;
|
||||
}
|
||||
#endif
|
||||
RECOVER_MACHINE_REGS();
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -1044,6 +1049,7 @@ static void spy_goal(USES_REGS1) {
|
||||
}
|
||||
#endif
|
||||
Yap_NilError(CALL_COUNTER_UNDERFLOW_EVENT, "");
|
||||
RECOVER_MACHINE_REGS();
|
||||
return;
|
||||
}
|
||||
LOCAL_PredEntriesCounter--;
|
||||
@ -1055,6 +1061,7 @@ static void spy_goal(USES_REGS1) {
|
||||
}
|
||||
#endif
|
||||
Yap_NilError(PRED_ENTRY_COUNTER_UNDERFLOW_EVENT, "");
|
||||
RECOVER_MACHINE_REGS();
|
||||
return;
|
||||
}
|
||||
if ((pe->PredFlags & (CountPredFlag | ProfiledPredFlag | SpiedPredFlag)) ==
|
||||
@ -1066,6 +1073,7 @@ static void spy_goal(USES_REGS1) {
|
||||
}
|
||||
#endif
|
||||
P = pe->cs.p_code.TrueCodeOfPred;
|
||||
RECOVER_MACHINE_REGS();
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -1084,6 +1092,7 @@ static void spy_goal(USES_REGS1) {
|
||||
PP = NULL;
|
||||
}
|
||||
#endif
|
||||
RECOVER_MACHINE_REGS();
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -1153,6 +1162,7 @@ static void spy_goal(USES_REGS1) {
|
||||
low_level_trace(enter_pred, pt0, XREGS + 1);
|
||||
#endif /* LOW_LEVEL_TRACE */
|
||||
}
|
||||
RECOVER_MACHINE_REGS();
|
||||
}
|
||||
|
||||
Int Yap_absmi(int inp) {
|
||||
|
@ -1725,6 +1725,7 @@ X_API YAP_PredEntryPtr YAP_AtomToPredInModule(YAP_Atom at, Term mod) {
|
||||
return RepPredProp(PredPropByAtom(at, mod));
|
||||
}
|
||||
|
||||
/*
|
||||
static int run_emulator(USES_REGS1) {
|
||||
int out;
|
||||
|
||||
@ -1732,6 +1733,7 @@ static int run_emulator(USES_REGS1) {
|
||||
LOCAL_PrologMode |= UserCCallMode;
|
||||
return out;
|
||||
}
|
||||
*/
|
||||
|
||||
X_API bool YAP_EnterGoal(YAP_PredEntryPtr ape, CELL *ptr, YAP_dogoalinfo *dgi) {
|
||||
CACHE_REGS
|
||||
@ -2210,8 +2212,10 @@ X_API Term YAP_ReadClauseFromStream(int sno, Term vs, Term pos) {
|
||||
BACKUP_MACHINE_REGS();
|
||||
Term t = Yap_read_term(
|
||||
sno,
|
||||
MkPairTerm(Yap_MkApplTerm(Yap_MkFunctor(AtomVariableNames, 1), 1, &vs),
|
||||
MkPairTerm(Yap_MkApplTerm(Yap_MkFunctor(AtomTermPosition, 1),
|
||||
MkPairTerm(
|
||||
Yap_MkApplTerm(Yap_MkFunctor(AtomVariableNames, 1), 1, &vs),
|
||||
MkPairTerm(
|
||||
Yap_MkApplTerm(Yap_MkFunctor(AtomTermPosition, 1),
|
||||
1, &pos),
|
||||
TermNil)),
|
||||
true);
|
||||
@ -2268,6 +2272,7 @@ X_API char *YAP_WriteBuffer(Term t, char *buf, size_t sze, int flags) {
|
||||
}
|
||||
}
|
||||
}
|
||||
return out.val.c = pop_output_text_stack(l,buf);
|
||||
}
|
||||
|
||||
/// write a a term to n user-provided buffer: make sure not tp
|
||||
|
@ -4000,7 +4000,7 @@ static void EraseLogUpdCl(LogUpdClause *clau) {
|
||||
if (ap->cs.p_code.NOfClauses > 1) {
|
||||
if (ap->TimeStampOfPred >= TIMESTAMP_RESET)
|
||||
Yap_UpdateTimestamps(ap);
|
||||
++ap->TimeStampOfPred;
|
||||
++(ap->TimeStampOfPred);
|
||||
/* fprintf(stderr,"-
|
||||
* %x--%d--%ul\n",ap,ap->TimeStampOfPred,ap->ArityOfPE);*/
|
||||
ap->LastCallOfPred = LUCALL_RETRACT;
|
||||
@ -4017,7 +4017,7 @@ static void EraseLogUpdCl(LogUpdClause *clau) {
|
||||
ap->LastCallOfPred = LUCALL_ASSERT;
|
||||
}
|
||||
}
|
||||
clau->ClTimeEnd = ap->TimeStampOfPred;
|
||||
//clau->ClTimeEnd = ap->TimeStampOfPred;
|
||||
Yap_RemoveClauseFromIndex(ap, clau->ClCode);
|
||||
/* release the extra reference */
|
||||
}
|
||||
|
60
C/errors.c
60
C/errors.c
@ -41,8 +41,8 @@
|
||||
|
||||
#define set_key_i(k, ks, q, i, t) \
|
||||
if (strcmp(ks, q) == 0) { \
|
||||
i->k = IsIntegerTerm(t) ? IntegerOfTerm(t) : 0; \
|
||||
return IsIntegerTerm(t); \
|
||||
i->k = IsIntegerTerm(t) ? IntegerOfTerm(t) : 0; \
|
||||
return IsIntegerTerm(t); \
|
||||
}
|
||||
|
||||
#define set_key_s(k, ks, q, i, t) \
|
||||
@ -99,7 +99,7 @@ if (strcmp(ks, q) == 0) { \
|
||||
|
||||
#define query_key_s(k, ks, q, i) \
|
||||
if (strcmp(ks, q) == 0 ) \
|
||||
{ if (i->k) return MkAtomTerm(Yap_LookupAtom(i->k)); else return TermNil; }
|
||||
{ if (i->k) return MkAtomTerm(Yap_LookupAtom(i->k)); else return TermEmptyAtom; }
|
||||
|
||||
|
||||
#define query_key_t(k, ks, q, i) \
|
||||
@ -1258,15 +1258,25 @@ static Int is_callable(USES_REGS1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
static Int is_predicate_indicator(USES_REGS1) {
|
||||
/**
|
||||
* @pred is_predicate_indicator( Term, Module, Name, Arity )
|
||||
*
|
||||
* This predicates can be used to verify if Term is a predicate indicator, that is of the form:
|
||||
* + Name/Arity
|
||||
* + Name//Arity-2
|
||||
* + Module:Name/Arity
|
||||
* + Module:Name//Arity-2
|
||||
*
|
||||
* if it is, it will extract the predicate's module, name, and arity.
|
||||
*/
|
||||
static Int get_predicate_indicator(USES_REGS1) {
|
||||
Term G = Deref(ARG1);
|
||||
// Term Context = Deref(ARG2);
|
||||
Term mod = CurrentModule;
|
||||
|
||||
G = Yap_YapStripModule(G, &mod);
|
||||
if (IsVarTerm(G)) {
|
||||
Yap_Error(INSTANTIATION_ERROR, G, NULL);
|
||||
return false;
|
||||
Yap_ThrowError(INSTANTIATION_ERROR, G, NULL);
|
||||
}
|
||||
if (!IsVarTerm(mod) && !IsAtomTerm(mod)) {
|
||||
Yap_Error(TYPE_ERROR_ATOM, G, NULL);
|
||||
@ -1275,13 +1285,34 @@ static Int is_predicate_indicator(USES_REGS1) {
|
||||
if (IsApplTerm(G)) {
|
||||
Functor f = FunctorOfTerm(G);
|
||||
if (IsExtensionFunctor(f)) {
|
||||
Yap_Error(TYPE_ERROR_PREDICATE_INDICATOR, G, NULL);
|
||||
Yap_ThrowError(TYPE_ERROR_PREDICATE_INDICATOR, G, NULL);
|
||||
}
|
||||
if (f == FunctorSlash || f == FunctorDoubleSlash) {
|
||||
return true;
|
||||
Term name = ArgOfTerm(1,G), arity = ArgOfTerm(2,G);
|
||||
if (IsVarTerm(name)) {
|
||||
Yap_ThrowError(INSTANTIATION_ERROR, name, NULL);
|
||||
} else if (!IsAtomTerm(name)) {
|
||||
Yap_ThrowError(TYPE_ERROR_ATOM, name, NULL);
|
||||
}
|
||||
if (IsVarTerm(arity)) {
|
||||
Yap_ThrowError(INSTANTIATION_ERROR, arity, NULL);
|
||||
} else if (!IsIntegerTerm(arity)) {
|
||||
Yap_ThrowError(TYPE_ERROR_INTEGER, arity, NULL);
|
||||
} else {
|
||||
Int ar = IntegerOfTerm(arity);
|
||||
if (ar < 0) {
|
||||
Yap_ThrowError(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, arity, NULL);
|
||||
}
|
||||
if ( f == FunctorDoubleSlash) {
|
||||
arity = MkIntegerTerm(ar+2);
|
||||
}
|
||||
return Yap_unify(mod, ARG2) &&
|
||||
Yap_unify(name, ARG3) &&
|
||||
Yap_unify(arity, ARG4);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Yap_Error(TYPE_ERROR_PREDICATE_INDICATOR, G, NULL);
|
||||
Yap_ThrowError(TYPE_ERROR_PREDICATE_INDICATOR, G, NULL);
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -1296,9 +1327,8 @@ void Yap_InitErrorPreds(void) {
|
||||
Yap_InitCPred("$query_exception", 3, query_exception, 0);
|
||||
Yap_InitCPred("$drop_exception", 1, drop_exception, 0);
|
||||
Yap_InitCPred("$close_error", 0, close_error, HiddenPredFlag);
|
||||
Yap_InitCPred("is_boolean", 2, is_boolean, TestPredFlag);
|
||||
Yap_InitCPred("is_callable", 2, is_callable, TestPredFlag);
|
||||
Yap_InitCPred("is_atom", 2, is_atom, TestPredFlag);
|
||||
Yap_InitCPred("is_predicate_indicator", 2, is_predicate_indicator,
|
||||
TestPredFlag);
|
||||
Yap_InitCPred("is_boolean", 1, is_boolean, TestPredFlag);
|
||||
Yap_InitCPred("is_callable", 1, is_callable, TestPredFlag);
|
||||
Yap_InitCPred("is_atom", 1, is_atom, TestPredFlag);
|
||||
Yap_InitCPred("get_predicate_indicator", 4, get_predicate_indicator, 0);
|
||||
}
|
||||
|
@ -6,7 +6,7 @@
|
||||
* *
|
||||
* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 *
|
||||
* *
|
||||
*************************************************************** f***********
|
||||
**************************************************************************
|
||||
* *
|
||||
File: modules.c *
|
||||
* Last rev: *
|
||||
@ -24,7 +24,7 @@ static char SccsId[] = "%W% %G%";
|
||||
#include "YapHeap.h"
|
||||
#include "Yatom.h"
|
||||
|
||||
static Int current_module(USES_REGS1);
|
||||
static Int currgent_module(USES_REGS1);
|
||||
static Int current_module1(USES_REGS1);
|
||||
static ModEntry *LookupModule(Term a);
|
||||
static ModEntry *LookupSystemModule(Term a);
|
||||
|
@ -93,12 +93,12 @@ typedef struct non_single_struct_t {
|
||||
|
||||
#define def_trail_overflow() \
|
||||
trail_overflow:{ \
|
||||
pop_text_stack(lvl);\
|
||||
while (to_visit > to_visit0) {\
|
||||
to_visit --;\
|
||||
CELL *ptd0 = to_visit->ptd0;\
|
||||
*ptd0 = to_visit->d0;\
|
||||
}\
|
||||
pop_text_stack(lvl);\
|
||||
LOCAL_Error_TYPE = RESOURCE_ERROR_TRAIL;\
|
||||
LOCAL_Error_Size = (TR-TR0)*sizeof(tr_fr_ptr *);\
|
||||
clean_tr(TR0 PASS_REGS);\
|
||||
@ -640,7 +640,7 @@ break_rationals_complex_term(CELL *pt0, CELL *pt0_end, CELL *ptf, Term *vout, Te
|
||||
{
|
||||
if (IsPairTerm(d0)) {
|
||||
CELL *ap2 = RepPair(d0);
|
||||
fprintf(stderr, "%d \n", RepPair(ap2[0])- ptf);
|
||||
//fprintf(stderr, "%d \n", RepPair(ap2[0])- ptf);
|
||||
if (IsVarTerm(ap2[0]) && IN_BETWEEN(HB, (ap2[0]),HR)) {
|
||||
Term v = MkVarTerm();
|
||||
*ptf = v;
|
||||
@ -2656,13 +2656,13 @@ static Int ground_complex_term(register CELL *pt0, register CELL *pt0_end USES_R
|
||||
|
||||
|
||||
derefa_body(d0, ptd0, vars_in_term_unk, vars_in_term_nvar);
|
||||
pop_text_stack(lvl);
|
||||
while (to_visit > to_visit0) {
|
||||
to_visit --;
|
||||
CELL *ptd0 = to_visit->ptd0;
|
||||
*ptd0 = to_visit->d0;
|
||||
}
|
||||
return FALSE;
|
||||
pop_text_stack(lvl);
|
||||
return false;
|
||||
}
|
||||
/* Do we still have compound terms to visit */
|
||||
if (to_visit > to_visit0) {
|
||||
@ -2675,7 +2675,7 @@ static Int ground_complex_term(register CELL *pt0, register CELL *pt0_end USES_R
|
||||
goto restart;
|
||||
}
|
||||
pop_text_stack(lvl);
|
||||
return TRUE;
|
||||
return true;
|
||||
|
||||
def_aux_overflow();
|
||||
}
|
||||
@ -4340,6 +4340,7 @@ int vsc;
|
||||
static Int numbervars_in_complex_term(register CELL *pt0, register CELL *pt0_end, Int numbv, int singles USES_REGS)
|
||||
{
|
||||
|
||||
|
||||
int lvl = push_text_stack();
|
||||
|
||||
struct non_single_struct_t
|
||||
@ -4480,6 +4481,7 @@ unnumber_complex_term(CELL *pt0, CELL *pt0_end, CELL *ptf, CELL *HLow, int share
|
||||
int ground = share;
|
||||
Int max = -1;
|
||||
|
||||
int lvl = push_text_stack();
|
||||
HB = HLow;
|
||||
to_visit0 = to_visit;
|
||||
loop:
|
||||
@ -4501,7 +4503,6 @@ unnumber_complex_term(CELL *pt0, CELL *pt0_end, CELL *ptf, CELL *HLow, int share
|
||||
}
|
||||
*ptf = AbsPair(HR);
|
||||
ptf++;
|
||||
#ifdef RATIONAL_TREES
|
||||
if (to_visit+1 >= (struct cp_frame *)AuxSp) {
|
||||
goto heap_overflow;
|
||||
}
|
||||
@ -4513,18 +4514,6 @@ unnumber_complex_term(CELL *pt0, CELL *pt0_end, CELL *ptf, CELL *HLow, int share
|
||||
/* fool the system into thinking we had a variable there */
|
||||
*pt0 = AbsPair(HR);
|
||||
to_visit ++;
|
||||
#else
|
||||
if (pt0 < pt0_end) {
|
||||
if (to_visit+1 >= (struct cp_frame *)AuxSp) {
|
||||
goto heap_overflow;
|
||||
}
|
||||
to_visit->start_cp = pt0;
|
||||
to_visit->end_cp = pt0_end;
|
||||
to_visit->to = ptf;
|
||||
to_visit->ground = ground;
|
||||
to_visit ++;
|
||||
}
|
||||
#endif
|
||||
ground = share;
|
||||
pt0 = ap2 - 1;
|
||||
pt0_end = ap2 + 1;
|
||||
@ -4553,6 +4542,7 @@ unnumber_complex_term(CELL *pt0, CELL *pt0_end, CELL *ptf, CELL *HLow, int share
|
||||
Int id = IntegerOfTerm(ap2[1]);
|
||||
ground = FALSE;
|
||||
if (id < -1) {
|
||||
pop_text_stack(lvl);
|
||||
Yap_Error(RESOURCE_ERROR_STACK, TermNil, "unnumber vars cannot cope with VAR(-%d)", id);
|
||||
return 0L;
|
||||
}
|
||||
@ -4587,7 +4577,6 @@ unnumber_complex_term(CELL *pt0, CELL *pt0_end, CELL *ptf, CELL *HLow, int share
|
||||
*ptf = AbsAppl(HR);
|
||||
ptf++;
|
||||
/* store the terms to visit */
|
||||
#ifdef RATIONAL_TREES
|
||||
if (to_visit+1 >= (struct cp_frame *)AuxSp) {
|
||||
goto heap_overflow;
|
||||
}
|
||||
@ -4599,18 +4588,6 @@ unnumber_complex_term(CELL *pt0, CELL *pt0_end, CELL *ptf, CELL *HLow, int share
|
||||
/* fool the system into thinking we had a variable there */
|
||||
*pt0 = AbsAppl(HR);
|
||||
to_visit ++;
|
||||
#else
|
||||
if (pt0 < pt0_end) {
|
||||
if (to_visit+1 >= (struct cp_frame *)AuxSp) {
|
||||
goto heap_overflow;
|
||||
}
|
||||
to_visit->start_cp = pt0;
|
||||
to_visit->end_cp = pt0_end;
|
||||
to_visit->to = ptf;
|
||||
to_visit->ground = ground;
|
||||
to_visit ++;
|
||||
}
|
||||
#endif
|
||||
ground = (f != FunctorMutable) && share;
|
||||
d0 = ArityOfFunctor(f);
|
||||
pt0 = ap2;
|
||||
@ -4661,6 +4638,7 @@ unnumber_complex_term(CELL *pt0, CELL *pt0_end, CELL *ptf, CELL *HLow, int share
|
||||
/* restore our nice, friendly, term to its original state */
|
||||
clean_dirty_tr(TR0 PASS_REGS);
|
||||
HB = HB0;
|
||||
pop_text_stack(lvl);
|
||||
return ground;
|
||||
|
||||
overflow:
|
||||
@ -4669,7 +4647,6 @@ unnumber_complex_term(CELL *pt0, CELL *pt0_end, CELL *ptf, CELL *HLow, int share
|
||||
/* we've done it */
|
||||
/* restore our nice, friendly, term to its original state */
|
||||
HB = HB0;
|
||||
#ifdef RATIONAL_TREES
|
||||
while (to_visit > to_visit0) {
|
||||
to_visit --;
|
||||
pt0 = to_visit->start_cp;
|
||||
@ -4677,9 +4654,9 @@ unnumber_complex_term(CELL *pt0, CELL *pt0_end, CELL *ptf, CELL *HLow, int share
|
||||
ptf = to_visit->to;
|
||||
*pt0 = to_visit->oldv;
|
||||
}
|
||||
#endif
|
||||
reset_trail(TR0);
|
||||
/* follow chain of multi-assigned variables */
|
||||
pop_text_stack(lvl);
|
||||
return -1;
|
||||
|
||||
heap_overflow:
|
||||
@ -4688,7 +4665,6 @@ unnumber_complex_term(CELL *pt0, CELL *pt0_end, CELL *ptf, CELL *HLow, int share
|
||||
/* we've done it */
|
||||
/* restore our nice, friendly, term to its original state */
|
||||
HB = HB0;
|
||||
#ifdef RATIONAL_TREES
|
||||
while (to_visit > to_visit0) {
|
||||
to_visit --;
|
||||
pt0 = to_visit->start_cp;
|
||||
@ -4696,9 +4672,9 @@ unnumber_complex_term(CELL *pt0, CELL *pt0_end, CELL *ptf, CELL *HLow, int share
|
||||
ptf = to_visit->to;
|
||||
*pt0 = to_visit->oldv;
|
||||
}
|
||||
#endif
|
||||
reset_trail(TR0);
|
||||
LOCAL_Error_Size = (ADDR)AuxSp-(ADDR)to_visit0;
|
||||
pop_text_stack(lvl);
|
||||
return -3;
|
||||
}
|
||||
|
||||
|
1187
C/yap-args.c
1187
C/yap-args.c
File diff suppressed because it is too large
Load Diff
102
CMakeLists.txt
102
CMakeLists.txt
@ -65,6 +65,9 @@ if (POLICY CMP0003)
|
||||
endif ()
|
||||
if (POLICY CMP0068)
|
||||
cmake_policy(SET CMP0068 NEW)
|
||||
endif()
|
||||
if (POLICY CMP0075)
|
||||
cmake_policy(SET CMP0075 NEW)
|
||||
endif ()
|
||||
|
||||
## options: compilation flags
|
||||
@ -169,7 +172,7 @@ option(WITH_LBFGS "interface with lbfgs" ${WITH_PACKAGES})
|
||||
option(WITH_PRISM "use PRISM system in YAP" ${WITH_PACKAGES})
|
||||
option(WITH_PYTHON "Allow Python->YAP and YAP->Python" ${WITH_PACKAGES})
|
||||
option(WITH_R "Use R Interface" ${WITH_PACKAGES})
|
||||
option(WITH_JAVA "Try to use Java (currently Java 6,7,8)" ${WITH_PACKAGES})
|
||||
option(WITH_JAVA "Try to use Java (currently Java )" ${WITH_PACKAGES})
|
||||
|
||||
set(CMAKE_POSITION_INDEPENDENT_CODE TRUE)
|
||||
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
|
||||
@ -312,16 +315,17 @@ disallow_intree_builds()
|
||||
set(CMAKE_PREFIX_PATH $ENV{PREFIX})
|
||||
set( R_COMMAND "$ENV{R}")
|
||||
set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS CONDA_BUILD=1)
|
||||
list (APPEND CMAKE_REQUIRED_INCLUDES
|
||||
${PREFIX}/include
|
||||
${SYS_PREFIX}/include
|
||||
)
|
||||
set(YAP_IS_MOVABLE 1)
|
||||
|
||||
endif()
|
||||
|
||||
ADD_CUSTOM_TARGET(run_install COMMAND ${CMAKE_MAKE_PROGRAM} install)
|
||||
|
||||
list (APPEND CMAKE_REQUIRED_INCLUDES
|
||||
${PREFIX}/include
|
||||
${SYS_PREFIX}/include
|
||||
)
|
||||
|
||||
|
||||
|
||||
set(prefix ${CMAKE_INSTALL_PREFIX}) #BINDIR})
|
||||
@ -365,20 +369,43 @@ find_package(GMP)
|
||||
|
||||
list(APPEND YAP_SYSTEM_OPTIONS big_numbers)
|
||||
|
||||
if (GMP_INCLUDE_DIRS)
|
||||
#config.h needs this (TODO: change in code latter)
|
||||
include_directories(${GMP_INCLUDE_DIRS})
|
||||
endif ()
|
||||
|
||||
|
||||
if (WITH_READLINE)
|
||||
# - Find the readline library
|
||||
# This module defines
|
||||
# READLINE_INCLUDE_DIR, path to readline/readline.h, etc.
|
||||
# READLINE_LIBRARIES, the libraries required to use READLINE.
|
||||
# READLINE_FOUND, If false, do not try to use READLINE.
|
||||
# also defined, but not for general use are
|
||||
# READLINE_readline_LIBRARY, where to find the READLINE library.
|
||||
# READLINE_ncurses_LIBRARY, where to find the ncurses library [might not be defined]
|
||||
|
||||
include(FindReadline)
|
||||
|
||||
List(APPEND YAP_SYSTEM_OPTIONS readline)
|
||||
option (WITH_READLINE "use Readline" ON)
|
||||
# include subdirectories configuration
|
||||
## after we have all functionality in
|
||||
#
|
||||
# ADD_SUBDIRECTORY(console/terminal)
|
||||
|
||||
target_link_libraries(libYap android log)
|
||||
list(APPEND CMAKE_REQUIRED_INCLUDES ${READLINE_INCLUDE_DIR})
|
||||
endif()
|
||||
if (READLINE_FOUND)
|
||||
List(APPEND YAP_SYSTEM_OPTIONS readline)
|
||||
# required for configure
|
||||
include_directories( ${READLINE_INCLUDE_DIR}
|
||||
${READLINE_INCLUDE_DIR}/readline
|
||||
)
|
||||
endif ()
|
||||
|
||||
include_directories(H
|
||||
H/generated
|
||||
include os OPTYap utf8proc JIT/HPP)
|
||||
include_directories(BEFORE ${CMAKE_BINARY_DIR})
|
||||
|
||||
add_subdirectory( H )
|
||||
|
||||
set_directory_properties( PROPERTIES INCLUDE_DIRECTORIES
|
||||
H
|
||||
@ -445,7 +472,6 @@ set(DEF_STACKSPACE 0)
|
||||
set(DEF_HEAPSPACE 0)
|
||||
set(DEF_TRAILSPACE 0)
|
||||
|
||||
# option (RATIONAL_TREES "support infinite rational trees" ON)
|
||||
# dd_definitions (-D)
|
||||
|
||||
## don't touch these opts
|
||||
@ -492,7 +518,7 @@ endif ()
|
||||
## (but later on when installing)
|
||||
#SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
|
||||
#
|
||||
## SET(CMAKE_INSTALL_FULL_RPATH ${CMAKE_TOP_BINARY_DIR})
|
||||
## SET(CMAKE_INSTALL_FULL_RPATH ${CMAKE_BINARY_DIR})
|
||||
#
|
||||
## add the automatically determined parts of the RPATH
|
||||
## which point to directories outside the build tree to the install RPATH
|
||||
@ -517,6 +543,9 @@ ELSE()
|
||||
LIST(APPEND CMAKE_INSTALL_RPATH @loader_path/../../../lib)
|
||||
ENDIF()
|
||||
|
||||
set(YAP_STARTUP startup.yss)
|
||||
set(YAP_SOURCEBOOT boot.yap )
|
||||
|
||||
# Model Specific
|
||||
if (HAVE_GCC)
|
||||
set_property(DIRECTORY APPEND PROPERTY COMPILE_OPTIONS -Wall)
|
||||
@ -570,8 +599,16 @@ ADD_SUBDIRECTORY(os)
|
||||
ADD_SUBDIRECTORY(library/dialect/swi/fli)
|
||||
ADD_SUBDIRECTORY(CXX)
|
||||
|
||||
ADD_SUBDIRECTORY(pl)
|
||||
|
||||
ADD_SUBDIRECTORY(library)
|
||||
|
||||
ADD_SUBDIRECTORY(swi/library)
|
||||
|
||||
add_subDIRECTORY(utf8proc )
|
||||
|
||||
|
||||
|
||||
if(ANDROID)
|
||||
|
||||
set(CXX_SWIG_OUTDIR ${CMAKE_BINARY_DIR}/packages/swig/android)
|
||||
@ -600,6 +637,7 @@ endif()
|
||||
|
||||
|
||||
add_subDIRECTORY( packages/myddas )
|
||||
add_subDIRECTORY( packages/clpqr )
|
||||
|
||||
|
||||
List(APPEND YLIBS $<TARGET_OBJECTS:libOPTYap>)
|
||||
@ -611,10 +649,12 @@ if (WIN32 OR ANDROID)
|
||||
List(APPEND YLIBS $<TARGET_OBJECTS:YAP++>)
|
||||
if (WIN32 AND WITH_PYTHON)
|
||||
List(APPEND YLIBS $<TARGET_OBJECTS:Py4YAP>)
|
||||
list (APPEND WINDLLS ${PYTHON_LIBRARIES})
|
||||
endif ()
|
||||
if (ANDROID)
|
||||
List(APPEND YLIBS $<TARGET_OBJECTS:YAPsqlite3>)
|
||||
List(APPEND YLIBS $<TARGET_OBJECTS:DROID>)
|
||||
set(ANDROID_LIBRARIES sqliteX android log)
|
||||
|
||||
endif ()
|
||||
endif ()
|
||||
@ -632,40 +672,20 @@ add_library( # Sets the name of the library.
|
||||
${YLIBS}
|
||||
)
|
||||
|
||||
if (GMP_FOUND)
|
||||
target_link_libraries(libYap )
|
||||
endif (GMP_FOUND)
|
||||
|
||||
if (READLINE_FOUND)
|
||||
target_link_libraries(libYap ${READLINE_LIBRARIES})
|
||||
# required for configure
|
||||
|
||||
endif ()
|
||||
|
||||
if (ANDROID)
|
||||
target_link_libraries(libYap sqliteX android log)
|
||||
endif()
|
||||
|
||||
if (WIN32)
|
||||
target_link_libraries(libYap ${WINDLLS})
|
||||
if (WITH_PYTHON AND PYTHON_INCLUDE_DIRS AND PYTHON_LIBRARIES)
|
||||
target_link_libraries(libYap ${PYTHON_LIBRARIES})
|
||||
endif ()
|
||||
|
||||
if (WITH_PYTHON AND PYTHON_INCLUDE_DIRS AND PYTHON_LIBRARIES)
|
||||
target_link_libraries(libYap ${PYTHON_LIBRARIES})
|
||||
endif ()
|
||||
endif (WIN32)
|
||||
|
||||
target_link_libraries(libYap m)
|
||||
target_link_libraries(libYap
|
||||
m
|
||||
${GMP_LIBRARIES}
|
||||
${READLINE_LIBRARIES}
|
||||
${ANDROID_LIBRARIES}
|
||||
${WINDLLS}
|
||||
${PYTHON_LIBRARIES}
|
||||
)
|
||||
|
||||
set_target_properties(libYap
|
||||
PROPERTIES OUTPUT_NAME Yap
|
||||
)
|
||||
|
||||
|
||||
set(YAP_STARTUP startup.yss)
|
||||
set(YAP_SOURCEBOOT boot.yap )
|
||||
## define system
|
||||
|
||||
# Optional libraries that affect compilation
|
||||
@ -685,7 +705,7 @@ set_property(DIRECTORY PROPERTY CXX_STANDARD 11)
|
||||
|
||||
|
||||
if (ANDROID)
|
||||
include_directories(CXX ${CMAKE_SOURCE_DIR}/yaplib/../generated/src/jni)
|
||||
include_directories(CXX ${CMAKE_SOURCE_DIR}/../yaplib/generated/src/jni)
|
||||
endif ()
|
||||
include(Threads)
|
||||
#
|
||||
|
@ -354,23 +354,12 @@ vxu `on` consider `$` a lower case character.
|
||||
*/
|
||||
YAP_FLAG(LANGUAGE_FLAG, "language", true, isatom, "yap", NULL),
|
||||
|
||||
/**< if defined, first location where YAP expects to find the YAP Prolog
|
||||
library. Takes precedence over library_directory */
|
||||
YAP_FLAG(PROLOG_LIBRARY_DIRECTORY_FLAG, "prolog_library_directory", true,
|
||||
isatom, "", NULL),
|
||||
|
||||
/**< if defined, first location where YAP expects to find the YAP Prolog
|
||||
shared libraries (DLLS). Takes precedence over executable_directory/2. */
|
||||
/**< `max_arity is iso `
|
||||
YAP_FLAG(MAX_ARITY_FLAG, "max_arity", false, isatom, "unbounded", NULL),
|
||||
|
||||
Read-only flag telling the maximum arity of a functor. Takes the value
|
||||
`unbounded` for the current version of YAP.
|
||||
*/
|
||||
YAP_FLAG(PROLOG_FOREIGN_DIRECTORY_FLAG, "prolog_foreign_directory", true,
|
||||
isatom, "", NULL),
|
||||
|
||||
|
||||
YAP_FLAG(MAX_ARITY_FLAG, "max_arity", false, isatom, "unbounded", NULL),
|
||||
|
||||
YAP_FLAG(MAX_TAGGED_INTEGER_FLAG, "max_tagged_integer", false, at2n,
|
||||
"INT_MAX", NULL),
|
||||
@ -378,7 +367,14 @@ vxu `on` consider `$` a lower case character.
|
||||
YAP_FLAG(MAX_WORKERS_FLAG, "max_workers", false, at2n, "MAX_WORKERS", NULL),
|
||||
YAP_FLAG(MIN_TAGGED_INTEGER_FLAG, "min_tagged_integer", false, at2n,
|
||||
"INT_MIN", NULL),
|
||||
YAP_FLAG(N_OF_INTEGER_KEYS_IN_DB_FLAG, "n_of_integer_keys_in_db", false, ro,
|
||||
|
||||
|
||||
YAP_FLAG(MODULE_INDEPENDENT_OPERATORS_FLAG, "module_independent_operators",
|
||||
true, booleanFlag, "false", NULL),
|
||||
|
||||
|
||||
|
||||
YAP_FLAG(N_OF_INTEGER_KEYS_IN_DB_FLAG, "n_of_integer_keys_in_db", false, ro,
|
||||
"256", NULL),
|
||||
YAP_FLAG(OCCURS_CHECK_FLAG, "occurs_check", true, booleanFlag, "false",
|
||||
NULL),
|
||||
@ -407,8 +403,16 @@ vxu `on` consider `$` a lower case character.
|
||||
"true", NULL),
|
||||
|
||||
|
||||
YAP_FLAG(MODULE_INDEPENDENT_OPERATORS_FLAG, "module_independent_operators",
|
||||
true, booleanFlag, "false", NULL),
|
||||
/**< if defined, first location where YAP expects to find the YAP Prolog
|
||||
library. Takes precedence over library_directory */
|
||||
YAP_FLAG(PROLOG_LIBRARY_DIRECTORY_FLAG, "prolog_library_directory", true,
|
||||
isatom, "", NULL),
|
||||
|
||||
/**< if defined, first location where YAP expects to find the YAP Prolog
|
||||
shared libraries (DLLS). Takes precedence over executable_directory/2. */
|
||||
YAP_FLAG(PROLOG_FOREIGN_DIRECTORY_FLAG, "prolog_foreign_directory", true,
|
||||
isatom, "", NULL),
|
||||
|
||||
|
||||
YAP_FLAG(OPTIMISE_FLAG, "optimise", true, booleanFlag, "false", NULL),
|
||||
YAP_FLAG(OS_ARGV_FLAG, "os_argv", false, os_argv, "@boot", NULL),
|
||||
@ -566,7 +570,6 @@ and if it is bound to `off` disable them. The default for YAP is
|
||||
*/
|
||||
YAP_FLAG(TABLING_MODE_FLAG, "tabling_mode", true, isatom, "[]", NULL),
|
||||
|
||||
YAP_FLAG(THREADS_FLAG, "threads", false, ro, "MAX_THREADS", NULL),
|
||||
YAP_FLAG(TIMEZONE_FLAG, "timezone", false, ro, "18000", NULL),
|
||||
/**< `toplevel_hook `
|
||||
|
||||
|
@ -53,7 +53,7 @@ extern void Yap_ThrowError__(const char *file, const char *function, int lineno,
|
||||
;
|
||||
|
||||
#define Yap_NilError(id, ...) \
|
||||
Yap_Error__(false, __FILE__, __FUNCTION__, __LINE__, id, TermNil, __VA_ARGS__)
|
||||
Yap_Error__(false, __FILE__, __FUNCTION__, __LINE__, id, TermNil, __VA_ARGS__)
|
||||
|
||||
#define Yap_InitError(id, ...) \
|
||||
Yap_InitError__(__FILE__, __FUNCTION__, __LINE__, id, TermNil, __VA_ARGS__)
|
||||
|
@ -1,11 +1,9 @@
|
||||
set (LIBRARY_PL
|
||||
INDEX.pl
|
||||
apply.yap
|
||||
apply_macros.yap
|
||||
arg.yap
|
||||
assoc.yap
|
||||
atts.yap
|
||||
autoloader.yap
|
||||
avl.yap
|
||||
bhash.yap
|
||||
charsio.yap
|
||||
|
@ -120,10 +120,7 @@ find_predicate(G,ExportingModI) :-
|
||||
var(G),
|
||||
index(Name,Arity,ExportingModI,File),
|
||||
functor(G, Name, Arity),
|
||||
ensure_file_loaded(File).
|
||||
ensure_loaded(File).
|
||||
|
||||
:- ensure_loaded('INDEX').
|
||||
|
||||
ensure_file_loaded(File) :-
|
||||
loaded(File), !.
|
||||
ensure_file_loaded(File) :-
|
||||
load_files(autoloader:File,[silent(true),if(not_loaded)]),
|
||||
assert(loaded(File)).
|
||||
|
@ -705,7 +705,7 @@ scanl_([H1|T1], [H2|T2], [H3|T3], [H4|T4], Goal, V, [VH|VT]) :-
|
||||
|
||||
goal_expansion(checklist(Meta, List), Mod:Goal) :-
|
||||
goal_expansion_allowed,
|
||||
callable(Meta),
|
||||
is_callable(Meta),
|
||||
prolog_load_context(module, Mod),
|
||||
aux_preds(Meta, MetaVars, Pred, PredVars, Proto),
|
||||
!,
|
||||
@ -726,7 +726,7 @@ goal_expansion(checklist(Meta, List), Mod:Goal) :-
|
||||
|
||||
goal_expansion(maplist(Meta, List), Mod:Goal) :-
|
||||
goal_expansion_allowed,
|
||||
callable(Meta),
|
||||
is_callable(Meta),
|
||||
prolog_load_context(module, Mod),
|
||||
aux_preds(Meta, MetaVars, Pred, PredVars, Proto),
|
||||
!,
|
||||
@ -747,7 +747,7 @@ goal_expansion(maplist(Meta, List), Mod:Goal) :-
|
||||
|
||||
goal_expansion(maplist(Meta, ListIn, ListOut), Mod:Goal) :-
|
||||
goal_expansion_allowed,
|
||||
callable(Meta),
|
||||
is_callable(Meta),
|
||||
prolog_load_context(module, Mod),
|
||||
aux_preds(Meta, MetaVars, Pred, PredVars, Proto),
|
||||
!,
|
||||
@ -768,7 +768,7 @@ goal_expansion(maplist(Meta, ListIn, ListOut), Mod:Goal) :-
|
||||
|
||||
goal_expansion(maplist(Meta, L1, L2, L3), Mod:Goal) :-
|
||||
goal_expansion_allowed,
|
||||
callable(Meta),
|
||||
is_callable(Meta),
|
||||
prolog_load_context(module, Mod),
|
||||
aux_preds(Meta, MetaVars, Pred, PredVars, Proto),
|
||||
!,
|
||||
@ -789,7 +789,7 @@ goal_expansion(maplist(Meta, L1, L2, L3), Mod:Goal) :-
|
||||
|
||||
goal_expansion(maplist(Meta, L1, L2, L3, L4), Mod:Goal) :-
|
||||
goal_expansion_allowed,
|
||||
callable(Meta),
|
||||
is_callable(Meta),
|
||||
prolog_load_context(module, Mod),
|
||||
aux_preds(Meta, MetaVars, Pred, PredVars, Proto),
|
||||
!,
|
||||
@ -810,7 +810,7 @@ goal_expansion(maplist(Meta, L1, L2, L3, L4), Mod:Goal) :-
|
||||
|
||||
goal_expansion(maplist(Meta, L1, L2, L3, L4, L5), Mod:Goal) :-
|
||||
goal_expansion_allowed,
|
||||
callable(Meta),
|
||||
is_callable(Meta),
|
||||
prolog_load_context(module, Mod),
|
||||
aux_preds(Meta, MetaVars, Pred, PredVars, Proto),
|
||||
!,
|
||||
@ -831,7 +831,7 @@ goal_expansion(maplist(Meta, L1, L2, L3, L4, L5), Mod:Goal) :-
|
||||
|
||||
goal_expansion(selectlist(Meta, ListIn, ListOut), Mod:Goal) :-
|
||||
goal_expansion_allowed,
|
||||
callable(Meta),
|
||||
is_callable(Meta),
|
||||
prolog_load_context(module, Mod),
|
||||
aux_preds(Meta, MetaVars, Pred, PredVars, Proto),
|
||||
!,
|
||||
@ -854,7 +854,7 @@ goal_expansion(selectlist(Meta, ListIn, ListOut), Mod:Goal) :-
|
||||
|
||||
goal_expansion(selectlist(Meta, ListIn, ListIn1, ListOut), Mod:Goal) :-
|
||||
goal_expansion_allowed,
|
||||
callable(Meta),
|
||||
is_callable(Meta),
|
||||
prolog_load_context(module, Mod),
|
||||
aux_preds(Meta, MetaVars, Pred, PredVars, Proto),
|
||||
!,
|
||||
@ -877,7 +877,7 @@ goal_expansion(selectlist(Meta, ListIn, ListIn1, ListOut), Mod:Goal) :-
|
||||
|
||||
goal_expansion(selectlists(Meta, ListIn, ListIn1, ListOut, ListOut1), Mod:Goal) :-
|
||||
goal_expansion_allowed,
|
||||
callable(Meta),
|
||||
is_callable(Meta),
|
||||
prolog_load_context(module, Mod),
|
||||
aux_preds(Meta, MetaVars, Pred, PredVars, Proto),
|
||||
!,
|
||||
@ -901,7 +901,7 @@ goal_expansion(selectlists(Meta, ListIn, ListIn1, ListOut, ListOut1), Mod:Goal)
|
||||
% same as selectlist
|
||||
goal_expansion(include(Meta, ListIn, ListOut), Mod:Goal) :-
|
||||
goal_expansion_allowed,
|
||||
callable(Meta),
|
||||
is_callable(Meta),
|
||||
prolog_load_context(module, Mod),
|
||||
aux_preds(Meta, MetaVars, Pred, PredVars, Proto),
|
||||
!,
|
||||
@ -924,7 +924,7 @@ goal_expansion(include(Meta, ListIn, ListOut), Mod:Goal) :-
|
||||
|
||||
goal_expansion(exclude(Meta, ListIn, ListOut), Mod:Goal) :-
|
||||
goal_expansion_allowed,
|
||||
callable(Meta),
|
||||
is_callable(Meta),
|
||||
prolog_load_context(module, Mod),
|
||||
aux_preds(Meta, MetaVars, Pred, PredVars, Proto),
|
||||
!,
|
||||
@ -947,7 +947,7 @@ goal_expansion(exclude(Meta, ListIn, ListOut), Mod:Goal) :-
|
||||
|
||||
goal_expansion(partition(Meta, ListIn, List1, List2), Mod:Goal) :-
|
||||
goal_expansion_allowed,
|
||||
callable(Meta),
|
||||
is_callable(Meta),
|
||||
prolog_load_context(module, Mod),
|
||||
aux_preds(Meta, MetaVars, Pred, PredVars, Proto),
|
||||
!,
|
||||
@ -970,7 +970,7 @@ goal_expansion(partition(Meta, ListIn, List1, List2), Mod:Goal) :-
|
||||
|
||||
goal_expansion(partition(Meta, ListIn, List1, List2, List3), Mod:Goal) :-
|
||||
goal_expansion_allowed,
|
||||
callable(Meta),
|
||||
is_callable(Meta),
|
||||
prolog_load_context(module, Mod),
|
||||
aux_preds(Meta, MetaVars, Pred, PredVars, Proto),
|
||||
!,
|
||||
@ -1010,7 +1010,7 @@ goal_expansion(partition(Meta, ListIn, List1, List2, List3), Mod:Goal) :-
|
||||
|
||||
goal_expansion(convlist(Meta, ListIn, ListOut), Mod:Goal) :-
|
||||
goal_expansion_allowed,
|
||||
callable(Meta),
|
||||
is_callable(Meta),
|
||||
prolog_load_context(module, Mod),
|
||||
aux_preds(Meta, MetaVars, Pred, PredVars, Proto),
|
||||
!,
|
||||
@ -1033,7 +1033,7 @@ goal_expansion(convlist(Meta, ListIn, ListOut), Mod:Goal) :-
|
||||
|
||||
goal_expansion(convlist(Meta, ListIn, ListExtra, ListOut), Mod:Goal) :-
|
||||
goal_expansion_allowed,
|
||||
callable(Meta),
|
||||
is_callable(Meta),
|
||||
prolog_load_context(module, Mod),
|
||||
aux_preds(Meta, MetaVars, Pred, PredVars, Proto),
|
||||
!,
|
||||
@ -1056,7 +1056,7 @@ goal_expansion(convlist(Meta, ListIn, ListExtra, ListOut), Mod:Goal) :-
|
||||
|
||||
goal_expansion(sumlist(Meta, List, AccIn, AccOut), Mod:Goal) :-
|
||||
goal_expansion_allowed,
|
||||
callable(Meta),
|
||||
is_callable(Meta),
|
||||
prolog_load_context(module, Mod),
|
||||
aux_preds(Meta, MetaVars, Pred, PredVars, Proto),
|
||||
!,
|
||||
@ -1077,7 +1077,7 @@ goal_expansion(sumlist(Meta, List, AccIn, AccOut), Mod:Goal) :-
|
||||
|
||||
goal_expansion(foldl(Meta, List, AccIn, AccOut), Mod:Goal) :-
|
||||
goal_expansion_allowed,
|
||||
callable(Meta),
|
||||
is_callable(Meta),
|
||||
prolog_load_context(module, Mod),
|
||||
aux_preds(Meta, MetaVars, Pred, PredVars, Proto),
|
||||
!,
|
||||
@ -1098,7 +1098,7 @@ goal_expansion(foldl(Meta, List, AccIn, AccOut), Mod:Goal) :-
|
||||
|
||||
goal_expansion(foldl(Meta, List1, List2, AccIn, AccOut), Mod:Goal) :-
|
||||
goal_expansion_allowed,
|
||||
callable(Meta),
|
||||
is_callable(Meta),
|
||||
prolog_load_context(module, Mod),
|
||||
aux_preds(Meta, MetaVars, Pred, PredVars, Proto),
|
||||
!,
|
||||
@ -1119,7 +1119,7 @@ goal_expansion(foldl(Meta, List1, List2, AccIn, AccOut), Mod:Goal) :-
|
||||
|
||||
goal_expansion(foldl(Meta, List1, List2, List3, AccIn, AccOut), Mod:Goal) :-
|
||||
goal_expansion_allowed,
|
||||
callable(Meta),
|
||||
is_callable(Meta),
|
||||
prolog_load_context(module, Mod),
|
||||
aux_preds(Meta, MetaVars, Pred, PredVars, Proto),
|
||||
!,
|
||||
@ -1140,7 +1140,7 @@ goal_expansion(foldl(Meta, List1, List2, List3, AccIn, AccOut), Mod:Goal) :-
|
||||
|
||||
goal_expansion(foldl2(Meta, List, AccIn, AccOut, W0, W), Mod:Goal) :-
|
||||
goal_expansion_allowed,
|
||||
callable(Meta),
|
||||
is_callable(Meta),
|
||||
prolog_load_context(module, Mod),
|
||||
aux_preds(Meta, MetaVars, Pred, PredVars, Proto),
|
||||
!,
|
||||
@ -1161,7 +1161,7 @@ goal_expansion(foldl2(Meta, List, AccIn, AccOut, W0, W), Mod:Goal) :-
|
||||
|
||||
goal_expansion(foldl2(Meta, List1, List2, AccIn, AccOut, W0, W), Mod:Goal) :-
|
||||
goal_expansion_allowed,
|
||||
callable(Meta),
|
||||
is_callable(Meta),
|
||||
prolog_load_context(module, Mod),
|
||||
aux_preds(Meta, MetaVars, Pred, PredVars, Proto),
|
||||
!,
|
||||
@ -1182,7 +1182,7 @@ goal_expansion(foldl2(Meta, List1, List2, AccIn, AccOut, W0, W), Mod:Goal) :-
|
||||
|
||||
goal_expansion(foldl2(Meta, List1, List2, List3, AccIn, AccOut, W0, W), Mod:Goal) :-
|
||||
goal_expansion_allowed,
|
||||
callable(Meta),
|
||||
is_callable(Meta),
|
||||
prolog_load_context(module, Mod),
|
||||
aux_preds(Meta, MetaVars, Pred, PredVars, Proto),
|
||||
!,
|
||||
@ -1203,7 +1203,7 @@ goal_expansion(foldl2(Meta, List1, List2, List3, AccIn, AccOut, W0, W), Mod:Goal
|
||||
|
||||
goal_expansion(foldl3(Meta, List, AccIn, AccOut, W0, W, X0, X), Mod:Goal) :-
|
||||
goal_expansion_allowed,
|
||||
callable(Meta),
|
||||
is_callable(Meta),
|
||||
prolog_load_context(module, Mod),
|
||||
aux_preds(Meta, MetaVars, Pred, PredVars, Proto),
|
||||
!,
|
||||
@ -1224,7 +1224,7 @@ goal_expansion(foldl3(Meta, List, AccIn, AccOut, W0, W, X0, X), Mod:Goal) :-
|
||||
|
||||
goal_expansion(foldl4(Meta, List, AccIn, AccOut, W0, W, X0, X, Y0, Y), Mod:Goal) :-
|
||||
goal_expansion_allowed,
|
||||
callable(Meta),
|
||||
is_callable(Meta),
|
||||
prolog_load_context(module, Mod),
|
||||
aux_preds(Meta, MetaVars, Pred, PredVars, Proto),
|
||||
!,
|
||||
@ -1245,7 +1245,7 @@ goal_expansion(foldl4(Meta, List, AccIn, AccOut, W0, W, X0, X, Y0, Y), Mod:Goal)
|
||||
|
||||
goal_expansion(mapnodes(Meta, InTerm, OutTerm), Mod:Goal) :-
|
||||
goal_expansion_allowed,
|
||||
callable(Meta),
|
||||
is_callable(Meta),
|
||||
prolog_load_context(module, Mod),
|
||||
aux_preds(Meta, MetaVars, Pred, PredVars, Proto),
|
||||
!,
|
||||
@ -1277,7 +1277,7 @@ goal_expansion(mapnodes(Meta, InTerm, OutTerm), Mod:Goal) :-
|
||||
|
||||
goal_expansion(checknodes(Meta, Term), Mod:Goal) :-
|
||||
goal_expansion_allowed,
|
||||
callable(Meta),
|
||||
is_callable(Meta),
|
||||
prolog_load_context(module, Mod),
|
||||
aux_preds(Meta, MetaVars, Pred, PredVars, Proto),
|
||||
!,
|
||||
@ -1307,7 +1307,7 @@ goal_expansion(checknodes(Meta, Term), Mod:Goal) :-
|
||||
|
||||
goal_expansion(sumnodes(Meta, Term, AccIn, AccOut), Mod:Goal) :-
|
||||
goal_expansion_allowed,
|
||||
callable(Meta),
|
||||
is_callable(Meta),
|
||||
prolog_load_context(module, Mod),
|
||||
aux_preds(Meta, MetaVars, Pred, PredVars, Proto),
|
||||
!,
|
||||
|
@ -23,7 +23,7 @@ target_link_libraries(regexp libYap)
|
||||
|
||||
set_target_properties (regexp PROPERTIES PREFIX "")
|
||||
TARGET_INCLUDE_DIRECTORIES (regexp PUBLIC BEFORE
|
||||
${CMAKE_TOP_SOURCE_DIR}/include;${CMAKE_CURRENT_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR} )
|
||||
${CMAKE_SOURCE_DIR}/include;${CMAKE_CURRENT_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR} )
|
||||
|
||||
install(TARGETS regexp
|
||||
LIBRARY DESTINATION ${YAP_INSTALL_LIBDIR}
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
/* Define to 1 if you have the <openssl/ripemd.h> header file. */
|
||||
#ifndef HAVE_APR_1_APR_MD5_H
|
||||
#define HAVE_APR_1_APR_MD5_H 1
|
||||
/* #undef HAVE_APR_1_APR_MD5_H */
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -19,7 +19,10 @@ set (CLPQRPRIV clpqr/class.pl clpqr/dump.pl
|
||||
clpqr/project.pl clpqr/redund.pl)
|
||||
set (LIBPL clpr.pl clpq.pl ${CLPRPRIV} ${CLPQPRIV} ${CLPQRPRIV} )
|
||||
|
||||
install ( FILES ${YAP_INSTALL_DATADIR} DESTINATION ${YAP_INSTALL_DATADIR} )
|
||||
install ( FILES ${CLPQPRIV} DESTINATION ${YAP_INSTALL_DATADIR}/clpq )
|
||||
install ( FILES ${CLPRPRIV} DESTINATION ${YAP_INSTALL_DATADIR}/clpr )
|
||||
install ( FILES ${CLPQRPRIV} DESTINATION ${YAP_INSTALL_DATADIR}/clpqr )
|
||||
install ( FILES clpr.pl clpq.pl DESTINATION ${YAP_INSTALL_DATADIR} )
|
||||
|
||||
# $(PL) -q -f $(srcdir)/clpr_test.pl -g test,halt -t 'halt(1)'
|
||||
|
||||
|
@ -128,7 +128,7 @@ minimise variable _V_
|
||||
dump/3%, projecting_assert/1
|
||||
]).
|
||||
|
||||
:- expects_dialect(swi).
|
||||
%:- expects_dialect(swi).
|
||||
|
||||
%
|
||||
% Don't report export of private predicates from clpr
|
||||
|
@ -1,6 +1,6 @@
|
||||
# set(CMAKE_MACOSX_RPATH 1)
|
||||
|
||||
add_library(jplYap jpl.h jpl.c hacks.h)
|
||||
add_library(jplYap jpl.c)
|
||||
|
||||
include_directories (${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH2} ${JAVA_AWT_PATH} )
|
||||
|
||||
|
@ -635,9 +635,8 @@ PyObject *term_to_nametuple(const char *s, arity_t arity, PyObject *tuple) {
|
||||
typp = (PyTypeObject *)d;
|
||||
} else {
|
||||
PyStructSequence_Desc *desc = PyMem_Calloc(sizeof(PyStructSequence_Desc), 1);
|
||||
char *tnp;
|
||||
desc->name = tnp = PyMem_Malloc(strlen(s) + 1);
|
||||
strcpy(tnp, s);
|
||||
desc->name = PyMem_Malloc(strlen(s) + 1);
|
||||
strcpy((char *)desc->name, s);
|
||||
desc->doc = "YAPTerm";
|
||||
desc->fields = pnull;
|
||||
desc->n_in_sequence = arity;
|
||||
|
@ -1,16 +1,14 @@
|
||||
The YAP Prolog System {#main}
|
||||
===========
|
||||
|
||||
<center>
|
||||
![The YAP Logo](docs/icons/yap_128x128x32.png)
|
||||
</center>
|
||||
|
||||
NOTE: this version of YAP is still experimental, documentation may be out of date.
|
||||
|
||||
Introduction
|
||||
++++++++++
|
||||
## Introduction
|
||||
|
||||
This document provides User information on version 6.3.4 of
|
||||
YAP (*Yet Another Prolog*). The YAP Prolog System is a
|
||||
YAP (<em>Yet Another Prolog</em>). The YAP Prolog System is a
|
||||
high-performance Prolog compiler developed at Universidade do
|
||||
Porto. YAP supports stream Input/Output, sockets, modules,
|
||||
exceptions, Prolog debugger, C-interface, dynamic code, internal
|
||||
@ -18,6 +16,7 @@ Porto. YAP supports stream Input/Output, sockets, modules,
|
||||
|
||||
We explicitly allow both commercial and non-commercial use of YAP.
|
||||
|
||||
|
||||
YAP is based on the David H. D. Warren's WAM (Warren Abstract Machine),
|
||||
with several optimizations for better performance. YAP follows the
|
||||
Edinburgh tradition, and was originally designed to be largely
|
||||
@ -48,33 +47,47 @@ different licenses.
|
||||
|
||||
If you have a question about this software, desire to add code, found a
|
||||
bug, want to request a feature, or wonder how to get further assistance,
|
||||
please send e-mail to `yap-users AT lists.sourceforge.net. To
|
||||
subscribe to the mailing list, visit the [YAP Mailing list page](https://lists.sourceforge.net/lists/listinfo/yap-users).
|
||||
please send e-mail to <yap-users AT lists.sourceforge.net>. To
|
||||
subscribe to the mailing list, visit the page
|
||||
<https://lists.sourceforge.net/lists/listinfo/yap-users>.
|
||||
|
||||
On-line documentation is available for [YAP](http://www.dcc.fp.pt/~vsc/yap/)
|
||||
|
||||
|
||||
|
||||
The packages are, in alphabetical order:
|
||||
|
||||
+ The CHR package developed by Tom Schrijvers, Christian Holzbaur, and Jan Wielemaker.
|
||||
+ The CHR package developed by Tom Schrijvers,
|
||||
Christian Holzbaur, and Jan Wielemaker.
|
||||
|
||||
+ The CLP(BN) package and Horus toolkit developed by Tiago Gomes, and Vítor Santos Costa.
|
||||
|
||||
+ The CLP(R) package developed by Leslie De Koninck, Bart Demoen, Tom Schrijvers, and Jan Wielemaker, based on the CLP(Q,R) implementation by Christian Holzbaur.
|
||||
+ The CLP(R) package developed by Leslie De Koninck, Bart Demoen, Tom
|
||||
Schrijvers, and Jan Wielemaker, based on the CLP(Q,R) implementation
|
||||
by Christian Holzbaur.
|
||||
|
||||
+ The CPLint package developed by Fabrizio Riguzzi's research laboratory at the [University of Ferrara](http://www.ing.unife.it/Docenti/FabrizioRiguzzi/).
|
||||
+ The CPLint package developed by Fabrizio Riguzzi's research
|
||||
laboratory at the [University of Ferrara](http://www.ing.unife.it/Docenti/FabrizioRiguzzi/)
|
||||
|
||||
+ The CUDA interface package developed by Carlos Martínez, Jorge Buenabad, Inês Dutra and Vítor Santos Costa.
|
||||
+ The CUDA interface package developed by Carlos Martínez, Jorge
|
||||
Buenabad, Inês Dutra and Vítor Santos Costa.
|
||||
|
||||
+ The [GECODE](http://www.gecode.org) interface package developed by Denys Duchier and Vítor Santos Costa.
|
||||
|
||||
+ The [JPL](http://www.swi-prolog.org/packages/jpl/) (Java-Prolog Library) package developed by .
|
||||
|
||||
+ The minisat SAT solver interface developed by Michael Codish, Vitaly Lagoon, and Peter J. Stuckey.
|
||||
The minisat SAT solver interface developed by Michael Codish,
|
||||
Vitaly Lagoon, and Peter J. Stuckey.
|
||||
|
||||
+ The MYDDAS relational data-base interface developed at the Universidade do Porto by Tiago Soares, Michel Ferreira, and Ricardo Rocha.
|
||||
+ The MYDDAS relational data-base interface developed at the
|
||||
Universidade do Porto by Tiago Soares, Michel Ferreira, and Ricardo Rocha.
|
||||
|
||||
+ The [PRISM](http://rjida.meijo-u.ac.jp/prism/) logic-based programming system for statistical modeling developed at the Sato Research Laboratory, TITECH, Japan.
|
||||
+ The [PRISM](http://rjida.meijo-u.ac.jp/prism/) logic-based
|
||||
programming system for statistical modeling developed at the Sato
|
||||
Research Laboratory, TITECH, Japan.
|
||||
|
||||
+ The ProbLog 1 system developed by the [ProbLog](https://dtai.cs.kuleuven.be/problog) team in the DTAI group of KULeuven.
|
||||
+ The ProbLog 1 system developed by the [ProbLog](https://dtai.cs.kuleuven.be/problog) team in the
|
||||
DTAI group of KULeuven.
|
||||
|
||||
+ The [R](http://stoics.org.uk/~nicos/sware/packs/real/) interface package developed by Nicos Angelopoulos, Vítor Santos Costa, João Azevedo, Jan Wielemaker, and Rui Camacho.
|
||||
+ The [R](http://stoics.org.uk/~nicos/sware/packs/real/) interface package developed by Nicos Angelopoulos,
|
||||
Vítor Santos Costa, João Azevedo, Jan Wielemaker, and Rui Camacho.
|
||||
|
@ -65,11 +65,11 @@ if platform.system() == 'Windows':
|
||||
win_libs = ['wsock32','ws2_32']
|
||||
my_extra_link_args = ['-Wl,-export-all-symbols']
|
||||
elif platform.system() == 'Darwin':
|
||||
my_extra_link_args = ['-L','..','-Wl,-rpath,'+abspath(join(sysconfig.get_path('platlib'),'yap4py')),'-Wl,-rpath,/usr/local/lib','-Wl,-rpath,../yap4py']
|
||||
my_extra_link_args = ['-L','..','-Wl,-rpath,'+abspath(join(sysconfig.get_path('platlib'),'yap4py')),'-Wl,-rpath,/lib','-Wl,-rpath,../yap4py']
|
||||
win_libs = []
|
||||
local_libs = ['Py4YAP']
|
||||
elif platform.system() == 'Linux':
|
||||
my_extra_link_args = ['-L','..','-Wl,-rpath,'+abspath(join(sysconfig.get_path('platlib'),'yap4py')),'-Wl,-rpath,/usr/local/lib','-Wl,-rpath,'+join('/usr/local/lib','..'),'-Wl,-rpath,../yap4py']
|
||||
my_extra_link_args = ['-L','..','-Wl,-rpath,'+abspath(join(sysconfig.get_path('platlib'),'yap4py')),'-Wl,-rpath,/lib','-Wl,-rpath,'+join('/lib','..'),'-Wl,-rpath,../yap4py']
|
||||
win_libs = []
|
||||
local_libs = ['Py4YAP']
|
||||
|
||||
@ -91,10 +91,10 @@ extensions = [Extension('_yap', native_sources,
|
||||
('PYTHONSWIG', '1'),
|
||||
('_GNU_SOURCE', '1')],
|
||||
runtime_library_dirs=[
|
||||
abspath(join(sysconfig.get_path('platlib'),'yap4py')), abspath(sysconfig.get_path('platlib')),'/usr/local/lib'],
|
||||
abspath(join(sysconfig.get_path('platlib'),'yap4py')), abspath(sysconfig.get_path('platlib')),'/lib'],
|
||||
swig_opts=['-modern', '-c++', '-py3',
|
||||
'-DX_API', '-Iyap4py/include' ],
|
||||
library_dirs=[".",'../../..','/usr/local/lib'],
|
||||
library_dirs=[".",'../../..','/lib'],
|
||||
extra_link_args=my_extra_link_args,
|
||||
libraries=['Yap','gmp']+win_libs+local_libs,
|
||||
include_dirs=['/home/vsc/github/yap-6.3/H',
|
||||
|
@ -76,21 +76,21 @@ elseif(CMAKE_CROSSCOMPILING)
|
||||
)
|
||||
else ()
|
||||
add_custom_target(STARTUP ALL
|
||||
DEPENDS ${CMAKE_TOP_BINARY_DIR}/${YAP_STARTUP}
|
||||
DEPENDS ${CMAKE_BINARY_DIR}/${YAP_STARTUP}
|
||||
)
|
||||
add_custom_command(OUTPUT ${CMAKE_TOP_BINARY_DIR}/${YAP_STARTUP}
|
||||
COMMAND yap-bin -b
|
||||
add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/${YAP_STARTUP}
|
||||
COMMAND yap-bin -B ${CMAKE_SOURCE_DIR}/pl/boot.yap
|
||||
VERBATIM
|
||||
DEPENDS ${PL_BOOT_SOURCES} yap-bin
|
||||
)
|
||||
|
||||
# install(CODE "execute_process(COMMAND ./yap -B
|
||||
# WORKING_DIRECTORY ${CMAKE_TOP_BINARY_DIR})"
|
||||
# WORKING_DIRECTORY ${CMAKE_BINARY_DIR})"
|
||||
# DEPENDS Py4YAP ${PL_BOOT_SOURCES} yap-bin )
|
||||
|
||||
|
||||
install(FILES ${CMAKE_TOP_BINARY_DIR}/${YAP_STARTUP}
|
||||
DESTINATION ${YAP_INSTALL_DATADIR}/pl)
|
||||
install(FILES ${CMAKE_BINARY_DIR}/${YAP_STARTUP}
|
||||
DESTINATION ${YAP_INSTALL_LIBDIR})
|
||||
|
||||
endif()
|
||||
|
||||
|
@ -53,7 +53,6 @@ private(_).
|
||||
true/0], ['$$compile'/4,
|
||||
'$call'/4,
|
||||
'$catch'/3,
|
||||
'$check_callable'/2,
|
||||
'$check_head_and_body'/4,
|
||||
'$check_if_reconsulted'/2,
|
||||
'$clear_reconsulting'/0,
|
||||
@ -118,7 +117,7 @@ print_message(L,E) :-
|
||||
->
|
||||
true
|
||||
;
|
||||
error(_,Info),
|
||||
system_error(_,Info),
|
||||
'$error_descriptor'(Info, Desc),
|
||||
query_exception(prologPredFile, Desc, File),
|
||||
query_exception(prologPredLine, Desc, FilePos),
|
||||
@ -132,7 +131,7 @@ print_message(L,E) :-
|
||||
format(user_error,'~a:~d: error: undefined ~w~n:',[F,L,M:G]),
|
||||
fail
|
||||
;
|
||||
format(user_error,' call to ~w~n',[M:G]),
|
||||
format(user_error,' call to undefined procedure ~w~n',[M:G]),
|
||||
fail.
|
||||
|
||||
:- '$undefp_handler'('$undefp0'(_,_),prolog).
|
||||
|
209
pl/boot2.yap
Normal file
209
pl/boot2.yap
Normal file
@ -0,0 +1,209 @@
|
||||
/*************************************************************************
|
||||
* *
|
||||
* YAP Prolog *
|
||||
* *
|
||||
* Yap Prolog was developed at NCCUP - Universidade do Porto *
|
||||
* *
|
||||
* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-2014 *
|
||||
* *
|
||||
**************************************************************************
|
||||
* *
|
||||
* File: boot.yap *
|
||||
* Last rev: 8/2/88 *
|
||||
* mods: *
|
||||
* commen ts: boot file for Prolog *
|
||||
* *
|
||||
*************************************************************************/
|
||||
|
||||
/**
|
||||
@file boot2.yap
|
||||
@brief YAP bootstrap, now in full Prolog.
|
||||
|
||||
|
||||
@addtogroup TopLevel Top-Level and Boot Predicates
|
||||
|
||||
@ingroup builtins
|
||||
@{
|
||||
|
||||
|
||||
*/
|
||||
|
||||
|
||||
|
||||
:- meta_predicate(log_event(+,:)).
|
||||
|
||||
:- dynamic prolog:'$user_defined_flag'/4.
|
||||
|
||||
:- multifile prolog:debug_action_hook/1.
|
||||
|
||||
:- multifile prolog:'$system_predicate'/2.
|
||||
|
||||
:- '$opdec'(1150,fx,(mode),prolog).
|
||||
|
||||
:- dynamic 'extensions_to_present_answer'/1.
|
||||
|
||||
:- ['arrays.yap'].
|
||||
|
||||
:- multifile user:portray_message/2.
|
||||
|
||||
:- dynamic user:portray_message/2.
|
||||
|
||||
/** @pred prolog:goal_expansion( :G,+ M,- NG)
|
||||
@pred user:goalexpansion(+ G,+ M,- NG)
|
||||
|
||||
The goal_expansion/3 hook is an user-defined
|
||||
procedure that is called after term expansion when compiling or
|
||||
asserting goals for each sub-goal in a clause. The first argument is
|
||||
bound to the goal and the second to the module under which the goal
|
||||
_G_ will execute. If goal_expansion/3 succeeds the new
|
||||
sub-goal _NG_ will replace _G_ and will be processed in the same
|
||||
way. If goal_expansion/3 fails the system will use the default
|
||||
expandion mechanism.
|
||||
|
||||
This hook is called:
|
||||
- at compilation time;
|
||||
- when running a query in the top-level
|
||||
|
||||
Older versions of YAP would call this procedure at every meta-call.
|
||||
|
||||
|
||||
*/
|
||||
:- multifile user:goal_expansion/3.
|
||||
|
||||
:- dynamic user:goal_expansion/3.
|
||||
|
||||
:- multifile user:goal_expansion/2.
|
||||
|
||||
:- dynamic user:goal_expansion/2.
|
||||
|
||||
:- multifile system:goal_expansion/2.
|
||||
|
||||
:- dynamic system:goal_expansion/2.
|
||||
|
||||
:- multifile goal_expansion/2.
|
||||
|
||||
:- dynamic goal_expansion/2.
|
||||
|
||||
:- use_module('messages.yap').
|
||||
|
||||
:- ['undefined.yap'].
|
||||
|
||||
:- use_module('hacks.yap').
|
||||
|
||||
:- use_module('pathconf.yap').
|
||||
|
||||
|
||||
|
||||
:- use_module('attributes.yap').
|
||||
:- use_module('corout.yap').
|
||||
:- use_module('dialect.yap').
|
||||
:- use_module('dbload.yap').
|
||||
:- use_module('ypp.yap').
|
||||
:- use_module('../os/chartypes.yap').
|
||||
:- use_module('../os/edio.yap').
|
||||
|
||||
|
||||
yap_hacks:cut_by(CP) :- '$$cut_by'(CP).
|
||||
|
||||
:- '$change_type_of_char'(36,7). % Make $ a symbol character
|
||||
|
||||
:- set_prolog_flag(generate_debug_info,true).
|
||||
|
||||
%
|
||||
% cleanup ensure loaded and recover some data-base space.
|
||||
%
|
||||
%:- ( recorded('$lf_loaded',_,R), erase(R), fail ; true ).
|
||||
%:- ( recorded('$module',_,R), erase(R), fail ; true ).
|
||||
|
||||
:- set_value('$user_module',user), '$protect'.
|
||||
|
||||
:- style_check([+discontiguous,+multiple,+single_var]).
|
||||
|
||||
%
|
||||
% moved this to init_gc in sgc.c to separate the alpha
|
||||
%
|
||||
% :- yap_flag(gc,on).
|
||||
%
|
||||
% :- yap_flag(gc_trace,verbose`
|
||||
|
||||
:- multifile
|
||||
prolog:comment_hook/3.
|
||||
|
||||
:- source.
|
||||
|
||||
:- module(user).
|
||||
|
||||
:- current_prolog_flag(android,true)->use_module(user:'android.yap') ; true.
|
||||
|
||||
|
||||
/** @pred term_expansion( _T_,- _X_)
|
||||
user:term_expansion( _T_,- _X_)
|
||||
|
||||
|
||||
This user-defined predicate is called by `expand_term/3` to
|
||||
preprocess all terms read when consulting a file. If it succeeds:
|
||||
|
||||
+
|
||||
If _X_ is of the form `:- G` or `?- G`, it is processed as
|
||||
a directive.
|
||||
+
|
||||
If _X_ is of the form `$source_location`( _File_, _Line_): _Clause_` it is processed as if from `File` and line `Line`.
|
||||
|
||||
+
|
||||
If _X_ is a list, all terms of the list are asserted or processed
|
||||
as directives.
|
||||
+ The term _X_ is asserted instead of _T_.
|
||||
|
||||
*/
|
||||
:- multifile term_expansion/2.
|
||||
|
||||
:- dynamic term_expansion/2.
|
||||
|
||||
:- multifile system:term_expansion/2.
|
||||
|
||||
:- dynamic system:term_expansion/2.
|
||||
|
||||
:- multifile system:swi_predicate_table/4.
|
||||
|
||||
/** @pred user:message_hook(+ _Term_, + _Kind_, + _Lines_)
|
||||
|
||||
|
||||
Hook predicate that may be define in the module `user` to intercept
|
||||
messages from print_message/2. _Term_ and _Kind_ are the
|
||||
same as passed to print_message/2. _Lines_ is a list of
|
||||
format statements as described with print_message_lines/3.
|
||||
|
||||
This predicate should be defined dynamic and multifile to allow other
|
||||
modules defining clauses for it too.
|
||||
|
||||
|
||||
*/
|
||||
:- multifile user:message_hook/3.
|
||||
|
||||
:- dynamic user:message_hook/3.
|
||||
|
||||
/** @pred exception(+ _Exception_, + _Context_, - _Action_)
|
||||
|
||||
|
||||
Dynamic predicate, normally not defined. Called by the Prolog system on run-time exceptions that can be repaired `just-in-time`. The values for _Exception_ are described below. See also catch/3 and throw/1.
|
||||
If this hook preodicate succeeds it must instantiate the _Action_ argument to the atom `fail` to make the operation fail silently, `retry` to tell Prolog to retry the operation or `error` to make the system generate an exception. The action `retry` only makes sense if this hook modified the environment such that the operation can now succeed without error.
|
||||
|
||||
+ `undefined_predicate`
|
||||
_Context_ is instantiated to a predicate-indicator ( _Module:Name/Arity_). If the predicate fails Prolog will generate an existence_error exception. The hook is intended to implement alternatives to the SWI built-in autoloader, such as autoloading code from a database. Do not use this hook to suppress existence errors on predicates. See also `unknown`.
|
||||
+ `undefined_global_variable`
|
||||
_Context_ is instantiated to the name of the missing global variable. The hook must call nb_setval/2 or b_setval/2 before returning with the action retry.
|
||||
|
||||
*/
|
||||
|
||||
:- module(user).
|
||||
|
||||
|
||||
:- multifile user:exception/3.
|
||||
|
||||
:- dynamic user:exception/3.
|
||||
|
||||
|
||||
:- set_prolog_flag(unknown,error).
|
||||
|
||||
%% @}
|
||||
|
@ -265,7 +265,7 @@ load_files(Files0,Opts) :-
|
||||
'$lf_option'(sandboxed, 24, false).
|
||||
'$lf_option'(scope_settings, 25, false).
|
||||
'$lf_option'(modified, 26, _).
|
||||
'$lf_option'('$context_module', 27, _).
|
||||
'$lf_option'(source_module, 27, _).
|
||||
'$lf_option'('$parent_topts', 28, _).
|
||||
'$lf_option'(must_be_module, 29, false).
|
||||
'$lf_option'('$source_pos', 30, _).
|
||||
@ -317,12 +317,12 @@ load_files(Files0,Opts) :-
|
||||
'__NB_getval__'('$lf_status', OldTOpts, fail),
|
||||
nonvar(OldTOpts), functor( OldTOpts, opt, LastOpt ),
|
||||
'$lf_opt'(autoload, OldTOpts, OldAutoload),
|
||||
'$lf_opt'('$context_module', OldTOpts, OldContextModule)
|
||||
'$lf_opt'(source_module, OldTOpts, OldContextModule)
|
||||
;
|
||||
current_prolog_flag(autoload, OldAutoload),
|
||||
functor( OldTOpts, opt, LastOpt ),
|
||||
'$lf_opt'(autoload, OldTOpts, OldAutoload),
|
||||
'$lf_opt'('$context_module', OldTOpts, OldContextModule)
|
||||
'$lf_opt'(source_module, OldTOpts, OldContextModule)
|
||||
),
|
||||
functor( TOpts, opt, LastOpt ),
|
||||
( source_location(ParentF, Line) -> true ; ParentF = user_input, Line = -1 ),
|
||||
@ -448,7 +448,7 @@ load_files(Files0,Opts) :-
|
||||
( Val == false -> true ;
|
||||
Val == true -> true ;
|
||||
'$do_error'(domain_error(unimplemented_option,register(Val)),Call) ).
|
||||
'$process_lf_opt'('$context_module', Mod, Call) :-
|
||||
'$process_lf_opt'(source_module, Mod, Call) :-
|
||||
( atom(Mod) -> true ; '$do_error'(type_error(atom,Mod),Call) ).
|
||||
|
||||
|
||||
@ -724,7 +724,7 @@ db_files(Fs) :-
|
||||
set_stream( Stream, [alias(loop_stream), encoding(Encoding)] ),
|
||||
'__NB_getval__'('$loop_streams',Sts0, Sts0=[]),
|
||||
nb_setval('$loop_streams',[Stream|Sts0]),
|
||||
'$lf_opt'('$context_module', TOpts, ContextModule),
|
||||
'$lf_opt'(source_module, TOpts, ContextModule),
|
||||
'$lf_opt'(reexport, TOpts, Reexport),
|
||||
'$lf_opt'(qcompile, TOpts, QCompiling),
|
||||
'__NB_getval__'('$qcompile', ContextQCompiling, ContextQCompiling = never),
|
||||
@ -1359,7 +1359,7 @@ account the following observations:
|
||||
'$reexport'( TOpts, File, Reexport, Imports, OldF ) :-
|
||||
( Reexport == false -> true ;
|
||||
( '$lf_opt'('$parent_topts', TOpts, OldTOpts),
|
||||
'$lf_opt'('$context_module', OldTOpts, OldContextModule)
|
||||
'$lf_opt'(source_module, OldTOpts, OldContextModule)
|
||||
->
|
||||
true
|
||||
;
|
||||
|
@ -477,7 +477,7 @@ be lost.
|
||||
'$trace_goal'(G, M, GoalNumber, H) :-
|
||||
'$undefined'(G, M),
|
||||
!,
|
||||
'$get_undefined_pred'(G, M, Goal, NM),
|
||||
'$get_undefined_pred'(M:G, NM:Goal),
|
||||
( ( M == NM ; NM == prolog), G == Goal
|
||||
->
|
||||
yap_flag( unknown, Action ),
|
||||
|
35
pl/error.yap
35
pl/error.yap
@ -10,8 +10,10 @@
|
||||
[ must_be_of_type/2, % +Type, +Term
|
||||
must_be_of_type/3, % +Type, +Term, +Comment
|
||||
must_be/2, % +Type, +Term
|
||||
must_be_callable/1, % +Type, +Term
|
||||
must_be/3, % +Type, +Term, +Comment
|
||||
type_error/2, % +Type, +Term
|
||||
must_be_called/1,
|
||||
% must_be_in_domain/2, % +Domain, +Term
|
||||
% must_be_in_domain/3, % +Domain, +Term, +Comment
|
||||
domain_error/3, % +Domain, +Values, +Term
|
||||
@ -21,7 +23,9 @@
|
||||
must_bind_to_type/2, % +Type, ?Term
|
||||
instantiation_error/1, % +Term
|
||||
representation_error/1, % +Reason
|
||||
is_of_type/2 % +Type, +Term
|
||||
is_of_type/2, % +Type, +Term
|
||||
is_callable/1,
|
||||
is_callable/2
|
||||
]), []) .
|
||||
|
||||
/**
|
||||
@ -104,13 +108,13 @@ must_be(Type, X, Comment) :-
|
||||
|
||||
must_be_of_type(callable, X) :-
|
||||
!,
|
||||
is_callable(X, _).
|
||||
is_callable(X).
|
||||
must_be_of_type(atom, X) :-
|
||||
!,
|
||||
is_atom(X, _).
|
||||
is_atom(X).
|
||||
must_be_of_type(module, X) :-
|
||||
!,
|
||||
is_atom(X, _).
|
||||
is_atom(X).
|
||||
must_be_of_type(predicate_indicator, X) :-
|
||||
!,
|
||||
is_predicate_indicator(X, _).
|
||||
@ -120,19 +124,12 @@ must_be_of_type(Type, X) :-
|
||||
; is_not(Type, X)
|
||||
).
|
||||
|
||||
inline(must_be_of_type( atom, X ), is_atom(X, _) ).
|
||||
inline(must_be_of_type( module, X ), is_module(X, _) ).
|
||||
inline(must_be_of_type( callable, X ), is_callable(X, _) ).
|
||||
inline(must_be_of_type( callable, X ), is_callable(X, _) ).
|
||||
inline(must_be_atom( X ), is_callable(X, _) ).
|
||||
inline(must_be_module( X ), is_atom(X, _) ).
|
||||
|
||||
must_be_of_type(predicate_indicator, X, Comment) :-
|
||||
!,
|
||||
is_predicate_indicator(X, Comment).
|
||||
must_be_of_type(callable, X, Comment) :-
|
||||
must_be_of_type(callable, X, _Comment) :-
|
||||
!,
|
||||
is_callable(X, Comment).
|
||||
is_callable(X).
|
||||
must_be_of_type(Type, X, _Comment) :-
|
||||
( has_type(Type, X)
|
||||
-> true
|
||||
@ -335,4 +332,16 @@ must_be_instantiated(X) :-
|
||||
must_be_instantiated(X, Comment) :-
|
||||
( var(X) -> instantiation_error(X, Comment) ; true).
|
||||
|
||||
must_be_callable(X) :-
|
||||
is_callable(X).
|
||||
|
||||
|
||||
inline(must_be_of_type( atom, X ), is_atom(X) ).
|
||||
inline(must_be_of_type( module, X ), is_atom(X) ).
|
||||
inline(must_be_of_type( callable, X ), is_callable(X) ).
|
||||
inline(must_be_atom( X ), is_atom(X) ).
|
||||
inline(must_be_module( X ), is_atom(X) ).
|
||||
inline(must_be_callable( X ), is_callable(X) ).
|
||||
inline(is_callable( X,_ ), is_callable(X) ).
|
||||
|
||||
%% @}
|
||||
|
@ -60,7 +60,7 @@ fail.
|
||||
|
||||
%
|
||||
'$get_undefined_pred'(ImportingMod:G, ExportingMod:G0) :-
|
||||
must_be_callablle( ImportingMod:G ),
|
||||
must_be_callable( ImportingMod:G ),
|
||||
'$get_undefined_predicates'(ImportingMod:G, ExportingMod:G0).
|
||||
|
||||
% be careful here not to generate an undefined exception.
|
||||
@ -94,7 +94,7 @@ fail.
|
||||
'$verify_import'(_M:G, prolog:G) :-
|
||||
'$is_system_predicate'(G, prolog).
|
||||
'$verify_import'(M:G, NM:NG) :-
|
||||
'$get_undefined_pred'(G, M, NG, NM),
|
||||
'$get_undefined_predicates'(M:G, M, NM:NG),
|
||||
!.
|
||||
'$verify_import'(MG, MG).
|
||||
|
||||
@ -111,8 +111,13 @@ fail.
|
||||
functor(G0, N, K),
|
||||
'$autoloader_find_predicate'(G0,ExportingMod),
|
||||
ExportingMod \= ImportingMod,
|
||||
% assert_static(ExportingMod:G0 :- ImportingMod:G0),
|
||||
(recordzifnot('$import','$import'(ExportingMod,ImportingMod,G0,G0, N ,K),_) -> true ; true ).
|
||||
(recordzifnot('$import','$import'(ExportingMod,ImportingMod,G0,G0, N ,K),_),
|
||||
\+ '$system_predicate'(G0,prolog)
|
||||
->
|
||||
'$compile'((G:-ExportingMod:G0), reconsult ,(ImportingMod:G:-ExportingMod:G0), ImportingMod, _)
|
||||
;
|
||||
true
|
||||
).
|
||||
|
||||
|
||||
'$autoloader_find_predicate'(G,ExportingMod) :-
|
||||
@ -122,10 +127,7 @@ fail.
|
||||
yap_flag(autoload, true, false),
|
||||
yap_flag( unknown, Unknown, fail),
|
||||
yap_flag(debug, Debug, false), !,
|
||||
load_files([library(autoloader),
|
||||
autoloader:library('NDEX'),
|
||||
swi:library('dialect/swi/NDEX')],
|
||||
[autoload(true),if(not_loaded)]),
|
||||
load_files([library(autoloader)],[silent(true)]),
|
||||
nb_setval('$autoloader_set', true),
|
||||
yap_flag(autoload, _, true),
|
||||
yap_flag( unknown, _, Unknown),
|
||||
|
@ -302,7 +302,7 @@ use_module(F,Is) :-
|
||||
% and remove import.
|
||||
%
|
||||
'$not_imported'(H, Mod) :-
|
||||
recorded('$import','$import'(NM,Mod,NH,H,_,_),R),
|
||||
recorded('$import','$import'(NM,Mod,NH,H,_,_),R),
|
||||
NM \= Mod,
|
||||
functor(NH,N,Ar),
|
||||
print_message(warning,redefine_imported(Mod,NM,N/Ar)),
|
||||
@ -470,10 +470,14 @@ export_list(Module, List) :-
|
||||
G1=..[N1|Args],
|
||||
( '$check_import'(M0,ContextMod,N1,K) ->
|
||||
( ContextMod == prolog ->
|
||||
recordzifnot('$import','$import'(M0,user,G0,G1,N1,K),_),
|
||||
fail
|
||||
recordzifnot('$import','$import'(M0,user,G0,G1,N1,K),_),
|
||||
\+ '$is_system_predicate'(G1, prolog),
|
||||
'$compile'((G1:-M0:G0), reconsult,(user:G1:-M0:G0) , user, R),
|
||||
fail
|
||||
;
|
||||
recordaifnot('$import','$import'(M0,ContextMod,G0,G1,N1,K),_),
|
||||
\+ '$is_system_predicate'(G1, prolog),
|
||||
'$compile'((G1:-M0:G0), reconsult,(ContextMod:G1:-M0:G0) , ContextMod, R),
|
||||
fail
|
||||
;
|
||||
true
|
||||
@ -535,7 +539,7 @@ other source modules.
|
||||
This built-in was introduced by SWI-Prolog. In YAP, by default, modules only
|
||||
inherit from `prolog`. This extension allows predicates in the current
|
||||
module (see module/2 and module/1) to inherit from `user` or other modules.
|
||||
|
||||
x2
|
||||
*/
|
||||
set_base_module(ExportingModule) :-
|
||||
var(ExportingModule),
|
||||
|
@ -248,7 +248,7 @@ Retract all the clauses whose head matches the goal _G_. Goal
|
||||
*/
|
||||
retractall(V) :-
|
||||
'$yap_strip_module'(V,M,P),
|
||||
is_callable(M,P),
|
||||
is_callable(M:P),
|
||||
'$retractall'(P,M).
|
||||
|
||||
'$retractall'(T,M) :-
|
||||
|
183
pl/preds.yap
183
pl/preds.yap
@ -248,163 +248,55 @@ nth_clause(V,I,R) :-
|
||||
'$nth_clause'(P,M,I,R) :-
|
||||
'$fetch_nth_clause'(P,M,I,R).
|
||||
|
||||
|
||||
/**
|
||||
@pred abolish(+ _PredSpec_) is iso
|
||||
|
||||
|
||||
Deletes the predicate given by _PredSpec_ from the database. All
|
||||
state on the predicate, including whether it is dynamic or static,
|
||||
multifile, or meta-predicate, will be lost. The specification must
|
||||
include the name and arity, and it may include module
|
||||
information. Under <tt>iso</tt> language mode this built-in will only
|
||||
abolish dynamic procedures. Under other modes it will abolish any
|
||||
procedures.
|
||||
|
||||
Older versions of YAP would accept unbound arguments; please use
|
||||
current_predicate/2 to enumerate the predicates you want to discard.
|
||||
|
||||
*/
|
||||
abolish(X) :-
|
||||
get_predicate_indicator(X, M, Na, Ar),
|
||||
functor(H, Na, Ar),
|
||||
( '$is_dynamic'(H, M) -> '$abolishd'(H, M) ;
|
||||
'$undefined'(H, M) -> true ;
|
||||
current_prolog_flag(language, iso) -> '$do_error'(permission_error(modify,static_procedure,Na/Ar),abolish(X)) ;
|
||||
'$abolishs'(H,M)
|
||||
).
|
||||
|
||||
/** @pred abolish(+ _P_,+ _N_)
|
||||
|
||||
Completely delete the predicate with name _P_ and arity _N_. It will
|
||||
remove both static and dynamic predicates. All state on the predicate,
|
||||
including whether it is dynamic or static, multifile, or
|
||||
meta-predicate, will be lost.
|
||||
*/
|
||||
abolish(N0,A) :-
|
||||
strip_module(N0, Mod, N), !,
|
||||
'$abolish'(N,A,Mod).
|
||||
|
||||
'$abolish'(N,A,M) :- var(N), !,
|
||||
'$do_error'(instantiation_error,abolish(M:N,A)).
|
||||
'$abolish'(N,A,M) :- var(A), !,
|
||||
'$do_error'(instantiation_error,abolish(M:N,A)).
|
||||
'$abolish'(N,A,M) :-
|
||||
( recorded('$predicate_defs','$predicate_defs'(N,A,M,_),R) -> erase(R) ),
|
||||
fail.
|
||||
'$abolish'(N,A,M) :- functor(T,N,A),
|
||||
( '$is_dynamic'(T, M) -> '$abolishd'(T,M) ;
|
||||
/* else */ '$abolishs'(T,M) ).
|
||||
|
||||
/** @pred abolish(+ _PredSpec_) is iso
|
||||
|
||||
|
||||
Deletes the predicate given by _PredSpec_ from the database. If
|
||||
§§ _PredSpec_ is an unbound variable, delete all predicates for the
|
||||
current module. The
|
||||
specification must include the name and arity, and it may include module
|
||||
information. Under <tt>iso</tt> language mode this built-in will only abolish
|
||||
dynamic procedures. Under other modes it will abolish any procedures.
|
||||
|
||||
abolish/2 is similar to abolish/1, but it always tries to erase static properties. It should not be confused with SICStus Prolog abolish/2, which is abolish/1 plus a list of options.
|
||||
|
||||
*/
|
||||
abolish(X0) :-
|
||||
strip_module(X0,M,X),
|
||||
'$abolish'(X,M).
|
||||
|
||||
'$abolish'(X,M) :-
|
||||
current_prolog_flag(language, sicstus), !,
|
||||
'$new_abolish'(X,M).
|
||||
'$abolish'(X, M) :-
|
||||
'$old_abolish'(X,M).
|
||||
|
||||
'$new_abolish'(V,M) :- var(V), !,
|
||||
'$abolish_all_in_module'(M).
|
||||
'$new_abolish'(A/V,M) :- atom(A), var(V), !,
|
||||
'$abolish_all_atoms'(A,M).
|
||||
'$new_abolish'(Na//Ar1, M) :-
|
||||
integer(Ar1),
|
||||
!,
|
||||
Ar is Ar1+2,
|
||||
'$new_abolish'(Na//Ar, M).
|
||||
'$new_abolish'(Na/Ar, M) :-
|
||||
abolish(N,A) :-
|
||||
get_predicate_indicator(N/A, M, Na, Ar),
|
||||
functor(H, Na, Ar),
|
||||
'$is_dynamic'(H, M), !,
|
||||
'$abolishd'(H, M).
|
||||
'$new_abolish'(Na/Ar, M) :- % succeed for undefined procedures.
|
||||
functor(T, Na, Ar),
|
||||
'$undefined'(T, M), !.
|
||||
'$new_abolish'(Na/Ar, M) :-
|
||||
'$do_error'(permission_error(modify,static_procedure,Na/Ar),abolish(M:Na/Ar)).
|
||||
'$new_abolish'(T, M) :-
|
||||
'$do_error'(type_error(predicate_indicator,T),abolish(M:T)).
|
||||
( '$is_dynamic'(H, M) -> '$abolishd'(H, M) ;
|
||||
'$undefined'(H, M) -> true ;
|
||||
'$abolishs'(H,M)
|
||||
).
|
||||
|
||||
'$abolish_all_in_module'(M) :-
|
||||
'$current_predicate'(Na, M, S, _),
|
||||
functor(S, Na, Ar),
|
||||
'$new_abolish'(Na/Ar, M),
|
||||
fail.
|
||||
'$abolish_all_in_module'(_).
|
||||
|
||||
'$abolish_all_atoms'(Na, M) :-
|
||||
'$current_predicate'(Na,M,S,_),
|
||||
functor(S, Na, Ar),
|
||||
'$new_abolish'(Na/Ar, M),
|
||||
fail.
|
||||
'$abolish_all_atoms'(_,_).
|
||||
|
||||
'$check_error_in_predicate_indicator'(V, Msg) :-
|
||||
var(V), !,
|
||||
'$do_error'(instantiation_error, Msg).
|
||||
'$check_error_in_predicate_indicator'(M:S, Msg) :- !,
|
||||
'$check_error_in_module'(M, Msg),
|
||||
'$check_error_in_predicate_indicator'(S, Msg).
|
||||
'$check_error_in_predicate_indicator'(S, Msg) :-
|
||||
S \= _/_,
|
||||
S \= _//_, !,
|
||||
'$do_error'(type_error(predicate_indicator,S), Msg).
|
||||
'$check_error_in_predicate_indicator'(Na/_, Msg) :-
|
||||
var(Na), !,
|
||||
'$do_error'(instantiation_error, Msg).
|
||||
'$check_error_in_predicate_indicator'(Na/_, Msg) :-
|
||||
\+ atom(Na), !,
|
||||
'$do_error'(type_error(atom,Na), Msg).
|
||||
'$check_error_in_predicate_indicator'(_/Ar, Msg) :-
|
||||
var(Ar), !,
|
||||
'$do_error'(instantiation_error, Msg).
|
||||
'$check_error_in_predicate_indicator'(_/Ar, Msg) :-
|
||||
\+ integer(Ar), !,
|
||||
'$do_error'(type_error(integer,Ar), Msg).
|
||||
'$check_error_in_predicate_indicator'(_/Ar, Msg) :-
|
||||
Ar < 0, !,
|
||||
'$do_error'(domain_error(not_less_than_zero,Ar), Msg).
|
||||
% not yet implemented!
|
||||
%'$check_error_in_predicate_indicator'(Na/Ar, Msg) :-
|
||||
% Ar < maxarity, !,
|
||||
% '$do_error'(type_error(representation_error(max_arity),Ar), Msg).
|
||||
|
||||
'$check_error_in_module'(M, Msg) :-
|
||||
var(M), !,
|
||||
'$do_error'(instantiation_error, Msg).
|
||||
'$check_error_in_module'(M, Msg) :-
|
||||
\+ atom(M), !,
|
||||
'$do_error'(type_error(atom,M), Msg).
|
||||
|
||||
'$old_abolish'(V,M) :- var(V), !,
|
||||
( true -> % current_prolog_flag(language, sicstus) ->
|
||||
'$do_error'(instantiation_error,abolish(M:V))
|
||||
;
|
||||
'$abolish_all_old'(M)
|
||||
).
|
||||
'$old_abolish'(N/A, M) :- !,
|
||||
'$abolish'(N, A, M).
|
||||
'$old_abolish'(A,M) :- atom(A), !,
|
||||
( current_prolog_flag(language, iso) ->
|
||||
'$do_error'(type_error(predicate_indicator,A),abolish(M:A))
|
||||
;
|
||||
'$abolish_all_atoms_old'(A,M)
|
||||
).
|
||||
'$old_abolish'([], _) :- !.
|
||||
'$old_abolish'([H|T], M) :- !, '$old_abolish'(H, M), '$old_abolish'(T, M).
|
||||
'$old_abolish'(T, M) :-
|
||||
'$do_error'(type_error(predicate_indicator,T),abolish(M:T)).
|
||||
|
||||
'$abolish_all_old'(M) :-
|
||||
'$current_predicate'(Na, M, S, _),
|
||||
functor( S, Na, Ar ),
|
||||
'$abolish'(Na, Ar, M),
|
||||
fail.
|
||||
'$abolish_all_old'(_).
|
||||
|
||||
'$abolish_all_atoms_old'(Na, M) :-
|
||||
'$current_predicate'(Na, M, S, _),
|
||||
functor(S, Na, Ar),
|
||||
'$abolish'(Na, Ar, M),
|
||||
fail.
|
||||
'$abolish_all_atoms_old'(_,_).
|
||||
|
||||
'$abolishs'(G, M) :- '$system_predicate'(G,M), !,
|
||||
functor(G,Name,Arity),
|
||||
'$do_error'(permission_error(modify,static_procedure,Name/Arity),abolish(M:G)).
|
||||
'$abolishs'(G, Module) :-
|
||||
current_prolog_flag(language, sicstus), % only do this in sicstus mode
|
||||
'$undefined'(G, Module),
|
||||
'$abolishs'(G, M) :-
|
||||
'$system_predicate'(G,M), !,
|
||||
functor(G,Name,Arity),
|
||||
print_message(warning,no_match(abolish(Module:Name/Arity))).
|
||||
'$do_error'(permission_error(modify,static_procedure,Name/Arity),abolish(M:G)).
|
||||
'$abolishs'(G, M) :-
|
||||
'$is_multifile'(G,M),
|
||||
functor(G,Name,Arity),
|
||||
@ -420,6 +312,7 @@ abolish(X0) :-
|
||||
'$purge_clauses'(G, M), fail.
|
||||
'$abolishs'(_, _).
|
||||
|
||||
|
||||
/** @pred stash_predicate(+ _Pred_)
|
||||
Make predicate _Pred_ invisible to new code, and to `current_predicate/2`,
|
||||
`listing`, and friends. New predicates with the same name and
|
||||
@ -509,7 +402,7 @@ predicate_property(Pred,Prop) :-
|
||||
M = Mod,
|
||||
NPred = TruePred
|
||||
;
|
||||
'$get_undefined_pred'(TruePred, Mod, NPred, M)
|
||||
'$get_undefined_pred'(Mod:TruePred, M:NPred)
|
||||
),
|
||||
'$predicate_property'(NPred,M,Mod,Prop).
|
||||
|
||||
|
@ -73,7 +73,7 @@ for MS-Windows.
|
||||
'$thread_gfetch'/1,
|
||||
'$thread_local'/2]).
|
||||
|
||||
:- use_system_module( '$_boot', ['$check_callable'/2,
|
||||
:- use_system_module( '$_boot', [
|
||||
'$run_at_thread_start'/0,
|
||||
'$system_catch'/4]).
|
||||
|
||||
@ -162,7 +162,7 @@ Create a new Prolog detached thread using default options. See thread_create/3.
|
||||
*/
|
||||
thread_create(Goal) :-
|
||||
G0 = thread_create(Goal),
|
||||
'$check_callable'(Goal, G0),
|
||||
is_callable(Goal),
|
||||
'$thread_options'([detached(true)], [], Stack, Trail, System, Detached, AtExit, G0),
|
||||
'$thread_new_tid'(Id),
|
||||
% '$erase_thread_info'(Id), % this should not be here
|
||||
@ -184,7 +184,7 @@ Create a new Prolog thread using default options. See thread_create/3.
|
||||
*/
|
||||
thread_create(Goal, Id) :-
|
||||
G0 = thread_create(Goal, Id),
|
||||
'$check_callable'(Goal, G0),
|
||||
is_callable(Goal),
|
||||
( nonvar(Id) -> '$do_error'(uninstantiation_error(Id),G0) ; true ),
|
||||
'$thread_options'([], [], Stack, Trail, System, Detached, AtExit, G0),
|
||||
'$thread_new_tid'(Id),
|
||||
@ -243,7 +243,7 @@ data from their stacks.
|
||||
*/
|
||||
thread_create(Goal, Id, Options) :-
|
||||
G0 = thread_create(Goal, Id, Options),
|
||||
'$check_callable'(Goal,G0),
|
||||
is_callable(Goal),
|
||||
( nonvar(Id) -> '$do_error'(uninstantiation_error(Id),G0) ; true ),
|
||||
'$thread_options'(Options, Alias, Stack, Trail, System, Detached, AtExit, G0),
|
||||
'$thread_new_tid'(Id),
|
||||
@ -564,7 +564,7 @@ using instead the `at_exit/1` option of thread_create/3.
|
||||
|
||||
*/
|
||||
thread_at_exit(Goal) :-
|
||||
'$check_callable'(Goal,thread_at_exit(Goal)),
|
||||
is_callable(Goal),
|
||||
'$thread_self'(Id0),
|
||||
recordz('$thread_exit_hook',[Id0|Goal],_).
|
||||
|
||||
@ -1284,7 +1284,7 @@ thread_sleep(Time) :-
|
||||
|
||||
thread_signal(Id, Goal) :-
|
||||
'$check_thread_or_alias'(Id, thread_signal(Id, Goal)),
|
||||
'$check_callable'(Goal, thread_signal(Id, Goal)),
|
||||
is_callable(Goal),
|
||||
'$thread_id_alias'(Id0, Id),
|
||||
( recorded('$thread_signal', [Id0| _], R), erase(R), fail
|
||||
; true
|
||||
|
21
pl/top.yap
21
pl/top.yap
@ -731,19 +731,6 @@ write_query_answer( Bindings ) :-
|
||||
% */
|
||||
'$execute0'(G, CurMod).
|
||||
|
||||
'$check_callable'(V,G) :- var(V), !,
|
||||
'$do_error'(instantiation_error,G).
|
||||
'$check_callable'(M:_G1,G) :- var(M), !,
|
||||
'$do_error'(instantiation_error,G).
|
||||
'$check_callable'(_:G1,G) :- !,
|
||||
'$check_callable'(G1,G).
|
||||
'$check_callable'(A,G) :- number(A), !,
|
||||
'$do_error'(type_error(callable,A),G).
|
||||
'$check_callable'(R,G) :- db_reference(R), !,
|
||||
'$do_error'(type_error(callable,R),G).
|
||||
'$check_callable'(_,_).
|
||||
|
||||
|
||||
'$loop'(Stream,exo) :-
|
||||
prolog_flag(agc_margin,Old,0),
|
||||
prompt1(': '), prompt(_,' '),
|
||||
@ -861,16 +848,16 @@ gated_call(Setup, Goal, Catcher, Cleanup) :-
|
||||
%
|
||||
% split head and body, generate an error if body is unbound.
|
||||
%
|
||||
'$check_head_and_body'(C,M,H,B,P) :-
|
||||
'$check_head_and_body'(C,M,H,B,_P) :-
|
||||
'$yap_strip_module'(C,M1,(MH:-B0)),
|
||||
!,
|
||||
'$yap_strip_module'(M1:MH,M,H),
|
||||
( M == M1 -> B = B0 ; B = M1:B0),
|
||||
is_callable(M:H,P).
|
||||
is_callable(M:H).
|
||||
|
||||
'$check_head_and_body'(MH, M, H, true, P) :-
|
||||
'$check_head_and_body'(MH, M, H, true, _XsP) :-
|
||||
'$yap_strip_module'(MH,M,H),
|
||||
is_callable(M:H,P).
|
||||
is_callable(M:H).
|
||||
% term expansion
|
||||
%
|
||||
% return two arguments: Expanded0 is the term after "USER" expansion.
|
||||
|
@ -72,9 +72,7 @@ undefined_query(G0, M0, Cut) :-
|
||||
|
||||
'$handle_error'(error,Goal,Mod) :-
|
||||
functor(Goal,Name,Arity),
|
||||
'program_continuation'(PMod,PName,PAr),
|
||||
'$do_error'(existence_error(procedure,Name/Arity),
|
||||
context(Mod:Goal,PMod:PName/PAr)).
|
||||
'$do_error'(existence_error(procedure,Name/Arity), Mod:Goal).
|
||||
'$handle_error'(warning,Goal,Mod) :-
|
||||
functor(Goal,Name,Arity),
|
||||
'program_continuation'(PMod,PName,PAr),
|
||||
|
@ -1,5 +1,7 @@
|
||||
set (LIBRARY_PL
|
||||
INDEX.pl
|
||||
aggregate.pl
|
||||
autoloader.yap
|
||||
base64.pl
|
||||
broadcast.pl
|
||||
ctypes.pl
|
||||
|
132
swi/library/autoloader.yap
Normal file
132
swi/library/autoloader.yap
Normal file
@ -0,0 +1,132 @@
|
||||
/**
|
||||
* @file autoloader.yap
|
||||
|
||||
*/
|
||||
:- module(autoloader,[make_library_index/0]).
|
||||
|
||||
:- use_module(library(lists),[append/3]).
|
||||
|
||||
:- dynamic exported/3, loaded/1.
|
||||
|
||||
make_library_index :-
|
||||
scan_library_exports,
|
||||
scan_swi_exports.
|
||||
|
||||
scan_library_exports :-
|
||||
% init table file.
|
||||
open('INDEX.pl', write, W),
|
||||
close(W),
|
||||
scan_exports('../GPL/aggregate', library(aggregate)),
|
||||
scan_exports(apply, library(apply)),
|
||||
scan_exports(arg, library(arg)),
|
||||
scan_exports(assoc, library(assoc)),
|
||||
scan_exports(avl, library(avl)),
|
||||
scan_exports(bhash, library(bhash)),
|
||||
scan_exports(charsio, library(charsio)),
|
||||
scan_exports('../packages/chr/chr_swi', library(chr)),
|
||||
scan_exports(clp/clpfd, library(clpfd)),
|
||||
scan_exports('../packages/clpqr/clpr', library(clpr)),
|
||||
scan_exports(gensym, library(gensym)),
|
||||
scan_exports(heaps, library(heaps)),
|
||||
scan_exports('../packages/jpl/jpl', library(jpl)),
|
||||
scan_exports(lists, library(lists)),
|
||||
scan_exports(nb, library(nb)),
|
||||
scan_exports(occurs, library(occurs)),
|
||||
scan_exports('../LGPL/option', library(option)),
|
||||
scan_exports(ordsets, library(ordsets)),
|
||||
scan_exports(pairs, library(pairs)),
|
||||
scan_exports('../LGPL/prolog_xref', library(prolog_xref)),
|
||||
scan_exports('../packages/plunit/plunit', library(plunit)),
|
||||
scan_exports(queues, library(queues)),
|
||||
scan_exports(random, library(random)),
|
||||
scan_exports(rbtrees, library(rbtrees)),
|
||||
scan_exports('../LGPL/readutil', library(readutil)),
|
||||
scan_exports(regexp, library(regexp)),
|
||||
scan_exports('../LGPL/shlib', library(shlib)),
|
||||
scan_exports(system, library(system)),
|
||||
scan_exports(terms, library(terms)),
|
||||
scan_exports(timeout, library(timeout)),
|
||||
scan_exports(trees, library(trees)).
|
||||
|
||||
scan_exports(Library, CallName) :-
|
||||
absolute_file_name(Library, Path,
|
||||
[ file_type(prolog),
|
||||
access(read),
|
||||
file_errors(fail)
|
||||
]),
|
||||
open(Path, read, O),
|
||||
!,
|
||||
get_exports(O, Exports, Module),
|
||||
close(O),
|
||||
open('INDEX.pl', append, W),
|
||||
publish_exports(Exports, W, CallName, Module),
|
||||
close(W).
|
||||
scan_exports(Library) :-
|
||||
format(user_error,'[ warning: library ~w not defined ]~n',[Library]).
|
||||
|
||||
%
|
||||
% SWI is the only language that uses autoload.
|
||||
%
|
||||
scan_swi_exports :-
|
||||
retractall(exported(_,_,_)),
|
||||
absolute_file_name(dialect/swi, Path,
|
||||
[ file_type(prolog),
|
||||
access(read),
|
||||
file_errors(fail)
|
||||
]),
|
||||
open(Path, read, O),
|
||||
get_exports(O, Exports, Module),
|
||||
get_reexports(O, Reexports, Exports),
|
||||
close(O),
|
||||
open('dialect/swi/INDEX.pl', write, W),
|
||||
publish_exports(Reexports, W, library(dialect/swi), Module),
|
||||
close(W).
|
||||
|
||||
get_exports(O, Exports, Module) :-
|
||||
read(O, (:- module(Module,Exports))), !.
|
||||
get_exports(O, Exports, Module) :-
|
||||
get_exports(O, Exports, Module).
|
||||
|
||||
get_reexports(O, Exports, ExportsL) :-
|
||||
read(O, (:- reexport(_File,ExportsI))), !,
|
||||
get_reexports(O, Exports0, ExportsL),
|
||||
append(ExportsI, Exports0, Exports).
|
||||
get_reexports(_, Exports, Exports).
|
||||
|
||||
publish_exports([], _, _, _).
|
||||
publish_exports([F/A|Exports], W, Path, Module) :-
|
||||
publish_export(F, A, W, Path, Module),
|
||||
publish_exports(Exports, W, Path, Module).
|
||||
publish_exports([F//A0|Exports], W, Path, Module) :-
|
||||
A is A0+2,
|
||||
publish_export(F, A, W, Path, Module),
|
||||
publish_exports(Exports, W, Path, Module).
|
||||
publish_exports([op(_,_,_)|Exports], W, Path, Module) :-
|
||||
publish_exports(Exports, W, Path, Module).
|
||||
|
||||
publish_export(F, A, _, _, Module) :-
|
||||
exported(F, A, M), M \= Module, !,
|
||||
format(user_error,'[ warning: clash between ~a and ~a over ~a/~d ]~n',[Module,M,F,A]).
|
||||
publish_export(F, A, W, Path, Module) :-
|
||||
assert(exported(F, A, Module)), !,
|
||||
portray_clause(W, index(F, A, Module, Path)).
|
||||
|
||||
find_predicate(G,ExportingModI) :-
|
||||
nonvar(G), !,
|
||||
functor(G, Name, Arity),
|
||||
index(Name,Arity,ExportingModI,File),
|
||||
ensure_file_loaded(File).
|
||||
find_predicate(G,ExportingModI) :-
|
||||
var(G),
|
||||
index(Name,Arity,ExportingModI,File),
|
||||
functor(G, Name, Arity),
|
||||
ensure_file_loaded(File).
|
||||
|
||||
ensure_file_loaded(File) :-
|
||||
loaded(File), !.
|
||||
ensure_file_loaded(File) :-
|
||||
load_files(autoloader:File,[silent(true),if(not_loaded)]),
|
||||
assert(loaded(File)).
|
||||
|
||||
:- include('INDEX').
|
||||
|
Reference in New Issue
Block a user