diff --git a/C/utilpreds.c b/C/utilpreds.c index 7bf892cdf..29770f81f 100644 --- a/C/utilpreds.c +++ b/C/utilpreds.c @@ -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); diff --git a/H/Yapproto.h b/H/Yapproto.h index 4f45c9373..2d7782c8d 100644 --- a/H/Yapproto.h +++ b/H/Yapproto.h @@ -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)); diff --git a/library/lists.yap b/library/lists.yap index b31fa8438..bd2f80b93 100644 --- a/library/lists.yap +++ b/library/lists.yap @@ -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). diff --git a/library/yap2swi/yap2swi.c b/library/yap2swi/yap2swi.c index eac753789..50826c937 100644 --- a/library/yap2swi/yap2swi.c +++ b/library/yap2swi/yap2swi.c @@ -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)