fixes
This commit is contained in:
parent
3b8475f882
commit
4bc0292ad6
81
C/terms.c
81
C/terms.c
@ -34,6 +34,10 @@
|
|||||||
#include "string.h"
|
#include "string.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define Malloc malloc
|
||||||
|
#define Realloc realloc
|
||||||
|
|
||||||
|
|
||||||
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;
|
||||||
@ -174,7 +178,6 @@ typedef struct non_single_struct_t {
|
|||||||
goto list_loop; \
|
goto list_loop; \
|
||||||
} else if (IsApplTerm(d0)) { \
|
} else if (IsApplTerm(d0)) { \
|
||||||
register Functor f; \
|
register Functor f; \
|
||||||
register CELL *ap2; \
|
|
||||||
/* store the terms to visit */ \
|
/* store the terms to visit */ \
|
||||||
ptd0 = RepAppl(d0); \
|
ptd0 = RepAppl(d0); \
|
||||||
f = (Functor)(d0 = *ptd0); \
|
f = (Functor)(d0 = *ptd0); \
|
||||||
@ -207,7 +210,7 @@ typedef struct non_single_struct_t {
|
|||||||
|
|
||||||
#define WALK_COMPLEX_TERM() WALK_COMPLEX_TERM__({}, {}, {})
|
#define WALK_COMPLEX_TERM() WALK_COMPLEX_TERM__({}, {}, {})
|
||||||
|
|
||||||
#define END_WALK() }
|
#define END_WALK() goto restart;}
|
||||||
|
|
||||||
#define def_aux_overflow() \
|
#define def_aux_overflow() \
|
||||||
aux_overflow : { \
|
aux_overflow : { \
|
||||||
@ -276,7 +279,7 @@ static Term cyclic_complex_term(register CELL *pt0,
|
|||||||
|
|
||||||
WALK_COMPLEX_TERM__(CYC_LIST, CYC_APPL, {});
|
WALK_COMPLEX_TERM__(CYC_LIST, CYC_APPL, {});
|
||||||
/* leave an empty slot to fill in later */
|
/* leave an empty slot to fill in later */
|
||||||
|
goto restart;
|
||||||
END_WALK();
|
END_WALK();
|
||||||
/* Do we still have compound terms to visit */
|
/* Do we still have compound terms to visit */
|
||||||
if (to_visit > to_visit0) {
|
if (to_visit > to_visit0) {
|
||||||
@ -395,6 +398,7 @@ static Int var_in_complex_term(register CELL *pt0, register CELL *pt0_end,
|
|||||||
pop_text_stack(lvl);
|
pop_text_stack(lvl);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
goto restart;
|
||||||
END_WALK();
|
END_WALK();
|
||||||
|
|
||||||
if (to_visit > to_visit0) {
|
if (to_visit > to_visit0) {
|
||||||
@ -464,7 +468,7 @@ static Term vars_in_complex_term(register CELL *pt0, register CELL *pt0_end,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
TrailTerm(TR++) = (CELL)ptd0;
|
TrailTerm(TR++) = (CELL)ptd0;
|
||||||
|
goto restart;
|
||||||
END_WALK();
|
END_WALK();
|
||||||
/* Do we still have compound terms to visit */
|
/* Do we still have compound terms to visit */
|
||||||
if (to_visit > to_visit0) {
|
if (to_visit > to_visit0) {
|
||||||
@ -678,6 +682,7 @@ static Term attvars_in_complex_term(register CELL *pt0, register CELL *pt0_end,
|
|||||||
pt0_end = &RepAttVar(ptd0)->Atts;
|
pt0_end = &RepAttVar(ptd0)->Atts;
|
||||||
pt0 = pt0_end - 1;
|
pt0 = pt0_end - 1;
|
||||||
}
|
}
|
||||||
|
goto restart;
|
||||||
END_WALK();
|
END_WALK();
|
||||||
/* Do we still have compound terms to visit */
|
/* Do we still have compound terms to visit */
|
||||||
if (to_visit > to_visit0) {
|
if (to_visit > to_visit0) {
|
||||||
@ -744,51 +749,37 @@ static Term new_vars_in_complex_term(register CELL *pt0, register CELL *pt0_end,
|
|||||||
Term inp USES_REGS) {
|
Term inp USES_REGS) {
|
||||||
register tr_fr_ptr TR0 = TR;
|
register tr_fr_ptr TR0 = TR;
|
||||||
CELL *InitialH = HR;
|
CELL *InitialH = HR;
|
||||||
CELL output = AbsPair(HR);
|
HB=ASP;
|
||||||
|
CELL output = TermNil;
|
||||||
|
|
||||||
{
|
{
|
||||||
int lvl = push_text_stack();
|
|
||||||
while (!IsVarTerm(inp) && IsPairTerm(inp)) {
|
while (!IsVarTerm(inp) && IsPairTerm(inp)) {
|
||||||
Term t = HeadOfTerm(inp);
|
Term t = HeadOfTerm(inp);
|
||||||
if (IsVarTerm(t)) {
|
if (IsVarTerm(t)) {
|
||||||
CELL *ptr = VarOfTerm(t);
|
YapBind( VarOfTerm(t), TermFoundVar );
|
||||||
*ptr = TermFoundVar;
|
if ((tr_fr_ptr)LOCAL_TrailTop - TR < 1024) {
|
||||||
TrailTerm(TR++) = t;
|
int lvl = push_text_stack();
|
||||||
|
if (!Yap_growtrail((TR - TR0) * sizeof(tr_fr_ptr *), true)) {
|
||||||
|
goto trail_overflow;
|
||||||
|
}
|
||||||
|
pop_text_stack( lvl );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
inp = TailOfTerm(inp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
WALK_COMPLEX_TERM();
|
||||||
|
output = MkPairTerm((CELL)ptd0,output);
|
||||||
|
YapBind( ptd0, TermFoundVar );
|
||||||
if ((tr_fr_ptr)LOCAL_TrailTop - TR < 1024) {
|
if ((tr_fr_ptr)LOCAL_TrailTop - TR < 1024) {
|
||||||
if (!Yap_growtrail((TR - TR0) * sizeof(tr_fr_ptr *), true)) {
|
if (!Yap_growtrail((TR - TR0) * sizeof(tr_fr_ptr *), true)) {
|
||||||
goto trail_overflow;
|
goto trail_overflow;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
inp = TailOfTerm(inp);
|
|
||||||
}
|
|
||||||
pop_text_stack(lvl);
|
|
||||||
}
|
|
||||||
|
|
||||||
WALK_COMPLEX_TERM();
|
|
||||||
|
|
||||||
/* do or pt2 are unbound */
|
|
||||||
*ptd0 = TermNil;
|
|
||||||
/* leave an empty slot to fill in later */
|
/* leave an empty slot to fill in later */
|
||||||
if (HR + 1024 > ASP) {
|
if (HR + 1024 > ASP) {
|
||||||
goto global_overflow;
|
goto global_overflow;
|
||||||
}
|
}
|
||||||
HR[1] = AbsPair(HR + 2);
|
|
||||||
HR += 2;
|
|
||||||
HR[-2] = (CELL)ptd0;
|
|
||||||
/* next make sure noone will see this as a variable again */
|
|
||||||
if (TR > (tr_fr_ptr)LOCAL_TrailTop - 256) {
|
|
||||||
/* Trail overflow */
|
|
||||||
while (to_visit > to_visit0) {
|
|
||||||
to_visit--;
|
|
||||||
CELL *ptd0 = to_visit->ptd0;
|
|
||||||
*ptd0 = to_visit->d0;
|
|
||||||
}
|
|
||||||
if (!Yap_growtrail((TR - TR0) * sizeof(tr_fr_ptr *), true)) {
|
|
||||||
goto trail_overflow;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
TrailTerm(TR++) = (CELL)ptd0;
|
|
||||||
END_WALK();
|
END_WALK();
|
||||||
/* Do we still have compound terms to visit */
|
/* Do we still have compound terms to visit */
|
||||||
if (to_visit > to_visit0) {
|
if (to_visit > to_visit0) {
|
||||||
@ -798,17 +789,12 @@ static Term new_vars_in_complex_term(register CELL *pt0, register CELL *pt0_end,
|
|||||||
pt0_end = to_visit->pt0_end;
|
pt0_end = to_visit->pt0_end;
|
||||||
CELL *ptd0 = to_visit->ptd0;
|
CELL *ptd0 = to_visit->ptd0;
|
||||||
*ptd0 = to_visit->d0;
|
*ptd0 = to_visit->d0;
|
||||||
goto restart;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
clean_tr(TR0 PASS_REGS);
|
clean_tr(TR0 PASS_REGS);
|
||||||
pop_text_stack(lvl);
|
pop_text_stack(lvl);
|
||||||
if (HR != InitialH) {
|
HB = B->cp_h;
|
||||||
HR[-1] = TermNil;
|
|
||||||
return output;
|
return output;
|
||||||
} else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
def_aux_overflow();
|
def_aux_overflow();
|
||||||
|
|
||||||
@ -881,7 +867,7 @@ static Term vars_within_complex_term(register CELL *pt0, register CELL *pt0_end,
|
|||||||
}
|
}
|
||||||
|
|
||||||
WALK_COMPLEX_TERM__({}, {}, FOUND_VAR());
|
WALK_COMPLEX_TERM__({}, {}, FOUND_VAR());
|
||||||
|
goto restart;
|
||||||
END_WALK();
|
END_WALK();
|
||||||
/* Do we still have compound terms to visit */
|
/* Do we still have compound terms to visit */
|
||||||
if (to_visit > to_visit0) {
|
if (to_visit > to_visit0) {
|
||||||
@ -962,6 +948,7 @@ static Term free_vars_in_complex_term(CELL *pt0, CELL *pt0_end,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
TrailTerm(TR++) = (CELL)ptd0;
|
TrailTerm(TR++) = (CELL)ptd0;
|
||||||
|
goto restart;
|
||||||
END_WALK();
|
END_WALK();
|
||||||
|
|
||||||
/* Do we still have compound terms to visit */
|
/* Do we still have compound terms to visit */
|
||||||
@ -1006,6 +993,7 @@ static Term bind_vars_in_complex_term(CELL *pt0, CELL *pt0_end,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
TrailTerm(TR++) = (CELL)ptd0;
|
TrailTerm(TR++) = (CELL)ptd0;
|
||||||
|
goto restart;
|
||||||
END_WALK();
|
END_WALK();
|
||||||
|
|
||||||
/* Do we still have compound terms to visit */
|
/* Do we still have compound terms to visit */
|
||||||
@ -1095,6 +1083,7 @@ static Term non_singletons_in_complex_term(CELL *pt0, CELL *pt0_end USES_REGS) {
|
|||||||
WALK_COMPLEX_TERM__({}, {}, FOUND_VAR_AGAIN());
|
WALK_COMPLEX_TERM__({}, {}, FOUND_VAR_AGAIN());
|
||||||
/* do or pt2 are unbound */
|
/* do or pt2 are unbound */
|
||||||
YapBind(ptd0,TermFoundVar);
|
YapBind(ptd0,TermFoundVar);
|
||||||
|
goto restart;
|
||||||
END_WALK();
|
END_WALK();
|
||||||
/* Do we still have compound terms to visit */
|
/* Do we still have compound terms to visit */
|
||||||
if (to_visit > to_visit0) {
|
if (to_visit > to_visit0) {
|
||||||
@ -1172,12 +1161,12 @@ static Int numbervars_in_complex_term(CELL *pt0, CELL *pt0_end, Int numbv,
|
|||||||
tr_fr_ptr TR0 = TR;
|
tr_fr_ptr TR0 = TR;
|
||||||
CELL *InitialH = HR;
|
CELL *InitialH = HR;
|
||||||
|
|
||||||
WALK_COMPLEX_TERM__({}, RENUMBER_SINGLES, {});
|
WALK_COMPLEX_TERM__({}, {}, {});
|
||||||
|
|
||||||
if (IsAttVar(pt0))
|
if (IsAttVar(pt0))
|
||||||
continue;
|
continue;
|
||||||
/* do or pt2 are unbound */
|
/* do or pt2 are unbound */
|
||||||
if (singles)
|
if (singles || 0)
|
||||||
d0 = numbervar_singleton(PASS_REGS1);
|
d0 = numbervar_singleton(PASS_REGS1);
|
||||||
else
|
else
|
||||||
d0 = numbervar(numbv++ PASS_REGS);
|
d0 = numbervar(numbv++ PASS_REGS);
|
||||||
@ -1211,7 +1200,7 @@ static Int numbervars_in_complex_term(CELL *pt0, CELL *pt0_end, Int numbv,
|
|||||||
def_aux_overflow();
|
def_aux_overflow();
|
||||||
|
|
||||||
def_global_overflow();
|
def_global_overflow();
|
||||||
def_trail_overflow();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Int Yap_NumberVars(Term inp, Int numbv,
|
Int Yap_NumberVars(Term inp, Int numbv,
|
||||||
@ -1436,7 +1425,7 @@ restart:
|
|||||||
goto restart;
|
goto restart;
|
||||||
|
|
||||||
derefa_body(d0, ptd0, vars_in_term_unk, vars_in_term_nvar);
|
derefa_body(d0, ptd0, vars_in_term_unk, vars_in_term_nvar);
|
||||||
*ptf++ = d0;
|
*ptf++ = (CELL)ptd0;
|
||||||
goto restart;
|
goto restart;
|
||||||
}
|
}
|
||||||
/* Do we still have compound terms to visit */
|
/* Do we still have compound terms to visit */
|
||||||
|
@ -34,7 +34,7 @@
|
|||||||
% grounds all free variables
|
% grounds all free variables
|
||||||
% as terms of the form '$VAR'(N)
|
% as terms of the form '$VAR'(N)
|
||||||
*/
|
*/
|
||||||
numbervars(Term, M, N) :-
|
_numbervars(Term, M, N) :-
|
||||||
'$variables_in_term'(Term, [], L),
|
'$variables_in_term'(Term, [], L),
|
||||||
'$numbermarked_vars'(L, M, N).
|
'$numbermarked_vars'(L, M, N).
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
%, copy_term(X,Y), writeln('....'), writeln(X), writeln(Y).
|
%, copy_term(X,Y), writeln('....'), writeln(X), writeln(Y).
|
||||||
|
|
||||||
:- initialization(main).
|
:- linitialization(main).
|
||||||
|
|
||||||
main :-
|
main :-
|
||||||
main( cyclic_term(X), X).
|
main( cyclic_term(X), X).
|
||||||
@ -12,6 +12,11 @@ main :-
|
|||||||
main :-
|
main :-
|
||||||
writeln('-----------------------'),
|
writeln('-----------------------'),
|
||||||
fail.
|
fail.
|
||||||
|
main :-
|
||||||
|
main2( (terms:new_variables_in_term(L,X, O), writeln(X+L=O) ), X, L, O).
|
||||||
|
main :-
|
||||||
|
writeln('-----------------------'),
|
||||||
|
fail.
|
||||||
main :-
|
main :-
|
||||||
main( writeln(X), X).
|
main( writeln(X), X).
|
||||||
main :-
|
main :-
|
||||||
@ -26,6 +31,11 @@ main(G, X) :-
|
|||||||
d(X),
|
d(X),
|
||||||
m(G).
|
m(G).
|
||||||
|
|
||||||
|
|
||||||
|
main2(G, X, L, O) :-
|
||||||
|
e(X,L),
|
||||||
|
m(G).
|
||||||
|
|
||||||
m( G ) :-
|
m( G ) :-
|
||||||
G,
|
G,
|
||||||
!,
|
!,
|
||||||
@ -57,6 +67,12 @@ d(X) :- X= f(_,A/[A]), A= f(B,[X,g(A)]), B=[C|B], C=[X].
|
|||||||
|
|
||||||
end :- writeln('....'), fail.
|
end :- writeln('....'), fail.
|
||||||
|
|
||||||
|
e(X,Y) :- X = t(_A,B,_C,D), Y = [B,E].
|
||||||
|
e(X,Y) :- X = t(_A,_B,_C,_D), Y = [_,_E].
|
||||||
|
e(X,Y) :- X = t(A,_B,C,_D), Y = [A,C].
|
||||||
|
e(X,Y) :- X = t(A,X,_B,[X,C,_D]), Y = [A,C,E].
|
||||||
|
|
||||||
|
|
||||||
a(no, no).
|
a(no, no).
|
||||||
a(no, no).
|
a(no, no).
|
||||||
a(yes, yes).
|
a(yes, yes).
|
||||||
|
Reference in New Issue
Block a user