 
 
 
 
 
 
 
 
 
 
 Next: Attributed Variables
 Up: Library Utilities
 Previous: Library Utilities
     Contents 
     Index 
The XSB library contains various list utilities, some of which 
are listed below.  These predicates should be explicitly imported from
the module specified after the skeletal specification of each predicate.
There are a lot more useful list processing predicates in various modules
of the XSB system, and the interested user can find them by 
looking at the sources.
- append(?List1, ?List2, ?List3)
-  basics 
 Succeeds if list List3 is the concatenation of lists 
    List1 and List2.
 
- member(?Element, ?List)
-  basics 
 Checks whether Element unifies with any element of list 
    List, succeeding more than once if there are multiple 
    such elements.
 
- memberchk(?Element, ?List)
-  basics 
 Similar to member/2, except that memberchk/2 is
    deterministic, i.e. does not succeed more than once for any call.
 
- ith(?Index, ?List, ?Element)
-  basics 
 Succeeds if the element of the list List 
    unifies with Element.  Fails if Index is not a positive
    integer or greater than the length of List.
    Either Index and List, or List and Element, 
    should be instantiated (but not necessarily ground) at the time of 
    the call. element of the list List 
    unifies with Element.  Fails if Index is not a positive
    integer or greater than the length of List.
    Either Index and List, or List and Element, 
    should be instantiated (but not necessarily ground) at the time of 
    the call.
 
- log_ith(?Index, ?Tree, ?Element)
-  basics 
 Succeeds if the element of the Tree Tree
    unifies with Element.  Fails if Index is not a
    positive integer or greater than the number of elements that can
    be in Tree.  Either Index and Tree, or     Tree and Element, should be instantiated (but not
    necessarily ground) at the time of the call.  Tree is a list of
    full binary trees, the first being of depth 0, and each one being
    of depth one greater than its predecessor.  So log_ith/3 is
    very similar to ith/3 except it uses a tree instead of a
    list to obtain log-time access to its elements. element of the Tree Tree
    unifies with Element.  Fails if Index is not a
    positive integer or greater than the number of elements that can
    be in Tree.  Either Index and Tree, or     Tree and Element, should be instantiated (but not
    necessarily ground) at the time of the call.  Tree is a list of
    full binary trees, the first being of depth 0, and each one being
    of depth one greater than its predecessor.  So log_ith/3 is
    very similar to ith/3 except it uses a tree instead of a
    list to obtain log-time access to its elements.
 
- log_ith_bound(?Index, ?Tree, ?Element)
-  basics 
 is like log_ith/3, but only if the element
    of Tree is nonvariable and equal to Element.  This predicate
    can be used in both directions, and is most useful with Index
    unbound, since it will then bind Index and Element for
    each non-variable element in Tree (in time proportional to
    N*logN, for N the number of non-variable entries in  Tree.) element
    of Tree is nonvariable and equal to Element.  This predicate
    can be used in both directions, and is most useful with Index
    unbound, since it will then bind Index and Element for
    each non-variable element in Tree (in time proportional to
    N*logN, for N the number of non-variable entries in  Tree.)
 
- length(?List, ?Length)
-  basics 
 Succeeds if the length of the list List is Length.
    This predicate is deterministic if List is instantiated 
    to a list of definite length, but is nondeterministic if 
    List is a variable or has a variable tail.  If List
    is uninstantiated, it is unified with a list of length Length
    that contains variables.
 
- same_length(?List1, ?List2)
-  basics 
 Succeeds if list List1 and List2 are both lists of
    the same number of elements.  No relation between the types or
    values of their elements is implied.  This predicate may be used
    to generate either list (containing variables as elements) given
    the other, or to generate two lists of the same length, in which
    case the arguments will be bound to lists of length 
0, 1, 2,....
 
- select(?Element, ?L1, ?L2)
-  basics 
 List2 derives from List1 by selecting (removing) an 
 Element non-deterministically.
 
- reverse(+List, ?ReversedList)
-  basics 
 Succeeds if ReversedList is the reverse of list List.
    If List is not a proper list, reverse/2 can succeed
    arbitrarily many times.  It works only one way.
 
- perm(+List, ?Perm)
-  basics 
 Succeeds when List and Perm are permutations of each
    other.  The main use of perm/2 is to generate permutations
    of a given list.  List must be a proper list.
    Perm may be partly instantiated.
 
- subseq(?Sequence, ?SubSequence, ?Complement)
-  basics 
 Succeeds when SubSequence and Complement are both
    subsequences of the list Sequence (the order of corresponding
    elements being preserved) and every element of Sequence which
    is not in SubSequence is in the Complement and vice
    versa.  That is,
length(  ) =  length(  ) +  length(  )
 
 for example, subseq([1,2,3,4], [1,3], [2,4]).
    The main use of subseq/3 is to generate subsets and their
    complements together, but can also be used to interleave two lists
    in all possible ways.
 
- merge(+List1, +List2, ?List3)
-  listutil 
 Succeeds if List3 is the list resulting from ``merging'' lists 
    List1 and List2,
    i.e. the elements of List1 together with any element of 
    List2 not occurring in List1.
    If List1 or List2 contain duplicates, List3 may 
    also contain duplicates.
 
- absmerge(+List1, +List2, ?List3)
-  listutil 
 Predicate absmerge/3 is similar to merge/3, except that 
    it uses predicate absmember/2 described below rather than 
    member/2.
 
- absmember(+Element, +List)
-  listutil 
 Similar to member/2, except that it checks for identity
    (through the use of predicate '=='/2) rather than unifiability 
    (through '='/2) of Element with elements of List.
 
- member2(?Element, ?List)
-  listutil 
 Checks whether Element unifies with any of the actual elements 
    of List.  The only difference between this predicate and 
    predicate member/2 is on lists having a variable tail, 
    e.g.[a, b, c | _ ]: while member/2 would insert 
    Element at the end of such a list if it did not find it, 
    Predicate member2/2 only checks for membership but does not 
    insert the Element into the list if it is not there.
 
- delete_ith(+Index, +List, ?Element, ?RestList)
-  listutil 
 Succeeds if the element of the list List
    unifies with Element, and RestList is List with
    Element removed.  Fails if Index is not a positive
    integer or greater than the length of List. element of the list List
    unifies with Element, and RestList is List with
    Element removed.  Fails if Index is not a positive
    integer or greater than the length of List.
 
- closetail(?List)
-  listutil 
 Predicate closetail/1 closes the tail of an open-ended list.
    It succeeds only once.
 
 
 
 
 
 
 
 
 
 
 
 Next: Attributed Variables
 Up: Library Utilities
 Previous: Library Utilities
     Contents 
     Index 
Luis Fernando P. de Castro
2003-06-27