<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] => A = [1] top( L3 , A ), % L = [3,2] next( L3 , PL3 ), % L = [3,2] => 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] => 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] => 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>