handle Z=[X,Z], X=y(X)
This commit is contained in:
parent
6a3c4bda79
commit
79d2330e71
8
C/exec.c
8
C/exec.c
@ -214,7 +214,7 @@ static Int current_choice_point(USES_REGS1) {
|
|||||||
*
|
*
|
||||||
* The call will fail if _CP_ is topmost in the search tree.
|
* The call will fail if _CP_ is topmost in the search tree.
|
||||||
*/
|
*/
|
||||||
static Int parent_choice_point2(USES_REGS1) {
|
static Int parent_choice_point(USES_REGS1) {
|
||||||
Term t = Deref(ARG1);
|
Term t = Deref(ARG1);
|
||||||
Term td;
|
Term td;
|
||||||
#if SHADOW_HB
|
#if SHADOW_HB
|
||||||
@ -238,7 +238,7 @@ static Int parent_choice_point2(USES_REGS1) {
|
|||||||
*
|
*
|
||||||
* The call will fail if _CP_ is topmost in the search tree.
|
* The call will fail if _CP_ is topmost in the search tree.
|
||||||
*/
|
*/
|
||||||
static Int parent_choice_point(USES_REGS1) {
|
static Int parent_choice_point1(USES_REGS1) {
|
||||||
Term t = Deref(ARG1);
|
Term t = Deref(ARG1);
|
||||||
Term td;
|
Term td;
|
||||||
#if SHADOW_HB
|
#if SHADOW_HB
|
||||||
@ -2355,8 +2355,8 @@ void Yap_InitExecFs(void) {
|
|||||||
Yap_InitCPred("current_choice_point", 1, current_choice_point, 0);
|
Yap_InitCPred("current_choice_point", 1, current_choice_point, 0);
|
||||||
Yap_InitCPred("current_choicepoint", 1, current_choice_point, 0);
|
Yap_InitCPred("current_choicepoint", 1, current_choice_point, 0);
|
||||||
Yap_InitCPred("env_choice_point", 1, save_env_b, 0);
|
Yap_InitCPred("env_choice_point", 1, save_env_b, 0);
|
||||||
Yap_InitCPred("parent_choice_point", 1, parent_choice_point, 0);
|
Yap_InitCPred("parent_choice_point", 1, parent_choice_point1, 0);
|
||||||
Yap_InitCPred("parent_choice_point", 2, parent_choice_point2, 0);
|
Yap_InitCPred("parent_choice_point", 2, parent_choice_point, 0);
|
||||||
Yap_InitCPred("cut_at", 1, clean_ifcp, SafePredFlag);
|
Yap_InitCPred("cut_at", 1, clean_ifcp, SafePredFlag);
|
||||||
CurrentModule = cm;
|
CurrentModule = cm;
|
||||||
Yap_InitCPred("$restore_regs", 1, restore_regs,
|
Yap_InitCPred("$restore_regs", 1, restore_regs,
|
||||||
|
62
C/terms.c
62
C/terms.c
@ -40,6 +40,10 @@
|
|||||||
#define Malloc malloc
|
#define Malloc malloc
|
||||||
#define Realloc realloc
|
#define Realloc realloc
|
||||||
|
|
||||||
|
extern int cs[10];
|
||||||
|
|
||||||
|
int cs[10];
|
||||||
|
|
||||||
static int expand_vts(int args USES_REGS) {
|
static int expand_vts(int args USES_REGS) {
|
||||||
UInt expand = LOCAL_Error_Size;
|
UInt expand = LOCAL_Error_Size;
|
||||||
yap_error_number yap_errno = LOCAL_Error_TYPE;
|
yap_error_number yap_errno = LOCAL_Error_TYPE;
|
||||||
@ -90,26 +94,10 @@ static inline void clean_tr(tr_fr_ptr TR0 USES_REGS) {
|
|||||||
//} non_singletons_t;
|
//} non_singletons_t;
|
||||||
|
|
||||||
#define IS_VISIT_MARKER \
|
#define IS_VISIT_MARKER \
|
||||||
(IsPairTerm(d0) && RepPair(d0) >= (CELL *)to_visit0 && \
|
(IsAtomTerm(d0) && AtomOfTerm(d0) >= (Atom)to_visit0 && \
|
||||||
RepPair(d0) <= (CELL *)to_visit)
|
AtomOfTerm(d0) <= (Atom)to_visit)
|
||||||
|
|
||||||
#define VISIT_MARKER AbsPair((CELL *)to_visit)
|
#define VISIT_MARKER MkAtomTerm((Atom)to_visit)
|
||||||
|
|
||||||
#define CYC_MARK_LIST \
|
|
||||||
if (IsPairTerm(d0) && RepPair(d0) >= (CELL *)to_visit0 && \
|
|
||||||
RepPair(d0) <= (CELL *)to_visit) { \
|
|
||||||
/*fprintf(stderr,"+%ld at %s\n", to_visit-to_visit0, __FUNCTION__);*/ \
|
|
||||||
*ptf++ = BREAK_LOOP(to_visit - to_visit0); \
|
|
||||||
continue; \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define CYC_MARK_APPL \
|
|
||||||
if (IsApplTerm(d0) && RepAppl(d0) >= (Term *)to_visit0 && \
|
|
||||||
RepAppl(d0) <= (Term *)to_visit) { \
|
|
||||||
/*fprintf(stderr,"+%ld at %s\n", to_visit-to_visit0, __FUNCTION__);*/ \
|
|
||||||
*ptf++ = BREAK_LOOP(to_visit - to_visit0); \
|
|
||||||
continue; \
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
Term old_var;
|
Term old_var;
|
||||||
@ -188,6 +176,10 @@ while (to_visit >= to_visit0) { \
|
|||||||
pt0_end = ptd0 + d1; \
|
pt0_end = ptd0 + d1; \
|
||||||
continue; \
|
continue; \
|
||||||
} else { \
|
} else { \
|
||||||
|
if (IS_VISIT_MARKER) { \
|
||||||
|
\
|
||||||
|
continue; \
|
||||||
|
} \
|
||||||
PRIMI0; \
|
PRIMI0; \
|
||||||
continue; \
|
continue; \
|
||||||
} \
|
} \
|
||||||
@ -280,6 +272,7 @@ static Term cyclic_complex_term(CELL *pt0, CELL *pt0_end USES_REGS) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool Yap_IsCyclicTerm(Term t USES_REGS) {
|
bool Yap_IsCyclicTerm(Term t USES_REGS) {
|
||||||
|
cs[2]++;
|
||||||
|
|
||||||
if (IsVarTerm(t)) {
|
if (IsVarTerm(t)) {
|
||||||
return false;
|
return false;
|
||||||
@ -304,9 +297,9 @@ static Int cyclic_term(USES_REGS1) /* cyclic_term(+T) */
|
|||||||
return Yap_IsCyclicTerm(Deref(ARG1));
|
return Yap_IsCyclicTerm(Deref(ARG1));
|
||||||
}
|
}
|
||||||
|
|
||||||
static Term BREAK_LOOP(Int ddep) {
|
static Term BREAK_LOOP(CELL d0,struct non_single_struct_t *to_visit ) {
|
||||||
char buf[64];
|
char buf[64];
|
||||||
snprintf(buf, 63, "@^[" Int_FORMAT "]", ddep);
|
snprintf(buf, 63, "@^[" Int_FORMAT "]", to_visit-(struct non_single_struct_t*)AtomOfTerm(d0));
|
||||||
return MkAtomTerm(Yap_LookupAtom(buf));
|
return MkAtomTerm(Yap_LookupAtom(buf));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -344,7 +337,7 @@ static int cycles_in_complex_term(register CELL *pt0,
|
|||||||
d0 = ptd0[0];
|
d0 = ptd0[0];
|
||||||
if (IS_VISIT_MARKER) {
|
if (IS_VISIT_MARKER) {
|
||||||
rc++;
|
rc++;
|
||||||
*ptf++ = BREAK_LOOP(to_visit - to_visit0);
|
*ptf++ = BREAK_LOOP(d0, to_visit);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
*ptf++ = AbsPair(HR);
|
*ptf++ = AbsPair(HR);
|
||||||
@ -372,7 +365,7 @@ static int cycles_in_complex_term(register CELL *pt0,
|
|||||||
}
|
}
|
||||||
if (IS_VISIT_MARKER) {
|
if (IS_VISIT_MARKER) {
|
||||||
rc++;
|
rc++;
|
||||||
*ptf++ = BREAK_LOOP(to_visit - to_visit0);
|
*ptf++ = BREAK_LOOP(d0, to_visit);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (to_visit + 32 >= to_visit_max) {
|
if (to_visit + 32 >= to_visit_max) {
|
||||||
@ -395,6 +388,11 @@ static int cycles_in_complex_term(register CELL *pt0,
|
|||||||
HR+=d1;
|
HR+=d1;
|
||||||
continue;
|
continue;
|
||||||
} else {
|
} else {
|
||||||
|
if (IS_VISIT_MARKER) {
|
||||||
|
rc++;
|
||||||
|
*ptf++ = BREAK_LOOP(d0, to_visit);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
*ptf++ = d0;
|
*ptf++ = d0;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -420,7 +418,8 @@ return -1;
|
|||||||
}
|
}
|
||||||
|
|
||||||
Term Yap_CyclesInTerm(Term t USES_REGS) {
|
Term Yap_CyclesInTerm(Term t USES_REGS) {
|
||||||
|
cs[3]++;
|
||||||
|
t = Deref(t);
|
||||||
if (IsVarTerm(t)) {
|
if (IsVarTerm(t)) {
|
||||||
return t;
|
return t;
|
||||||
} else if (IsPrimitiveTerm(t)) {
|
} else if (IsPrimitiveTerm(t)) {
|
||||||
@ -674,11 +673,11 @@ return Yap_unify(ARG3, out);
|
|||||||
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
static Int p_term_variables3(
|
static Int term_variables3(
|
||||||
USES_REGS1) /* variables in term t */
|
USES_REGS1) /* variables in term t */
|
||||||
{
|
{
|
||||||
Term out;
|
Term out;
|
||||||
|
cs[0]++;
|
||||||
do {
|
do {
|
||||||
Term t = Deref(ARG1);
|
Term t = Deref(ARG1);
|
||||||
if (IsVarTerm(t)) {
|
if (IsVarTerm(t)) {
|
||||||
@ -738,11 +737,11 @@ Term Yap_TermVariables(
|
|||||||
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
static Int p_term_variables(
|
static Int term_variables(
|
||||||
USES_REGS1) /* variables in term t */
|
USES_REGS1) /* variables in term t */
|
||||||
{
|
{
|
||||||
Term out;
|
Term out;
|
||||||
|
cs[1]++;
|
||||||
if (!Yap_IsListOrPartialListTerm(ARG2)) {
|
if (!Yap_IsListOrPartialListTerm(ARG2)) {
|
||||||
Yap_Error(TYPE_ERROR_LIST, ARG2, "term_variables/2");
|
Yap_Error(TYPE_ERROR_LIST, ARG2, "term_variables/2");
|
||||||
return false;
|
return false;
|
||||||
@ -815,7 +814,7 @@ static Term attvars_in_complex_term(
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
/*fprintf(stderr,"<%ld at %s\n", to_visit-to_visit0, __FUNCTION__)*/;
|
/*fprintf(stderr,"<%ld at %s\n", d0, __FUNCTION__)*/;
|
||||||
return (output);
|
return (output);
|
||||||
|
|
||||||
def_aux_overflow();
|
def_aux_overflow();
|
||||||
@ -1457,7 +1456,6 @@ Int cp_link(Term t, Int i, Int j, cl_connector * q, Int max, CELL * tailp) {
|
|||||||
if (me)
|
if (me)
|
||||||
q[me].parent[0] = v;
|
q[me].parent[0] = v;
|
||||||
q[me].reference = v;
|
q[me].reference = v;
|
||||||
fprintf(stderr," + %p\n", v);
|
|
||||||
}
|
}
|
||||||
return max;
|
return max;
|
||||||
}
|
}
|
||||||
@ -1537,8 +1535,8 @@ static Int rational_term_to_tree(USES_REGS1) {
|
|||||||
|
|
||||||
void Yap_InitTermCPreds(void) {
|
void Yap_InitTermCPreds(void) {
|
||||||
Yap_InitCPred("cycles_in_term", 2, cycles_in_term, 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, term_variables, 0);
|
||||||
Yap_InitCPred("term_variables", 3, p_term_variables3, 0);
|
Yap_InitCPred("term_variables", 3, term_variables3, 0);
|
||||||
Yap_InitCPred("$variables_in_term", 3, variables_in_term, 0);
|
Yap_InitCPred("$variables_in_term", 3, variables_in_term, 0);
|
||||||
|
|
||||||
Yap_InitCPred("$free_variables_in_term", 3, p_free_variables_in_term, 0);
|
Yap_InitCPred("$free_variables_in_term", 3, p_free_variables_in_term, 0);
|
||||||
|
@ -1115,7 +1115,8 @@ void Yap_plwrite(Term t, StreamDesc *mywrite, int max_depth, int flags,
|
|||||||
|
|
||||||
/* protect slots for portray */
|
/* protect slots for portray */
|
||||||
writeTerm(tp, priority, 1, false, &wglb, &rwt);
|
writeTerm(tp, priority, 1, false, &wglb, &rwt);
|
||||||
if (flags & New_Line_f) {
|
tp = Yap_CyclesInTerm(t PASS_REGS);
|
||||||
|
if (flags & New_Line_f) {
|
||||||
if (flags & Fullstop_f) {
|
if (flags & Fullstop_f) {
|
||||||
wrputc('.', wglb.stream);
|
wrputc('.', wglb.stream);
|
||||||
wrputc('\n', wglb.stream);
|
wrputc('\n', wglb.stream);
|
||||||
|
@ -965,7 +965,7 @@ INLINE_ONLY void restore_absmi_regs(REGSTORE *old_regs) {
|
|||||||
_##Label : { \
|
_##Label : { \
|
||||||
START_PREFETCH(Type)
|
START_PREFETCH(Type)
|
||||||
|
|
||||||
#define OpW(Label, Type) \
|
#define OpW(Label, Type) \
|
||||||
_##Label : { \
|
_##Label : { \
|
||||||
START_PREFETCH_W(Type)
|
START_PREFETCH_W(Type)
|
||||||
|
|
||||||
|
@ -68,15 +68,6 @@ run_formats([], _).
|
|||||||
run_formats([Com-Args|StackInfo], Stream) :-
|
run_formats([Com-Args|StackInfo], Stream) :-
|
||||||
format(Stream, Com, Args),
|
format(Stream, Com, Args),
|
||||||
run_formats(StackInfo, user_error).
|
run_formats(StackInfo, user_error).
|
||||||
/**
|
|
||||||
* @pred parent_choicepoint(+_ChoicePoint_)
|
|
||||||
*
|
|
||||||
* _ChoicePoint_ is the parent of the current choice-point.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
parent_choicepoint(BP) :-
|
|
||||||
current_choicepoint(B),
|
|
||||||
parent_choicepoint(B, BP).
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -636,7 +636,7 @@ write_query_answer( Bindings ) :-
|
|||||||
'$call'(M:_,_,G0,_) :- var(M), !,
|
'$call'(M:_,_,G0,_) :- var(M), !,
|
||||||
'$do_error'(instantiation_error,call(G0)).
|
'$do_error'(instantiation_error,call(G0)).
|
||||||
'$call'(M:G,CP,G0,_M0) :- !,
|
'$call'(M:G,CP,G0,_M0) :- !,
|
||||||
'$expand_meta_call'(M:G, [], NG),
|
'$expand_meta_call'(M:G, [], NG),
|
||||||
'$yap_strip_module'(NG,NM,NC),
|
'$yap_strip_module'(NG,NM,NC),
|
||||||
'$call'(NC,CP,G0,NM).
|
'$call'(NC,CP,G0,NM).
|
||||||
'$call'((X,Y),CP,G0,M) :- !,
|
'$call'((X,Y),CP,G0,M) :- !,
|
||||||
@ -704,7 +704,7 @@ write_query_answer( Bindings ) :-
|
|||||||
'$call'(not(X), _CP, G0, M) :- !,
|
'$call'(not(X), _CP, G0, M) :- !,
|
||||||
\+ ('$current_choice_point'(CP),
|
\+ ('$current_choice_point'(CP),
|
||||||
'$call'(X,CP,G0,M) ).
|
'$call'(X,CP,G0,M) ).
|
||||||
'$call'(!, CP, CP,_G0) :- !,
|
'$call'(!, CP, _G0, _m) :- !,
|
||||||
'$$cut_by'(CP).
|
'$$cut_by'(CP).
|
||||||
'$call'([X|Y], _, _, M) :-
|
'$call'([X|Y], _, _, M) :-
|
||||||
(Y == [] ->
|
(Y == [] ->
|
||||||
|
Reference in New Issue
Block a user