This commit is contained in:
Vitor Santos Costa 2019-02-13 09:44:24 +00:00
parent 2c80e33c6a
commit c4b78e161b
19 changed files with 107 additions and 85 deletions

View File

@ -728,7 +728,7 @@ static Int p_acomp(USES_REGS1) { /* $a_compare(?R,+X,+Y) */
The value of the expression _X_ is equal to the value of expression _Y_. The value of the expression _X_ is equal to the value of expression _Y_.
*/ */
/// @memberof =:=/2
static Int a_eq(Term t1, Term t2) { static Int a_eq(Term t1, Term t2) {
CACHE_REGS CACHE_REGS
/* A =:= B */ /* A =:= B */
@ -769,7 +769,6 @@ static Int a_eq(Term t1, Term t2) {
The value of the expression _X_ is different from the value of expression The value of the expression _X_ is different from the value of expression
_Y_. _Y_.
*/ */
/// @memberof =\\=/2
static Int a_dif(Term t1, Term t2) { static Int a_dif(Term t1, Term t2) {
CACHE_REGS CACHE_REGS
Int out = a_cmp(Deref(t1), Deref(t2) PASS_REGS); Int out = a_cmp(Deref(t1), Deref(t2) PASS_REGS);
@ -809,7 +808,6 @@ static Int a_ge(Term t1, Term t2) { /* A >= B */
The value of the expression _X_ is less than the value of expression The value of the expression _X_ is less than the value of expression
_Y_. _Y_.
*/ */
/// @memberof </2
static Int a_lt(Term t1, Term t2) { /* A < B */ static Int a_lt(Term t1, Term t2) { /* A < B */
CACHE_REGS CACHE_REGS
Int out = a_cmp(Deref(t1), Deref(t2) PASS_REGS); Int out = a_cmp(Deref(t1), Deref(t2) PASS_REGS);
@ -825,7 +823,6 @@ static Int a_lt(Term t1, Term t2) { /* A < B */
The value of the expression _X_ is less than or equal to the value The value of the expression _X_ is less than or equal to the value
of expression _Y_. of expression _Y_.
*/ */
/// @memberof =</2
static Int a_le(Term t1, Term t2) { /* A <= B */ static Int a_le(Term t1, Term t2) { /* A <= B */
CACHE_REGS CACHE_REGS
Int out = a_cmp(Deref(t1), Deref(t2) PASS_REGS); Int out = a_cmp(Deref(t1), Deref(t2) PASS_REGS);

View File

@ -26,7 +26,7 @@
/** /**
@defgroup YAPFlags C-code to handle Prolog flags. @defgroup YAPFlagsC C-code to handle Prolog flags.
@ingroup YAPFlags @ingroup YAPFlags
@{ @{

144
C/terms.c
View File

@ -242,24 +242,24 @@ var_in_term_nvar : { \
return false; \ return false; \
} }
#define CYC_LIST \ #define CYC_LIST \
if (IS_VISIT_MARKER) { \ if (IS_VISIT_MARKER) { \
while (to_visit > to_visit0) { \ while (to_visit > to_visit0) { \
to_visit--; \ to_visit--; \
to_visit->ptd0[0] = to_visit->d0; \ to_visit->ptd0[0] = to_visit->d0; \
} \ } \
pop_text_stack(lvl); \ pop_text_stack(lvl); \
return true; \ return true; \
} }
#define CYC_APPL \ #define CYC_APPL \
if (IS_VISIT_MARKER) { \ if (IS_VISIT_MARKER) { \
while (to_visit > to_visit0) { \ while (to_visit > to_visit0) { \
to_visit--; \ to_visit--; \
to_visit->ptd0[0] = to_visit->d0; \ to_visit->ptd0[0] = to_visit->d0; \
}\ } \
pop_text_stack(lvl); \ pop_text_stack(lvl); \
return true; \ return true; \
} }
/** /**
@ -311,7 +311,7 @@ static Term BREAK_LOOP(Int ddep) {
@brief routine to locate all variables in a term, and its applications */ @brief routine to locate all variables in a term, and its applications */
static int cycles_in_complex_term(register CELL *pt0, static int cycles_in_complex_term(register CELL *pt0,
register CELL *pt0_end USES_REGS) { register CELL *pt0_end USES_REGS) {
int lvl = push_text_stack(); int lvl = push_text_stack();
int rc = 0; int rc = 0;
@ -320,8 +320,8 @@ static int cycles_in_complex_term(register CELL *pt0,
1024 * sizeof(struct non_single_struct_t)), 1024 * sizeof(struct non_single_struct_t)),
*to_visit0 = to_visit, *to_visit0 = to_visit,
*to_visit_max = to_visit + 1024; *to_visit_max = to_visit + 1024;
ptf = HR; ptf = HR;
HR++; HR++;
while (to_visit >= to_visit0) { while (to_visit >= to_visit0) {
CELL d0; CELL d0;
CELL *ptd0; CELL *ptd0;
@ -363,6 +363,11 @@ static int cycles_in_complex_term(register CELL *pt0,
/* store the terms to visit */ /* store the terms to visit */
ptd0 = RepAppl(d0); ptd0 = RepAppl(d0);
f = (Functor)(d0 = *ptd0); f = (Functor)(d0 = *ptd0);
if (IS_VISIT_MARKER) {
rc++;
*ptf++ = BREAK_LOOP(to_visit - to_visit0);
continue;
}
if (IsExtensionFunctor(f)) { if (IsExtensionFunctor(f)) {
*ptf++ = d0; *ptf++ = d0;
continue; continue;
@ -370,11 +375,6 @@ static int cycles_in_complex_term(register CELL *pt0,
if (to_visit + 32 >= to_visit_max) { if (to_visit + 32 >= to_visit_max) {
goto aux_overflow; goto aux_overflow;
} }
if (IS_VISIT_MARKER) {
rc++;
*ptf++ = BREAK_LOOP(to_visit - to_visit0);
continue;
}
*ptf++ = AbsAppl(HR); *ptf++ = AbsAppl(HR);
to_visit->pt0 = pt0; to_visit->pt0 = pt0;
to_visit->pt0_end = pt0_end; to_visit->pt0_end = pt0_end;
@ -1359,78 +1359,95 @@ static Term UNFOLD_LOOP(Term t, Term * b) {
Term os[2], o; Term os[2], o;
os[0] = o = MkVarTerm(); os[0] = o = MkVarTerm();
os[1] = t; os[1] = t;
Term ti = Yap_MkApplTerm(FunctorEq, 2, os); Term ti = Yap_MkApplTerm(FunctorEq, 2, os), t0 = *b;
*b = MkPairTerm(ti, *b); *b = MkPairTerm(ti, t0);
return o; return o;
} }
typedef struct block_connector { typedef struct block_connector {
Int me; //> index in the array; CELL * parent; //> index in the array;
Term source; //> source; Term source; //> source;
CELL *copy; //> copy; CELL *copy; //> copy;
CELL header; //> backup of first word of the source data; CELL header; //> backup of first word of the source data;
CELL reference; //> term used to refer the copy. CELL reference; //> term used to refer the copy.
} cl_connector; } cl_connector;
static bool dataid(Term t, cl_connector * q, int max) { static Int t_ref(cl_connector *d, cl_connector * q, int max) {
if (!IsPrimitiveTerm(t)) return 0; if ( d >= q && d < q+max)
if (!IsAtomTerm(t)) return max;
cl_connector *d = (cl_connector *)AtomOfTerm(t);
if (d > q && d < q+max)
return d-q; return d-q;
return max; //&& d->source == (void *; return -1; //&& d->source == (void *;
} }
static Int create_entry(Term t, Int i, Int j, cl_connector * q, Int max) { static Int create_entry(Term t, Int i, Int j, cl_connector * q, Int max) {
Term ref, h, *s, *ostart; Term ref, h, *s, *ostart;
bool pair = false; bool pair = false;
Int k;
ssize_t n; ssize_t n;
// first time, create a new term // first time, create a new term
ostart = HR; if (IsVarTerm(t)) {
return -1;
}
if (IsPairTerm(t)) { if (IsPairTerm(t)) {
s = RepPair(t); s = RepPair(t);
h = s[0];
if (IsAtomTerm(h)) {
return t_ref((cl_connector*)AtomOfTerm(h),q,max);
}
n = 2; n = 2;
pair = true; pair = true;
ostart = HR;
ref = AbsPair(ostart); ref = AbsPair(ostart);
HR += 2;
q[max].header = Deref(s[0]);
} else if (IsApplTerm(t)) { } else if (IsApplTerm(t)) {
h = (CELL)FunctorOfTerm(t); h = (CELL)FunctorOfTerm(t);
n = ArityOfFunctor((Functor)h);
if (IsExtensionFunctor((Functor)h)) {
return -1;
}
if (IsAtomTerm(h)) {
return t_ref((cl_connector*)AtomOfTerm(h),q,max);
}
s = RepAppl(t); s = RepAppl(t);
n = ArityOfFunctor(FunctorOfTerm(t)); q[max].header = s[0];
ostart = HR;
ref = AbsAppl(ostart); ref = AbsAppl(ostart);
*ostart++ = s[0]; *ostart++ = s[0];
} else if ((k = dataid(t, q, max))) { HR=ostart+n;
return k; } else if (IsAtomTerm(t) &&
} else { (max = t_ref((cl_connector*)AtomOfTerm(t),q,max)) >= 0) {
return max; return max;
} else {
return -1;
} }
q[max].parent = q[i].copy+j;
q[max].me = max;
q[max].source = t; q[max].source = t;
q[max].copy = ostart; q[max].copy = ostart;
q[max].header = s[0];
q[max].reference = ref; q[max].reference = ref;
s[0] = MkAtomTerm((void*)q); s[0] = MkAtomTerm((void*)(q+max));
HR += n; return max+1;
return max;
} }
Int cp_link(Term t, Int i, Int j, cl_connector * q, Int max, CELL * tailp) { Int cp_link(Term t, Int i, Int j, cl_connector * q, Int max, CELL * tailp) {
Int me; Int me;
t = Deref(t);
if ((me = create_entry(t, i, j, q, max)) < max) { if ((me = create_entry(t, i, j, q, max)) < max) {
if (me < 0) {
q[i].copy[j] = t;
return max;
}
Term ref = Deref(q[me].reference); Term ref = Deref(q[me].reference);
if (IsVarTerm(ref)) { if (IsVarTerm(ref)) {
q[i].copy[j] = ref; q[i].copy[j] = ref;
} else { } else {
q[i].copy[j] = q[me].reference = UNFOLD_LOOP(ref, tailp); q[i].copy[j] =
q[me].parent[0] =
UNFOLD_LOOP(ref, tailp);
} }
return max; return max;
} }
return max + 1; q[i].copy[j] = t;
return me;
} }
Term Yap_BreakCycles(Term inp, UInt arity, Term * listp USES_REGS) { Term Yap_BreakCycles(Term inp, UInt arity, Term * listp USES_REGS) {
@ -1444,12 +1461,13 @@ Term Yap_BreakCycles(Term inp, UInt arity, Term * listp USES_REGS) {
Int i = 0; Int i = 0;
HB = HR; HB = HR;
if (IsVarTerm(t) || dataid(t, q, qlen) == 0) { qlen = 0;
if (IsVarTerm(t) || IsPrimitiveTerm(t)) {
return t; return t;
} else { } else {
// initialization // initialization
qlen = cp_link(t, 0, 0, q, qlen, listp); qlen = create_entry(Deref(t), i, 0, q, qlen);
while (i < qlen) { while(i<qlen) {
arity_t n, j; arity_t n, j;
if (IsPairTerm(q[i].source)) { if (IsPairTerm(q[i].source)) {
s = RepPair(q[i].source); s = RepPair(q[i].source);
@ -1469,15 +1487,6 @@ Term Yap_BreakCycles(Term inp, UInt arity, Term * listp USES_REGS) {
} }
} }
for (i = 0; i < qlen; i++) {
if (IsPairTerm(t)) {
RepPair(q[i].source)[0] = q[i].header;
} else {
RepAppl(q[i].source)[0] = q[i].header;
}
}
pop_text_stack(lvl); pop_text_stack(lvl);
HB = B->cp_h; HB = B->cp_h;
@ -1495,7 +1504,7 @@ Term Yap_BreakCycles(Term inp, UInt arity, Term * listp USES_REGS) {
*/ */
static Int p_break_rational(USES_REGS1) { static Int rational_term_to_tree(USES_REGS1) {
Term t = Deref(ARG1); Term t = Deref(ARG1);
Term l = Deref(ARG4); Term l = Deref(ARG4);
if (IsVarTerm(l)) if (IsVarTerm(l))
@ -1505,7 +1514,7 @@ static Int p_break_rational(USES_REGS1) {
} }
void Yap_InitTermCPreds(void) { void Yap_InitTermCPreds(void) {
Yap_InitCPred("rational_term_to_tree", 4, p_break_rational, 0); Yap_InitCPred("cycles_in_term", 2, cycles_in_term, 0);
Yap_InitCPred("term_variables", 2, p_term_variables, 0); Yap_InitCPred("term_variables", 2, p_term_variables, 0);
Yap_InitCPred("term_variables", 3, p_term_variables3, 0); Yap_InitCPred("term_variables", 3, p_term_variables3, 0);
Yap_InitCPred("$variables_in_term", 3, variables_in_term, 0); Yap_InitCPred("$variables_in_term", 3, variables_in_term, 0);
@ -1518,8 +1527,8 @@ void Yap_InitTermCPreds(void) {
Yap_InitCPred("variable_in_term", 2, variable_in_term, 0); Yap_InitCPred("variable_in_term", 2, variable_in_term, 0);
Yap_InitCPred("variables_within_term", 3, p_variables_within_term, 0); Yap_InitCPred("variables_within_term", 3, p_variables_within_term, 0);
Yap_InitCPred("new_variables_in_term", 3, p_new_variables_in_term, 0); Yap_InitCPred("new_variables_in_term", 3, p_new_variables_in_term, 0);
Yap_InitCPred("cyles_in_term", 4, cycles_in_term, 0);
CurrentModule = PROLOG_MODULE; CurrentModule = PROLOG_MODULE;
Yap_InitCPred("rational_term_to_tree", 4, rational_term_to_tree, 0);
Yap_InitCPred("$non_singletons_in_term", 3, p_non_singletons_in_term, 0); Yap_InitCPred("$non_singletons_in_term", 3, p_non_singletons_in_term, 0);
@ -1529,3 +1538,4 @@ void Yap_InitTermCPreds(void) {
Yap_InitCPred("numbervars", 3, p_numbervars, 0); Yap_InitCPred("numbervars", 3, p_numbervars, 0);
Yap_InitCPred("largest_numbervar", 2, largest_numbervar, 0); Yap_InitCPred("largest_numbervar", 2, largest_numbervar, 0);
} }
//@}

View File

@ -1,5 +1,5 @@
@file LIBRARY.md @file lib.md
@defgroup library YAP Prolog Library @defgroup library YAP Prolog Library

View File

@ -1,5 +1,5 @@
/** /**
* @file autoloader.yap *
*/ */
:- module(autoloader,[make_library_index/0]). :- module(autoloader,[make_library_index/0]).

View File

@ -24,7 +24,10 @@
* @{ * @{
* *
*/ */
%% @file charsio.yap
%%
%%
%% @brief Input/Output to characters.
:- module(system(charsio), [ :- module(system(charsio), [
format_to_chars/3, format_to_chars/3,
@ -52,7 +55,7 @@ You can use the following directive to load the files.
~~~~~~~ ~~~~~~~
:- use_module(library(avl)). :- use_module(library(charsio)).
~~~~~~~ ~~~~~~~
It includes the following predicates: It includes the following predicates:

View File

@ -154,6 +154,10 @@ co_term_expansion((H :- B), M, (NH :- B)) :- !,
co_term_expansion(H, M, NH) :- co_term_expansion(H, M, NH) :-
coinductive(H, M, NH), !. coinductive(H, M, NH), !.
/** user:term_expansion(+M:Cl,-M:NCl )
rule preprocessor
*/
user:term_expansion(M:Cl,M:NCl ) :- !, user:term_expansion(M:Cl,M:NCl ) :- !,
co_term_expansion(Cl, M, NCl). co_term_expansion(Cl, M, NCl).

View File

@ -52,6 +52,10 @@
functor(G, F, N), functor(G, F, N),
predicate_property(M:G, meta_predicate(P)). predicate_property(M:G, meta_predicate(P)).
/** user:term_expansion(+M:Cl,-M:NCl )
rule preprocessor
*/
user:term_expansion( ( :- '$meta_predicate'( _ ) ), [] ). user:term_expansion( ( :- '$meta_predicate'( _ ) ), [] ).
user:goal_expansion(_:'_user_expand_goal'(A, M, B), user:user_expand_goal(A, M, B) ). user:goal_expansion(_:'_user_expand_goal'(A, M, B), user:user_expand_goal(A, M, B) ).

View File

@ -204,7 +204,7 @@
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% @file problog/flags %% @file problog/flags.yap
:-module(flags, [problog_define_flag/4, :-module(flags, [problog_define_flag/4,
problog_define_flag/5, problog_define_flag/5,

View File

@ -1343,3 +1343,4 @@ keep_list_(_, X) :-
(Space += keep(X)) :- !, keep_(Space,X). (Space += keep(X)) :- !, keep_(Space,X).
%! @} %! @}
%! @}

View File

@ -1,6 +1,6 @@
/** /**
* @file jupyter.yap4py * @file jupyter.yap
* *
* @brief JUpyter support. * @brief JUpyter support.
*/ */

View File

@ -1,5 +1,5 @@
/** /**
* @file jupyter.yap4py * @file verify.yap
* *
* @brief JUpyter support. * @brief JUpyter support.
*/ */

View File

@ -18,7 +18,7 @@
/** /**
@file attributes.yap @file attributes.yap
@defgroup New_Style_Attribute_Declarations SWI Compatible attributes @defgroup New_Style_Attribute_Declarations hProlog and SWI-Prolog style Attribute Declarations
@ingroup attributes @ingroup attributes
@{ @{

View File

@ -114,6 +114,10 @@ print_message(Type,error(_,exception(Desc))) :-
'$get_exception'(Desc), '$get_exception'(Desc),
print_boot_message(Type,Error,Desc), print_boot_message(Type,Error,Desc),
'$print_exception'(Desc), '$print_exception'(Desc),
print_message(Type,warning(_,exception(Desc))) :-
'$get_exception'(Desc),
print_boot_message(Type,Error,Desc),
'$print_exception'(Desc),
!. !.
print_message(Type,Error) :- print_message(Type,Error) :-
format( user_error, '~w while bootstraping: event is ~q~n',[Type,Error]). format( user_error, '~w while bootstraping: event is ~q~n',[Type,Error]).

View File

@ -862,7 +862,6 @@ nb_setval('$if_level',0).
'__NB_getval__'('$lf_status', TOpts, fail), '__NB_getval__'('$lf_status', TOpts, fail),
'$lf_opt'( initialization, TOpts, Ref), '$lf_opt'( initialization, TOpts, Ref),
nb:nb_queue_close(Ref, Answers, []), nb:nb_queue_close(Ref, Answers, []),
writeln(init:Answers),
'$process_init_goal'(Answers). '$process_init_goal'(Answers).
'$exec_initialization_goals'. '$exec_initialization_goals'.

View File

@ -1,5 +1,5 @@
/** /**
** @file imports.yapi ** @file imports.yap
* *
* @brief Module systemm code to import predicates * @brief Module systemm code to import predicates
* *

View File

@ -9,7 +9,7 @@
*************************************************************************/ *************************************************************************/
/** /**
* @file os.yap * @file pl/os.yap
*/ */
:- system_module( '$os', [ :- system_module( '$os', [
cd/0, cd/0,

View File

@ -16,7 +16,7 @@
*************************************************************************/ *************************************************************************/
/** /**
* @file preds.yap * @file pl/preds.yap
*/ */
:- system_module( '$_preds', [abolish/1, :- system_module( '$_preds', [abolish/1,
abolish/2, abolish/2,

View File

@ -1,5 +1,5 @@
/** /**
* @file autoloader.yap * @file swi/library/autoloader.yap
*/ */
:- module(autoloader,[make_library_index/0]). :- module(autoloader,[make_library_index/0]).