is_list/1 is now a builtin.

This commit is contained in:
Vitor Santos Costa 2009-04-24 10:31:53 -05:00
parent ad617951ec
commit b5dc71d080
4 changed files with 20 additions and 15 deletions

View File

@ -2821,6 +2821,23 @@ p_unifiable(void)
return Yap_unify(ARG3, tf);
}
int
Yap_IsListTerm(Term t)
{
while (!IsVarTerm(t) && IsPairTerm(t)) {
t = TailOfTerm(t);
}
return t == TermNil;
}
static Int
p_is_list(void)
{
return Yap_IsListTerm(Deref(ARG1));
}
void Yap_InitUtilCPreds(void)
{
Term cm = CurrentModule;
@ -2832,6 +2849,7 @@ void Yap_InitUtilCPreds(void)
Yap_InitCPred("$non_singletons_in_term", 3, p_non_singletons_in_term, SafePredFlag|HiddenPredFlag);
Yap_InitCPred("term_variables", 2, p_term_variables, 0);
Yap_InitCPred("term_variables", 3, p_term_variables3, 0);
Yap_InitCPred("is_list", 1, p_is_list, SafePredFlag);
CurrentModule = TERMS_MODULE;
Yap_InitCPred("variable_in_term", 2, p_var_in_term, SafePredFlag);
Yap_InitCPred("term_hash", 4, p_term_hash, SafePredFlag);

View File

@ -353,6 +353,7 @@ void STD_PROTO(Yap_InitUserBacks,(void));
/* utilpreds.c */
Term STD_PROTO(Yap_CopyTerm,(Term));
int STD_PROTO(Yap_IsListTerm,(Term));
Term STD_PROTO(Yap_CopyTermNoShare,(Term));
int STD_PROTO(Yap_SizeGroundTerm,(Term, int));
void STD_PROTO(Yap_InitUtilCPreds,(void));

View File

@ -8,7 +8,6 @@
append/3,
append/2,
delete/3,
is_list/1,
last/2,
member/2,
memberchk/2,
@ -83,14 +82,6 @@ delete([Head|List], Elem, [Head|Residue]) :-
delete(List, Elem, Residue).
% is_list(List)
% is true when List is a proper List
%
is_list(L) :- var(L), !, fail.
is_list([]).
is_list([_|List]) :- is_list(List).
% last(List, Last)
% is true when List is a List and Last is identical to its last element.
% This could be defined as last(L, X) :- append(_, [X], L).

View File

@ -1403,12 +1403,7 @@ X_API int PL_is_integer(term_t ts)
X_API int PL_is_list(term_t ts)
{
YAP_Term t = Yap_GetFromSlot(ts);
if (YAP_IsPairTerm(t)) {
return 1;
} else if (IsAtomTerm(t)) {
return t == TermNil;
} else
return 0;
return Yap_IsListTerm(t);
}
X_API int PL_is_number(term_t ts)