fix bad handling of singletons with write_canonical.

This commit is contained in:
Vítor Santos Costa 2012-03-14 22:10:21 +00:00
parent b01261eed5
commit cc8521c9d5
4 changed files with 38 additions and 11 deletions

View File

@ -3989,7 +3989,7 @@ YAP_ListLength(Term t) {
Int Int
YAP_NumberVars(Term t, Int nbv) { YAP_NumberVars(Term t, Int nbv) {
return Yap_NumberVars(t, nbv); return Yap_NumberVars(t, nbv, FALSE);
} }
Term Term

View File

@ -623,7 +623,7 @@ currentOperator(Module m, atom_t name, int kind, int *type, int *priority)
int int
numberVars(term_t t, nv_options *opts, int n ARG_LD) { numberVars(term_t t, nv_options *opts, int n ARG_LD) {
return Yap_NumberVars(YAP_GetFromSlot(t), n); return Yap_NumberVars(YAP_GetFromSlot(t), n, TRUE);
} }
/******************************* /*******************************

View File

@ -4257,8 +4257,23 @@ numbervar(Int id)
return Yap_MkApplTerm(FunctorVar, 1, ts); return Yap_MkApplTerm(FunctorVar, 1, ts);
} }
static Term
numbervar_singleton(void)
{
Term ts[1];
ts[0] = MkIntegerTerm(-1);
return Yap_MkApplTerm(FunctorVar, 1, ts);
}
static Int numbervars_in_complex_term(register CELL *pt0, register CELL *pt0_end, Int numbv USES_REGS) static void
renumbervar(Term t, Int id)
{
Term *ts = RepAppl(t);
ts[1] = MkIntegerTerm(id);
}
static Int numbervars_in_complex_term(register CELL *pt0, register CELL *pt0_end, Int numbv, int singles USES_REGS)
{ {
register CELL **to_visit0, **to_visit = (CELL **)Yap_PreAllocCodeSpace(); register CELL **to_visit0, **to_visit = (CELL **)Yap_PreAllocCodeSpace();
@ -4304,6 +4319,10 @@ static Int numbervars_in_complex_term(register CELL *pt0, register CELL *pt0_end
if (IsExtensionFunctor(f)) { if (IsExtensionFunctor(f)) {
continue; continue;
} }
if (singles && ap2 >= InitialH && ap2 < H) {
renumbervar(d0, numbv++);
continue;
}
/* store the terms to visit */ /* store the terms to visit */
if (to_visit + 1024 >= (CELL **)AuxSp) { if (to_visit + 1024 >= (CELL **)AuxSp) {
goto aux_overflow; goto aux_overflow;
@ -4331,7 +4350,10 @@ static Int numbervars_in_complex_term(register CELL *pt0, register CELL *pt0_end
derefa_body(d0, ptd0, vars_in_term_unk, vars_in_term_nvar); derefa_body(d0, ptd0, vars_in_term_unk, vars_in_term_nvar);
/* do or pt2 are unbound */ /* do or pt2 are unbound */
*ptd0 = numbervar(numbv++); if (singles)
*ptd0 = numbervar_singleton();
else
*ptd0 = numbervar(numbv++);
/* leave an empty slot to fill in later */ /* leave an empty slot to fill in later */
if (H+1024 > ASP) { if (H+1024 > ASP) {
goto global_overflow; goto global_overflow;
@ -4411,7 +4433,7 @@ static Int numbervars_in_complex_term(register CELL *pt0, register CELL *pt0_end
} }
Int Int
Yap_NumberVars( Term inp, Int numbv ) /* numbervariables in term t */ Yap_NumberVars( Term inp, Int numbv, int handle_singles ) /* numbervariables in term t */
{ {
CACHE_REGS CACHE_REGS
Int out; Int out;
@ -4421,20 +4443,25 @@ Yap_NumberVars( Term inp, Int numbv ) /* numbervariables in term t */
t = Deref(inp); t = Deref(inp);
if (IsVarTerm(t)) { if (IsVarTerm(t)) {
CELL *ptd0 = VarOfTerm(t); CELL *ptd0 = VarOfTerm(t);
*ptd0 = numbervar(numbv);
TrailTerm(TR++) = (CELL)ptd0; TrailTerm(TR++) = (CELL)ptd0;
return numbv+1; if (handle_singles) {
*ptd0 = numbervar_singleton();
return numbv;
} else {
*ptd0 = numbervar(numbv);
return numbv+1;
}
} else if (IsPrimitiveTerm(t)) { } else if (IsPrimitiveTerm(t)) {
return numbv; return numbv;
} else if (IsPairTerm(t)) { } else if (IsPairTerm(t)) {
out = numbervars_in_complex_term(RepPair(t)-1, out = numbervars_in_complex_term(RepPair(t)-1,
RepPair(t)+1, numbv PASS_REGS); RepPair(t)+1, numbv, handle_singles PASS_REGS);
} else { } else {
Functor f = FunctorOfTerm(t); Functor f = FunctorOfTerm(t);
out = numbervars_in_complex_term(RepAppl(t), out = numbervars_in_complex_term(RepAppl(t),
RepAppl(t)+ RepAppl(t)+
ArityOfFunctor(f), numbv PASS_REGS); ArityOfFunctor(f), numbv, handle_singles PASS_REGS);
} }
if (out < 0) { if (out < 0) {
if (!expand_vts( 3 PASS_REGS )) if (!expand_vts( 3 PASS_REGS ))
@ -4458,7 +4485,7 @@ p_numbervars( USES_REGS1 )
Yap_Error(TYPE_ERROR_INTEGER,t2,"term_hash/4"); Yap_Error(TYPE_ERROR_INTEGER,t2,"term_hash/4");
return(FALSE); return(FALSE);
} }
if ((out = Yap_NumberVars(ARG1, IntegerOfTerm(t2))) < 0) if ((out = Yap_NumberVars(ARG1, IntegerOfTerm(t2), FALSE)) < 0)
return FALSE; return FALSE;
return Yap_unify(ARG3, MkIntegerTerm(out)); return Yap_unify(ARG3, MkIntegerTerm(out));
} }

View File

@ -403,7 +403,7 @@ int STD_PROTO(Yap_SizeGroundTerm,(Term, int));
int STD_PROTO(Yap_IsGroundTerm,(Term)); int STD_PROTO(Yap_IsGroundTerm,(Term));
void STD_PROTO(Yap_InitUtilCPreds,(void)); void STD_PROTO(Yap_InitUtilCPreds,(void));
Int STD_PROTO(Yap_TermHash,(Term, Int, Int, int)); Int STD_PROTO(Yap_TermHash,(Term, Int, Int, int));
Int STD_PROTO(Yap_NumberVars,(Term, Int)); Int STD_PROTO(Yap_NumberVars,(Term, Int, int));
Term STD_PROTO(Yap_UnNumberTerm,(Term, int)); Term STD_PROTO(Yap_UnNumberTerm,(Term, int));
Int STD_PROTO(Yap_SkipList,(Term *, Term **)); Int STD_PROTO(Yap_SkipList,(Term *, Term **));
/* yap.c */ /* yap.c */