Sophie

Sophie

distrib > Mandriva > 2010.0 > i586 > by-pkgid > 2fc07611b08d4a735fd34d5eb60d8e16 > files > 2180

ciao-1.10p8-3mdv2010.0.i586.rpm

<HTML>
<HEAD>
<!-- Created by texi2html 1.56k + clip patches and <A href="http://www.clip.dia.fi.upm.es/Software">lpdoc</A> from ciao.texi on 28 January 2007 -->

<LINK rel="stylesheet" href="ciao.css" type="text/css">
<TITLE>The Ciao Prolog System               - Double linked list</TITLE>
</HEAD>
<BODY> 
Go to the <A HREF="ciao_1.html">first</A>, <A HREF="ciao_224.html">previous</A>, <A HREF="ciao_226.html">next</A>, <A HREF="ciao_241.html">last</A> section, <A HREF="ciao_toc.html">table of contents</A>.
<P><HR><P>


<H1><A NAME="SEC874" HREF="ciao_toc.html#TOC874">Double linked list</A></H1>
<P>
<A NAME="IDX9643"></A>


<P>
<STRONG>Author(s):</STRONG> David Trallero Mena.


<P>
<STRONG>Version:</STRONG> 1.10#7 (2006/4/26, 19:22:13 CEST)


<P>
<STRONG>Version of last change:</STRONG> 1.9#116 (2003/12/1, 22:4:57 CET)


<P>
This library allows the user to work with double linked lists. An index is used for referencing the current element in the list. Such index can be modified by <EM>next</EM> and <EM>prev</EM> predicated. The value of the current index can be obtained with <EM>top</EM> predicate



<UL>
<LI><A HREF="ciao_225.html#SEC875">Usage and interface (ddlist)</A>
<LI><A HREF="ciao_225.html#SEC876">Documentation on exports (ddlist)</A>
<LI><A HREF="ciao_225.html#SEC877">Other information (ddlist)</A>
</UL>



<H2><A NAME="SEC875" HREF="ciao_toc.html#TOC875">Usage and interface (<CODE>ddlist</CODE>)</A></H2>

<div class="cartouche">

<UL>

<LI><STRONG>Library usage:</STRONG>

<CODE>:- use_module(library(ddlist)).</CODE>

<LI><STRONG>Exports:</STRONG>


<UL>

<LI><EM>Predicates:</EM>

<A NAME="IDX9644"></A>
<CODE>null_list/1</CODE>, 
<A NAME="IDX9645"></A>
<CODE>next/2</CODE>, 
<A NAME="IDX9646"></A>
<CODE>prev/2</CODE>, 
<A NAME="IDX9647"></A>
<CODE>insert/3</CODE>, 
<A NAME="IDX9648"></A>
<CODE>insert_top/3</CODE>, 
<A NAME="IDX9649"></A>
<CODE>insert_after/3</CODE>, 
<A NAME="IDX9650"></A>
<CODE>delete/2</CODE>, 
<A NAME="IDX9651"></A>
<CODE>delete_top/2</CODE>, 
<A NAME="IDX9652"></A>
<CODE>delete_after/2</CODE>, 
<A NAME="IDX9653"></A>
<CODE>top/2</CODE>, 
<A NAME="IDX9654"></A>
<CODE>rewind/2</CODE>, 
<A NAME="IDX9655"></A>
<CODE>forward/2</CODE>, 
<A NAME="IDX9656"></A>
<CODE>length/2</CODE>, 
<A NAME="IDX9657"></A>
<CODE>length_next/2</CODE>, 
<A NAME="IDX9658"></A>
<CODE>length_prev/2</CODE>.

<LI><EM>Regular Types:</EM>

<A NAME="IDX9659"></A>
<CODE>ddlist/1</CODE>.

</UL>

<LI><STRONG>Other modules used:</STRONG>


<UL>

<LI><EM>System library modules:</EM>

<A NAME="IDX9660"></A>
<CODE>lists</CODE>.

</UL>

</UL>

</div class="cartouche">



<H2><A NAME="SEC876" HREF="ciao_toc.html#TOC876">Documentation on exports (<CODE>ddlist</CODE>)</A></H2>
<P>
<A NAME="IDX9661"></A>
<A NAME="IDX9662"></A>
<DL>
<DT><span class="define">PREDICATE:</span> <B>null_list/1:</B>
<DD><A NAME="IDX9663"></A>


<P>
<STRONG>Usage:</STRONG> <CODE>null_list(?NullList)</CODE>

<UL>
<LI><EM>Description:</EM> <CODE>NullList</CODE> is an empty list

<LI><EM>The following properties should hold at call time:</EM>

<CODE>A</CODE> is a free variable.
 (<CODE>term_typing:var/1</CODE>)
<LI><EM>The following properties should hold upon exit:</EM>

<CODE>A</CODE> is double linked list
 (<CODE>ddlist:ddlist/1</CODE>)
</UL>

</DL>

<P>
<A NAME="IDX9664"></A>
<A NAME="IDX9665"></A>
<DL>
<DT><span class="define">PREDICATE:</span> <B>next/2:</B>
<DD><A NAME="IDX9666"></A>


<P>
<STRONG>Usage:</STRONG> <CODE>next(OldList, NewList)</CODE>

<UL>
<LI><EM>Description:</EM> <CODE>NewList</CODE> is <CODE>OldList</CODE> but index is set to next element of current element of OldList. It satisfies next(A,B),prev(B,A)

<LI><EM>Call and exit should be <EM>compatible</EM> with:</EM>

<CODE>OldList</CODE> is double linked list
 (<CODE>ddlist:ddlist/1</CODE>)

<CODE>NewList</CODE> is double linked list
 (<CODE>ddlist:ddlist/1</CODE>)
</UL>

</DL>

<P>
<A NAME="IDX9667"></A>
<A NAME="IDX9668"></A>
<DL>
<DT><span class="define">PREDICATE:</span> <B>prev/2:</B>
<DD><A NAME="IDX9669"></A>


<P>
<STRONG>Usage:</STRONG> <CODE>prev(OldList, NewList)</CODE>

<UL>
<LI><EM>Description:</EM> <CODE>NewList</CODE> is <CODE>OldList</CODE> but index is set to previous element of current element of <CODE>OldList</CODE>op) of <CODE>OldList</CODE>

<LI><EM>Call and exit should be <EM>compatible</EM> with:</EM>

<CODE>OldList</CODE> is double linked list
 (<CODE>ddlist:ddlist/1</CODE>)

<CODE>NewList</CODE> is double linked list
 (<CODE>ddlist:ddlist/1</CODE>)
</UL>

</DL>

<P>
<A NAME="IDX9670"></A>
<A NAME="IDX9671"></A>
<DL>
<DT><span class="define">PREDICATE:</span> <B>insert/3:</B>
<DD><A NAME="IDX9672"></A>


<P>
<STRONG>Usage:</STRONG> <CODE>insert(List, Element, NewList)</CODE>

<UL>
<LI><EM>Description:</EM> <CODE>NewList</CODE> is like <CODE>List</CODE> but with <CODE>Element</CODE> inserted _BEFORE_ the current index It satisfies insert( X , A , Xp ) , delete( Xp , X ).

<LI><EM>Call and exit should be <EM>compatible</EM> with:</EM>

<CODE>List</CODE> is double linked list
 (<CODE>ddlist:ddlist/1</CODE>)

<CODE>NewList</CODE> is double linked list
 (<CODE>ddlist:ddlist/1</CODE>)
</UL>

</DL>

<P>
<A NAME="IDX9673"></A>
<A NAME="IDX9674"></A>
<DL>
<DT><span class="define">PREDICATE:</span> <B>insert_top/3:</B>
<DD><A NAME="IDX9675"></A>


<P>
<STRONG>Usage:</STRONG> <CODE>insert_top(List, Element, NewList)</CODE>

<UL>
<LI><EM>Description:</EM> Put <CODE>Element</CODE> as new top of <CODE>NewList</CODE> and push the rest of elements after it. It satisfies top( NewList , element )

<LI><EM>Call and exit should be <EM>compatible</EM> with:</EM>

<CODE>List</CODE> is double linked list
 (<CODE>ddlist:ddlist/1</CODE>)

<CODE>NewList</CODE> is double linked list
 (<CODE>ddlist:ddlist/1</CODE>)
</UL>

</DL>

<P>
<A NAME="IDX9676"></A>
<A NAME="IDX9677"></A>
<DL>
<DT><span class="define">PREDICATE:</span> <B>insert_after/3:</B>
<DD><A NAME="IDX9678"></A>


<P>
<STRONG>Usage:</STRONG> <CODE>insert_after(List, Element, NewList)</CODE>

<UL>
<LI><EM>Description:</EM> <CODE>NewList</CODE> is like <CODE>List</CODE> but with <CODE>Element</CODE> inserted _AFTER_ the current index It satisfies insert_after( X , A , Xp ) , delete_after( Xp , X ).

<LI><EM>Call and exit should be <EM>compatible</EM> with:</EM>

<CODE>List</CODE> is double linked list
 (<CODE>ddlist:ddlist/1</CODE>)

<CODE>NewList</CODE> is double linked list
 (<CODE>ddlist:ddlist/1</CODE>)
</UL>

</DL>

<P>
<A NAME="IDX9679"></A>
<A NAME="IDX9680"></A>
<DL>
<DT><span class="define">PREDICATE:</span> <B>delete/2:</B>
<DD><A NAME="IDX9681"></A>


<P>
<STRONG>Usage:</STRONG> <CODE>delete(OldList, NewList)</CODE>

<UL>
<LI><EM>Description:</EM> <CODE>NewList</CODE> does not have the previous element (top(prev)) of <CODE>OldList</CODE>

<LI><EM>Call and exit should be <EM>compatible</EM> with:</EM>

<CODE>OldList</CODE> is double linked list
 (<CODE>ddlist:ddlist/1</CODE>)

<CODE>NewList</CODE> is double linked list
 (<CODE>ddlist:ddlist/1</CODE>)
</UL>

</DL>

<P>
<A NAME="IDX9682"></A>
<A NAME="IDX9683"></A>
<DL>
<DT><span class="define">PREDICATE:</span> <B>delete_top/2:</B>
<DD><A NAME="IDX9684"></A>


<P>
<STRONG>Usage:</STRONG> <CODE>delete_top(OldList, NewList)</CODE>

<UL>
<LI><EM>Description:</EM> <CODE>NewList</CODE> does not have the current element (top) of <CODE>OldList</CODE>

<LI><EM>Call and exit should be <EM>compatible</EM> with:</EM>

<CODE>OldList</CODE> is double linked list
 (<CODE>ddlist:ddlist/1</CODE>)

<CODE>NewList</CODE> is double linked list
 (<CODE>ddlist:ddlist/1</CODE>)
</UL>

</DL>

<P>
<A NAME="IDX9685"></A>
<A NAME="IDX9686"></A>
<DL>
<DT><span class="define">PREDICATE:</span> <B>delete_after/2:</B>
<DD><A NAME="IDX9687"></A>


<P>
<STRONG>Usage:</STRONG> <CODE>delete_after(OldList, NewList)</CODE>

<UL>
<LI><EM>Description:</EM> <CODE>NewList</CODE> does not have next element to current element (top) of <CODE>OldList</CODE>

<LI><EM>Call and exit should be <EM>compatible</EM> with:</EM>

<CODE>OldList</CODE> is double linked list
 (<CODE>ddlist:ddlist/1</CODE>)

<CODE>NewList</CODE> is double linked list
 (<CODE>ddlist:ddlist/1</CODE>)
</UL>

</DL>

<P>
<A NAME="IDX9688"></A>
<A NAME="IDX9689"></A>
<DL>
<DT><span class="define">PREDICATE:</span> <B>top/2:</B>
<DD><A NAME="IDX9690"></A>


<P>
<STRONG>Usage:</STRONG> <CODE>top(List, Element)</CODE>

<UL>
<LI><EM>Description:</EM> <CODE>Element</CODE> is the element pointed by index

<LI><EM>Call and exit should be <EM>compatible</EM> with:</EM>

<CODE>List</CODE> is double linked list
 (<CODE>ddlist:ddlist/1</CODE>)
</UL>

</DL>

<P>
<A NAME="IDX9691"></A>
<A NAME="IDX9692"></A>
<DL>
<DT><span class="define">PREDICATE:</span> <B>rewind/2:</B>
<DD><A NAME="IDX9693"></A>


<P>
<STRONG>Usage:</STRONG> <CODE>rewind(OldList, NewList)</CODE>

<UL>
<LI><EM>Description:</EM> <CODE>NewList</CODE> is the <CODE>OldList</CODE> but index is set to 0

<LI><EM>Call and exit should be <EM>compatible</EM> with:</EM>

<CODE>OldList</CODE> is double linked list
 (<CODE>ddlist:ddlist/1</CODE>)

<CODE>NewList</CODE> is double linked list
 (<CODE>ddlist:ddlist/1</CODE>)
</UL>

</DL>

<P>
<A NAME="IDX9694"></A>
<A NAME="IDX9695"></A>
<DL>
<DT><span class="define">PREDICATE:</span> <B>forward/2:</B>
<DD><A NAME="IDX9696"></A>


<P>
<STRONG>Usage:</STRONG> <CODE>forward(OldList, NewList)</CODE>

<UL>
<LI><EM>Description:</EM> <CODE>NewList</CODE> is the <CODE>OldList</CODE> but index is set to lentgh of <CODE>NewList</CODE>

<LI><EM>Call and exit should be <EM>compatible</EM> with:</EM>

<CODE>OldList</CODE> is double linked list
 (<CODE>ddlist:ddlist/1</CODE>)

<CODE>NewList</CODE> is double linked list
 (<CODE>ddlist:ddlist/1</CODE>)
</UL>

</DL>

<P>
<A NAME="IDX9697"></A>
<A NAME="IDX9698"></A>
<DL>
<DT><span class="define">PREDICATE:</span> <B>length/2:</B>
<DD><A NAME="IDX9699"></A>


<P>
<STRONG>Usage:</STRONG> <CODE>length(List, Len)</CODE>

<UL>
<LI><EM>Description:</EM> <CODE>Len</CODE> is the length of the <CODE>List</CODE>

<LI><EM>Call and exit should be <EM>compatible</EM> with:</EM>

<CODE>List</CODE> is double linked list
 (<CODE>ddlist:ddlist/1</CODE>)
</UL>

</DL>

<P>
<A NAME="IDX9700"></A>
<A NAME="IDX9701"></A>
<DL>
<DT><span class="define">PREDICATE:</span> <B>length_next/2:</B>
<DD><A NAME="IDX9702"></A>


<P>
<STRONG>Usage:</STRONG> <CODE>length_next(List, Len)</CODE>

<UL>
<LI><EM>Description:</EM> <CODE>Len</CODE> is the length from the current index till the end

<LI><EM>Call and exit should be <EM>compatible</EM> with:</EM>

<CODE>List</CODE> is double linked list
 (<CODE>ddlist:ddlist/1</CODE>)
</UL>

</DL>

<P>
<A NAME="IDX9703"></A>
<A NAME="IDX9704"></A>
<DL>
<DT><span class="define">PREDICATE:</span> <B>length_prev/2:</B>
<DD><A NAME="IDX9705"></A>


<P>
<STRONG>Usage:</STRONG> <CODE>length_prev(List, Len)</CODE>

<UL>
<LI><EM>Description:</EM> <CODE>Len</CODE> is the length from the beginning till the current index

<LI><EM>Call and exit should be <EM>compatible</EM> with:</EM>

<CODE>List</CODE> is double linked list
 (<CODE>ddlist:ddlist/1</CODE>)
</UL>

</DL>

<P>
<A NAME="IDX9706"></A>
<A NAME="IDX9707"></A>
<DL>
<DT><span class="define">REGTYPE:</span> <B>ddlist/1:</B>
<DD><A NAME="IDX9708"></A>


<P>
<STRONG>Usage:</STRONG> <CODE>ddlist(X)</CODE>

<UL>
<LI><EM>Description:</EM> <CODE>X</CODE> is double linked list

</UL>

</DL>



<H2><A NAME="SEC877" HREF="ciao_toc.html#TOC877">Other information (<CODE>ddlist</CODE>)</A></H2>

<P>
 


<P>
Two simple examples of the use of the ddlist library package follow. 



<UL>
<LI><A HREF="ciao_225.html#SEC878">Using insert_after</A>
<LI><A HREF="ciao_225.html#SEC879">More Complex example</A>
</UL>



<H3><A NAME="SEC878" HREF="ciao_toc.html#TOC878">Using insert_after</A></H3>

<P>



<PRE>
:- module( ddl1 , _ , [] ).

:- use_module( library(ddlist) ).

main(A,B):-
        % L = []
        null_list( L ),
        % L = [1]
        insert_after( L  , 1 , L1 ),
        % L = [1,2]
        insert_after( L1 , 2 , L2 ),
        % L = [1,3,2]
        insert_after( L2 , 3 , L3 ),
        % L = [1,3,2] =&#62; A = [1]
        top( L3 , A ),
        % L = [3,2]
        next( L3 , PL3 ),
        % L = [3,2] =&#62; A = [3]
        top( PL3 , B ).

</PRE>

<P>
 




<H3><A NAME="SEC879" HREF="ciao_toc.html#TOC879">More Complex example</A></H3>

<P>



<PRE>
:- module( ddl2 , _ , [] ).

:- use_module( library(ddlist) ).

main(A,B):-
        % L = []
        null_list( L ),
        % L = [1]
        insert_after( L  , 1 , L1 ),
        % L = [1,2]
        insert_after( L1 , 2 , L2 ),
        % L = [1,2]
        insert( L2 , 3 , L3 ),
        % L = [3,1,2]
        prev( L3 , PL3 ),
        % L = [],
        forward( PL3 , FOR ),
        % L = [2]
        prev( FOR , FOR1 ),
        % L = [2] =&#62; A = 2
        top( FOR1 , A ),
        % L = [1,2]
        prev( FOR1 , FOR2 ),
        % L = [2]
        delete_after( FOR2 , FOR3 ),
        % L = [3,2]
        prev( FOR3, FOR4 ),
        % L = [3,2] =&#62; B = 3
        top( FOR4 , B ).

</PRE>

<P><HR><P>
Go to the <A HREF="ciao_1.html">first</A>, <A HREF="ciao_224.html">previous</A>, <A HREF="ciao_226.html">next</A>, <A HREF="ciao_241.html">last</A> section, <A HREF="ciao_toc.html">table of contents</A>.
</BODY>
</HTML>