From 4bc0292ad6bec0ca49620bed234a9b8cad660b5f Mon Sep 17 00:00:00 2001 From: Vitor Santos Costa Date: Tue, 5 Feb 2019 10:31:17 +0000 Subject: [PATCH] fixes --- C/terms.c | 89 ++++++++++++++++++------------------------ pl/ground.yap | 2 +- regression/cyclics.yap | 20 +++++++++- 3 files changed, 58 insertions(+), 53 deletions(-) diff --git a/C/terms.c b/C/terms.c index a51af41c2..c99d1a1e3 100644 --- a/C/terms.c +++ b/C/terms.c @@ -34,6 +34,10 @@ #include "string.h" #endif +#define Malloc malloc +#define Realloc realloc + + static int expand_vts(int args USES_REGS) { UInt expand = LOCAL_Error_Size; yap_error_number yap_errno = LOCAL_Error_TYPE; @@ -149,7 +153,7 @@ typedef struct non_single_struct_t { register CELL d0; \ register CELL *ptd0; \ ++pt0; \ - ptd0 = pt0; \ + ptd0 = pt0; \ d0 = *ptd0; \ list_loop: \ deref_head(d0, var_in_term_unk); \ @@ -174,7 +178,6 @@ typedef struct non_single_struct_t { goto list_loop; \ } else if (IsApplTerm(d0)) { \ register Functor f; \ - register CELL *ap2; \ /* store the terms to visit */ \ ptd0 = RepAppl(d0); \ f = (Functor)(d0 = *ptd0); \ @@ -207,7 +210,7 @@ typedef struct non_single_struct_t { #define WALK_COMPLEX_TERM() WALK_COMPLEX_TERM__({}, {}, {}) -#define END_WALK() } +#define END_WALK() goto restart;} #define def_aux_overflow() \ aux_overflow : { \ @@ -276,7 +279,7 @@ static Term cyclic_complex_term(register CELL *pt0, WALK_COMPLEX_TERM__(CYC_LIST, CYC_APPL, {}); /* leave an empty slot to fill in later */ - + goto restart; END_WALK(); /* Do we still have compound terms to visit */ 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); return true; } + goto restart; END_WALK(); 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; - + goto restart; END_WALK(); /* Do we still have compound terms to visit */ 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 = pt0_end - 1; } + goto restart; END_WALK(); /* Do we still have compound terms to visit */ 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) { register tr_fr_ptr TR0 = TR; CELL *InitialH = HR; - CELL output = AbsPair(HR); + HB=ASP; + CELL output = TermNil; { - int lvl = push_text_stack(); while (!IsVarTerm(inp) && IsPairTerm(inp)) { Term t = HeadOfTerm(inp); if (IsVarTerm(t)) { - CELL *ptr = VarOfTerm(t); - *ptr = TermFoundVar; - TrailTerm(TR++) = t; + YapBind( VarOfTerm(t), TermFoundVar ); + if ((tr_fr_ptr)LOCAL_TrailTop - TR < 1024) { + 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 (!Yap_growtrail((TR - TR0) * sizeof(tr_fr_ptr *), true)) { 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 */ if (HR + 1024 > ASP) { 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(); /* Do we still have compound terms to visit */ if (to_visit > to_visit0) { @@ -798,18 +789,13 @@ static Term new_vars_in_complex_term(register CELL *pt0, register CELL *pt0_end, pt0_end = to_visit->pt0_end; CELL *ptd0 = to_visit->ptd0; *ptd0 = to_visit->d0; - goto restart; } clean_tr(TR0 PASS_REGS); pop_text_stack(lvl); - if (HR != InitialH) { - HR[-1] = TermNil; - return output; - } else { - return 0; - } - + HB = B->cp_h; + return output; + def_aux_overflow(); def_trail_overflow(); @@ -881,7 +867,7 @@ static Term vars_within_complex_term(register CELL *pt0, register CELL *pt0_end, } WALK_COMPLEX_TERM__({}, {}, FOUND_VAR()); - + goto restart; END_WALK(); /* Do we still have compound terms to visit */ 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; + goto restart; END_WALK(); /* 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; + goto restart; END_WALK(); /* 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()); /* do or pt2 are unbound */ YapBind(ptd0,TermFoundVar); + goto restart; END_WALK(); /* Do we still have compound terms to visit */ 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; CELL *InitialH = HR; - WALK_COMPLEX_TERM__({}, RENUMBER_SINGLES, {}); + WALK_COMPLEX_TERM__({}, {}, {}); if (IsAttVar(pt0)) continue; /* do or pt2 are unbound */ - if (singles) + if (singles || 0) d0 = numbervar_singleton(PASS_REGS1); else 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_global_overflow(); - def_trail_overflow(); + } Int Yap_NumberVars(Term inp, Int numbv, @@ -1436,7 +1425,7 @@ restart: goto restart; derefa_body(d0, ptd0, vars_in_term_unk, vars_in_term_nvar); - *ptf++ = d0; + *ptf++ = (CELL)ptd0; goto restart; } /* Do we still have compound terms to visit */ @@ -1515,6 +1504,6 @@ void Yap_InitTermCPreds(void) { Yap_InitCPred("ground", 1, ground, SafePredFlag); Yap_InitCPred("cyclic_term", 1, cyclic_term, SafePredFlag); - Yap_InitCPred("numbervars", 3, p_numbervars, 0); + Yap_InitCPred("numbervars", 3, p_numbervars, 0); Yap_InitCPred("largest_numbervar", 2, largest_numbervar, 0); } diff --git a/pl/ground.yap b/pl/ground.yap index 05ece7469..e3df5c1d5 100644 --- a/pl/ground.yap +++ b/pl/ground.yap @@ -34,7 +34,7 @@ % grounds all free variables % as terms of the form '$VAR'(N) */ -numbervars(Term, M, N) :- +_numbervars(Term, M, N) :- '$variables_in_term'(Term, [], L), '$numbermarked_vars'(L, M, N). diff --git a/regression/cyclics.yap b/regression/cyclics.yap index bd7baa290..b1ba11c6e 100644 --- a/regression/cyclics.yap +++ b/regression/cyclics.yap @@ -1,6 +1,6 @@ %, copy_term(X,Y), writeln('....'), writeln(X), writeln(Y). -:- initialization(main). +:- linitialization(main). main :- main( cyclic_term(X), X). @@ -13,7 +13,12 @@ main :- writeln('-----------------------'), fail. main :- - main( writeln(X), X). + main2( (terms:new_variables_in_term(L,X, O), writeln(X+L=O) ), X, L, O). +main :- + writeln('-----------------------'), + fail. +main :- + main( writeln(X), X). main :- writeln('-----------------------'), fail. @@ -26,6 +31,11 @@ main(G, X) :- d(X), m(G). + +main2(G, X, L, O) :- + e(X,L), + m(G). + m( 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. +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(yes, yes).