

<!DOCTYPE html>
<!-- Server: sfs-forge-1 -->


    

















<html lang="en" class="no-js">
<head>
    <meta content="text/html; charset=UTF-8" http-equiv="content-type"/>
    <title>
  XSB / Src  (SVN)-old /
  [r80]
  /trunk/XSB/docs/userman/library.tex
</title>
    

<meta name="viewport" content="width=1100">


<link rel="icon" sizes="180x180" href="https://a.fsdn.com/con/img/sandiego/logo-180x180.png" type="image/png">
<link rel="icon" sizes="any" href="https://a.fsdn.com/con/img/sandiego/svg/originals/sf-icon-orange-no_sf.svg" type="image/svg+xml">
<link rel="apple-touch-icon" sizes="180x180" href="https://a.fsdn.com/con/img/sandiego/logo-180x180.png">
<link rel="mask-icon" href="https://a.fsdn.com/con/img/sandiego/svg/originals/sf-icon-orange-no_sf.svg" color="#FF6600">


<script src="https://a.fsdn.com/allura/nf/1752697225/_ew_/theme/sftheme/js/sftheme/cmp2.js"></script>






    
    
    
    
    
    
    
    
    <link rel="stylesheet" href="https://a.fsdn.com/con/css/lato.css?">


<script>
if (!window.SF) { window.SF = {}; }
SF.sandiego = false;
SF.sandiego_chrome = true;
SF.cdn = "https://a.fsdn.com/con";
SF.fpid = 'b9f291b2-714e-46d1-9d86-954ac497e743';
SF.billboard_route = '/software/product/$slug/';
</script>
    
        <!-- ew:head_css -->

    
        <link rel="stylesheet"
                type="text/css"
                href="https://a.fsdn.com/allura/nf/1752697225/_ew_/_slim/css?href=allura%2Fcss%2Fforge%2Fhilite.css%3Ballura%2Fcss%2Fforge%2Ftooltipster.css"
                >
    
        <link rel="stylesheet"
                type="text/css"
                href="https://a.fsdn.com/allura/nf/1752697225/_ew_/allura/css/font-awesome.min.css"
                >
    
        <link rel="stylesheet"
                type="text/css"
                href="https://a.fsdn.com/allura/nf/1752697225/_ew_/theme/sftheme/css/forge.css"
                >
    
        
<!-- /ew:head_css -->

    
    
        <!-- ew:head_js -->

    
        <script type="text/javascript" src="https://a.fsdn.com/allura/nf/1752697225/_ew_/_slim/js?href=allura%2Fjs%2Fjquery-3.6.0.min.js%3Ballura%2Fjs%2Fjquery.cookie-1.4.1.js%3Btheme%2Fsftheme%2Fjs%2Fsftheme%2Fshared_head.js%3Btheme%2Fsftheme%2Fjs%2Fsftheme%2Ftypescript%2Fcompliance.js"></script>
    
        
<!-- /ew:head_js -->

    

    
        <style type="text/css">
            /* make URL &amp; Project custom fields in support tickets not get hidden as much */
.project-forge.mountpoint-site-support .view_holder .grid-4:nth-child(5),
.project-forge.mountpoint-site-support .view_holder .grid-4:nth-child(6) {
  overflow: visible;
  font-size: 22px;
  width: 340px;
  line-height: 1;
  margin-bottom: 5px;
}
.project-forge.mountpoint-site-support .view_holder .grid-4:nth-child(5) label, .project-forge.mountpoint-site-support .view_holder .grid-4:nth-child(6) label {
  font-size: 14px;
}
        </style>
    
    
    <link rel="alternate" type="application/rss+xml" title="RSS" href="/p/xsb/src/feed.rss"/>
    <link rel="alternate" type="application/atom+xml" title="Atom" href="/p/xsb/src/feed.atom"/>
    <style type="text/css">
        #access_urls .btn-set {
            
            min-width: 14em;
        }
    </style>

    <style>.XbcONwDCkOBwoUkfcKwrgxPKqWcOIwqnDhOwHCtg {
        display: none
    }</style>

    
    
    
        <link rel="canonical" href="https://sourceforge.net/p/xsb/src/80/tree/trunk/XSB/docs/userman/library.tex" />
    


    

<script>
    var data = {hem: null };
    bizx.uids.gatherAndClean(data);
</script>



<script>
    function initPiwik(){
      var _paq = window._paq = window._paq || [];
      _paq.push(['trackPageView', document.title, {
            dimension1: 'xsb',
            dimension2: 'svn'
      }]);
      _paq.push(['enableLinkTracking']);
      
          _paq.push(['enableHeartBeatTimer']);
      
      (function() {
        var u="//analytics.slashdotmedia.com/";
        _paq.push(['setTrackerUrl', u+'sf.php']);
        _paq.push(['setSiteId', 39]);
        
        var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
        g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'sf.js'; s.parentNode.insertBefore(g,s);
      })();
    }
    bizx.cmp.ifConsent({ purposes: ['storage', 'measurement'], vendors: 'sdm'}, initPiwik);
</script>






<!-- Hubspot tracking -->






 <script>
    $(function() {
        bizx.cmp.ifConsent({ purposes: 'all' , vendors: 'narrative'}, function() {
            var current_time = (new Date()).getTime();
            let imageUrl = "https://io.narrative.io/?companyId=2440&id=first_party%3Ab9f291b2-714e-46d1-9d86-954ac497e743&id=site_name%3Asourceforge.net&id=url%3A%2Fp%2Fxsb%2Fsrc%2F80%2Ftree%2Ftrunk%2FXSB%2Fdocs%2Fuserman%2Flibrary.tex&id=pagetitle%3A%24PAGE_TITLE&id=vertical%3AOpen+Source+Software&id=product%3AXSB";
            imageUrl = imageUrl.replace(encodeURIComponent("$PAGE_TITLE"), document.title);  

            imageUrl = URL.parse(imageUrl);
            let hem = bizx.uids.getHem();
            if (hem) {
                imageUrl.searchParams.append('id', 'hem:' + hem);
            }
            imageUrl.searchParams.append('rand', current_time);

            var image = new Image();
            image.src = imageUrl.toString();
            image.style.display = "none";
            image.style.height = 0;
            image.style.width = 0;
            document.body.appendChild(image);
        });
    });
</script>



</head>

<body class="
body_class sandiego_chrome  legacy_chrome  l-allow-natural-width 
" id="forge">

    
        <!-- ew:body_top_js -->

    
        
<!-- /ew:body_top_js -->

    





<div class="off-canvas position-right" id="offCanvas" data-off-canvas>
    <!-- Menu -->
    <ul class="header-nav-menulist">
        <li class="highlight search">
            
            
                
            
            
    <form method="get" action="/directory/" class="m-search-form">
    
        <input type="text" placeholder="Search for software or solutions" autocomplete="off" name="q" >
        
        <label >
            <input type="submit" class="bt" value="">
            


<svg  data-name="search" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1216 832q0-185-131.5-316.5t-316.5-131.5-316.5 131.5-131.5 316.5 131.5 316.5 316.5 131.5 316.5-131.5 131.5-316.5zm512 832q0 52-38 90t-90 38q-54 0-90-38l-343-342q-179 124-399 124-143 0-273.5-55.5t-225-150-150-225-55.5-273.5 55.5-273.5 150-225 225-150 273.5-55.5 273.5 55.5 225 150 150 225 55.5 273.5q0 220-124 399l343 343q37 37 37 90z"/></svg>
        </label>
    </form>
        </li>
        
        <li class="highlight"><a href="/auth/">Join/Login</a></li>
        
        <li><a href="/software/">Business Software</a></li>
        <li><a href="/directory/">Open Source Software</a></li>
        <li><a  href="/software/vendors/" title="For Vendors">For Vendors</a></li>
        <li><a href="/blog/" title="Blog">Blog</a></li>
        <li><a href="/about">About</a></li>
        <li><a id="header-nav-more" data-toggle="header-nav-more header-nav-more-content" data-toggler=".toggled">More</a></li>
        <li>
            <ul id="header-nav-more-content" class="toggled" data-toggler=".toggled">
                
    

    
    
        <li><a href="/articles/">Articles</a></li>
    
    

    
 
                
                <li><a href="/create">Create</a></li>
                
                <li><a href="https://sourceforge.net/articles/category/sourceforge-podcast/">SourceForge Podcast</a></li>
                
                    <li><a href="https://sourceforge.net/p/forge/documentation/Docs%20Home/">Site Documentation</a></li>
                
                <li><a href="/user/newsletters">Subscribe to our Newsletter</a></li>
                <li><a href="/support">Support Request</a></li>
            </ul>
        </li>
    </ul>
</div>
<div class="off-canvas-content" data-off-canvas-content>

    




<script>
    SF.linkout_icon = '<svg  data-name="sf-linkout-icon" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 300 300" style="enable-background:new 0 0 300 300;" xml:space="preserve"><polygon class="st0" points="243.2,243.2 56.8,243.2 56.8,56.8 123,56.8 123,9 9,9 9,291 291,291 291,179.4 243.2,179 "/><polygon class="st0" points="128.5,213 155,186.5 176,165.5 206.7,196.3 235.5,132.5 248.9,102.6 290.6,9.8 291,9 290.6,9.2 197.4,51.1 169.1,63.8 103.7,93.3 137,126.5 115.9,147.5 89.5,174 "/></svg>';
</script>


<div class="l-header-nav  sandiego">

    <section class="sandiego l-header-nav-top show-for-large">
        <div class="row">
            <a href="/" title="Home" class="sf-logo">
                
    
    <img src="https://a.fsdn.com/con/images/sandiego/sf-logo-full.svg"  alt="SourceForge logo" class="sf-logo-full"/>
            </a>
            <nav class="links">
                
                    <a href="/user/newsletters" title="Subscribe to our newsletter"><span class="newsletter-icon">


<svg  data-name="mmSF_11mail" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 42 42" enable-background="new 0 0 42 42" xml:space="preserve"><path fill="#FFFFFF" d="M0,6v30h42V6H0z M24.2,21.2c-0.8,0.8-2.3,2-3.2,2c-0.9,0-2.4-1.2-3.2-2L5.8,9.7h30.3L24.2,21.2z M13.7,21l-9.9,9.4V11.6L13.7,21z M15.7,23L15.7,23c0.5,0.5,2.9,2.9,5.3,2.9c2.4,0,4.8-2.4,5.2-2.8l0.1-0.1l9.8,9.4H5.8L15.7,23z M28.3,21l9.9-9.5v18.9L28.3,21z"/></svg></span></a>
                
                <a href="/software/vendors/" title="For Vendors">For Vendors</a>
                
                
                    <a href="/support" title="Help">Help</a>
                    <a href="/create/" title="Create">Create</a>
                

                
                <a href="/user/registration" title="Join" >Join</a>
                <a href="/auth/" title="Login">Login</a>
                
            </nav>
        </div>
    </section>

    <section class="sandiego l-header-nav-top hide-for-large">
        <div class="row">
            <a href="/" title="Home" class="sf-logo">
                
    
    <img src="https://a.fsdn.com/con/images/sandiego/sf-logo-full.svg"  alt="SourceForge logo" class="sf-logo-full"/>
            </a>
            <div class="title-bar-right">
                <button type="button" aria-label="Toggle Main Menu" class="menu-icon" data-toggle="offCanvas"></button>
            </div>
        </div>
    </section>
    <section class="sandiego l-header-nav-bottom">
        <nav class="row">
            <a href="/" title="Home" class="sf-logo">
                
    
    <img src="https://a.fsdn.com/con/images/sandiego/sf-logo-full.svg"  alt="SourceForge logo" class="sf-logo-full"/>
            </a>
            <div class="links">
                
    
        <div class="nav-dropdown">
            <a href="/software/">Business Software</a>
            
        </div>
        <div class="nav-dropdown">
            <a href="/directory/" title="Browse">Open Source Software</a>
            
        </div>
        <div class="nav-dropdown">
            <a href="https://sourceforge.net/articles/category/sourceforge-podcast/">SourceForge Podcast</a>
        </div>
        <div class="nav-dropdown">
            <a>Resources</a>
            <ul class="nav-dropdown-menu">
                  <li><a href="/articles/">Articles</a></li>
                  
                  <li><a href="/software/case-studies/">Case Studies</a></li>
                  
                  <li><a href="/blog/">Blog</a></li>
            </ul>
        </div>
    

                <div class="dev-menu-when-stuck">
                    Menu
                    <ul class="dev-menu-dropdown header-nav-menulist">
                        <li><a href="/support">Help</a></li>
                        <li><a href="/create">Create</a></li>
                        <li><a href="/user/registration/" title="Join" >Join</a></li>
                        <li><a href="/auth/" title="Login">Login</a></li>
                    </ul>
                </div>
                <div class="search-toggle-when-stuck">
                    <a class="search-toggle">
                        


<svg  data-name="search" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1216 832q0-185-131.5-316.5t-316.5-131.5-316.5 131.5-131.5 316.5 131.5 316.5 316.5 131.5 316.5-131.5 131.5-316.5zm512 832q0 52-38 90t-90 38q-54 0-90-38l-343-342q-179 124-399 124-143 0-273.5-55.5t-225-150-150-225-55.5-273.5 55.5-273.5 150-225 225-150 273.5-55.5 273.5 55.5 225 150 150 225 55.5 273.5q0 220-124 399l343 343q37 37 37 90z"/></svg>
                    </a>
                </div>
            </div>

            <div class="search">
                
                
    
    
        <div class="main-nav-link">
            
            
            <a href="https://www.avast.com/lp-free-av?full_trSrc=mmm_srf_dlp_008_406_a&amp;utm_medium=referral&amp;utm_source=sourceforge&amp;utm_campaign=srf_dlp_008_406_a:site_banner" rel="nofollow" target="_blank" id="main-nav-badge-link" data-label="avastjuly">
                <img src="https://a.fsdn.com/con/assets/maxnav/sourceforge/ai-protection-32-75dd98b2.png"  srcset="https://a.fsdn.com/con/assets/maxnav/sourceforge/ai-protection-75de80f6.png 2x"  alt="" id="main-nav-image"/>
            </a>
        </div>
    


                
                    
                
                
                
                
    <form method="get" action="/directory/" class="m-search-form">
    
    <div class="typeahead__container">
      <div class="typeahead__field">
        <div class="typeahead__query">
        
        <input type="text" placeholder="Search for software or solutions" autocomplete="off" name="q" >
        
        </div>
        
        <label >
            <input type="submit" class="bt" value="">
            


<svg  data-name="search" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1216 832q0-185-131.5-316.5t-316.5-131.5-316.5 131.5-131.5 316.5 131.5 316.5 316.5 131.5 316.5-131.5 131.5-316.5zm512 832q0 52-38 90t-90 38q-54 0-90-38l-343-342q-179 124-399 124-143 0-273.5-55.5t-225-150-150-225-55.5-273.5 55.5-273.5 150-225 225-150 273.5-55.5 273.5 55.5 225 150 150 225 55.5 273.5q0 220-124 399l343 343q37 37 37 90z"/></svg>
        </label>
      </div>
    </div>
    
    </form>
                
            </div>
        </nav>
        
    </section>
    
</div>
    
    
    <div class="notification-on-project-page">
    
        
    
    
    
    </div>
    
    


    <section id="page-body" class=" neighborhood-Projects project-xsb mountpoint-src 

">
        <div id="nav_menu_holder">
            
                
                    
    <div class="sandiego"> 
            
            
            
            
<section class="project-masthead"> 
    
    

    
<div class="backdrop" style="box-sizing: content-box; padding-bottom: 24px"></div>

    <div class="content">
    
        
    <nav id="breadcrumbs" class="breadcrumbs rtl">
        <ul itemscope itemtype="http://schema.org/BreadcrumbList">
            <li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem">
                <a itemprop="item" href="/"><span itemprop="name">Home</span></a>
                <meta itemprop="position" content="1"/>
            </li>
            <li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem">
                <a itemprop="item" href="/directory/"><span itemprop="name">Browse</span></a>
                <meta itemprop="position" content="2"/>
            </li>
            
            
                
                
            
            
                
            
            
                <li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem">
                    <a itemprop="item" href="/p/xsb/"><span itemprop="name">XSB</span></a>
                <meta itemprop="position" content="3"/>
                </li>
            
                <li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem">
                    <span itemprop="name">Src  (SVN)-old</span>
                <meta itemprop="position" content="4"/>
                </li>
            
        </ul>
    </nav>
    
    
    
        
                
                
<div class="overview">
    


<div class="project-icon   " >
    
    
    <img itemprop="image" alt="XSB" title="XSB" 
    
    
    src="https://a.fsdn.com/allura/p/xsb/icon?1368563712"
    /></div>


    
    <div class="title "> 

        <meta itemprop="name" content="XSB"/>
        <h1  >XSB Src  (SVN)-old
        </h1>
        
            
            
          
        
            
            
            <div class="as-h3 brought-by">
                
                Brought to you by:
                
                    <a href="/u/carlandersen/profile/">carlandersen</a>,
                    
                
                    <a href="/u/dwarren/profile/">dwarren</a>,
                    
                
                    <a href="/u/evansbj/profile/">evansbj</a>,
                    
                
                    <a href="/u/kifer/profile/">kifer</a>,
                    
                
                    
                        and <a href="/p/xsb/_members/">3 others</a>
                    
                
            </div>
            
        

        

        
    </div>


    

</div>

                
                
    
  
            
            
        
    </div>
</section>

        </div>
    

                
            
        </div>
        <div id="top_nav" class="">
            
                
<div id="top_nav_admin">
<ul class="dropdown">
  
  
    <li class="">
        <a href="/projects/xsb/" class="tool-summary-32" >
            Summary
        </a>
        
        
    </li>
  
    <li class="">
        <a href="/projects/xsb/files/" class="tool-files-sf-32" >
            Files
        </a>
        
        
    </li>
  
    <li class="">
        <a href="/projects/xsb/reviews/" class="tool-reviews-32" >
            Reviews
        </a>
        
        
    </li>
  
    <li class="">
        <a href="/projects/xsb/support" class="tool-support-32" >
            Support
        </a>
        
        
    </li>
  
    <li class="">
        <a href="/p/xsb/mailman/" class="tool-mailman-32" >
            Mail Lists
        </a>
        
        
    </li>
  
    <li class="">
        <a href="/p/xsb/_list/tickets" class="tool-tickets-32" >
            Tickets ▾
        </a>
        
        
            <ul>
                
                    <li class=""><a href="/p/xsb/bugs/" >Bugs</a></li>
                
                    <li class=""><a href="/p/xsb/feature-requests/" >Feature Requests</a></li>
                
                    <li class=""><a href="/p/xsb/support-requests/" >Support Requests</a></li>
                
                    <li class=""><a href="/p/xsb/patches/" >Patches</a></li>
                
            </ul>
        
    </li>
  
    <li class="">
        <a href="/p/xsb/news/" class="tool-blog-32" >
            News
        </a>
        
        
    </li>
  
    <li class="">
        <a href="/p/xsb/code/" class="tool-git-32" >
            Sources (GIT)
        </a>
        
        
    </li>
  
    <li class="selected">
        <a href="/p/xsb/src/" class="tool-svn-32" >
            Src  (SVN)-old
        </a>
        
        
    </li>
  
  
</ul>
</div>


            
        </div>
        <div id="content_base">
            

    
                
                    
<a id="sidebar-activate" href="#">
    <span class="btn-label">Menu</span>
    <span class="btn-arrow-down">▾</span>
    <span class="btn-arrow-up">▴</span>
</a>

                        


<div id="sidebar">
  
    <div class="placeholder-no-searchbox">&nbsp;</div>
  
    
    
      
      
        
    
      <ul class="sidebarmenu">
      
    
  <li>
      
        <a class="icon" href="/p/xsb/src/commit_browser" rel="nofollow" title="Browse Commits"><i class="fa fa-list"></i>
      
      <span>Browse Commits</span>
      </a>
  </li>
  
      
        
    
  <li>
      
        <a href="/p/xsb/src/"  rel="nofollow" >
      
      <span>Browse Files</span>
      </a>
  </li>
  
      
    
    
      </ul>
      
    
    
</div>



<script>
$('#sidebar-admin-header').on('click', function(e){
    $("#sidebar-admin-menu").toggleClass("hidden");
    $(this).toggleClass("expanded");
    e.preventDefault();
});
</script>

                    

                    
                
                
                    
                
                <div class="grid-20 pad">
                    <h2 class="dark title">
                        <span>
<a href="/p/xsb/src/80/" rel="nofollow">[r80]</a>:

  
      <a href="./../../../../" rel="nofollow"><b class="fa fa-folder-open-o" title="Root directory"></b></a> /
  
  
    <a href="./../../../" rel="nofollow">trunk</a> /
  
    <a href="./../../" rel="nofollow">XSB</a> /
  
    <a href="./../" rel="nofollow">docs</a> /
  
    <a href="./" rel="nofollow">userman</a> /
  
 library.tex
</span>
                        <!-- actions -->
                        <small>
                            

    
    <a class="icon" href="#" id="maximize-content" title="Maximize"><i class="fa fa-expand"></i>&nbsp;Maximize</a>
    <a class="icon" href="#" id="restore-content" title="Restore"><i class="fa fa-compress"></i>&nbsp;Restore</a>
<a class="icon" href="/p/xsb/src/80/log/?path=/trunk/XSB/docs/userman/library.tex" rel="nofollow" title="History"><i class="fa fa-calendar"></i>&nbsp;History</a>

                        </small>
                        <!-- /actions -->
                    </h2>
                    
                    <div>
                        
  

                        
  
    <p><a rel="nofollow" href="?format=raw">Download this file</a></p>
    <div class="clip grid-19 codebrowser">
      <h3>
        905 lines (749 with data), 38.8 kB
      </h3>
      
        <div class="codehilite"><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">  1</span>
<span class="normal">  2</span>
<span class="normal">  3</span>
<span class="normal">  4</span>
<span class="normal">  5</span>
<span class="normal">  6</span>
<span class="normal">  7</span>
<span class="normal">  8</span>
<span class="normal">  9</span>
<span class="normal"> 10</span>
<span class="normal"> 11</span>
<span class="normal"> 12</span>
<span class="normal"> 13</span>
<span class="normal"> 14</span>
<span class="normal"> 15</span>
<span class="normal"> 16</span>
<span class="normal"> 17</span>
<span class="normal"> 18</span>
<span class="normal"> 19</span>
<span class="normal"> 20</span>
<span class="normal"> 21</span>
<span class="normal"> 22</span>
<span class="normal"> 23</span>
<span class="normal"> 24</span>
<span class="normal"> 25</span>
<span class="normal"> 26</span>
<span class="normal"> 27</span>
<span class="normal"> 28</span>
<span class="normal"> 29</span>
<span class="normal"> 30</span>
<span class="normal"> 31</span>
<span class="normal"> 32</span>
<span class="normal"> 33</span>
<span class="normal"> 34</span>
<span class="normal"> 35</span>
<span class="normal"> 36</span>
<span class="normal"> 37</span>
<span class="normal"> 38</span>
<span class="normal"> 39</span>
<span class="normal"> 40</span>
<span class="normal"> 41</span>
<span class="normal"> 42</span>
<span class="normal"> 43</span>
<span class="normal"> 44</span>
<span class="normal"> 45</span>
<span class="normal"> 46</span>
<span class="normal"> 47</span>
<span class="normal"> 48</span>
<span class="normal"> 49</span>
<span class="normal"> 50</span>
<span class="normal"> 51</span>
<span class="normal"> 52</span>
<span class="normal"> 53</span>
<span class="normal"> 54</span>
<span class="normal"> 55</span>
<span class="normal"> 56</span>
<span class="normal"> 57</span>
<span class="normal"> 58</span>
<span class="normal"> 59</span>
<span class="normal"> 60</span>
<span class="normal"> 61</span>
<span class="normal"> 62</span>
<span class="normal"> 63</span>
<span class="normal"> 64</span>
<span class="normal"> 65</span>
<span class="normal"> 66</span>
<span class="normal"> 67</span>
<span class="normal"> 68</span>
<span class="normal"> 69</span>
<span class="normal"> 70</span>
<span class="normal"> 71</span>
<span class="normal"> 72</span>
<span class="normal"> 73</span>
<span class="normal"> 74</span>
<span class="normal"> 75</span>
<span class="normal"> 76</span>
<span class="normal"> 77</span>
<span class="normal"> 78</span>
<span class="normal"> 79</span>
<span class="normal"> 80</span>
<span class="normal"> 81</span>
<span class="normal"> 82</span>
<span class="normal"> 83</span>
<span class="normal"> 84</span>
<span class="normal"> 85</span>
<span class="normal"> 86</span>
<span class="normal"> 87</span>
<span class="normal"> 88</span>
<span class="normal"> 89</span>
<span class="normal"> 90</span>
<span class="normal"> 91</span>
<span class="normal"> 92</span>
<span class="normal"> 93</span>
<span class="normal"> 94</span>
<span class="normal"> 95</span>
<span class="normal"> 96</span>
<span class="normal"> 97</span>
<span class="normal"> 98</span>
<span class="normal"> 99</span>
<span class="normal">100</span>
<span class="normal">101</span>
<span class="normal">102</span>
<span class="normal">103</span>
<span class="normal">104</span>
<span class="normal">105</span>
<span class="normal">106</span>
<span class="normal">107</span>
<span class="normal">108</span>
<span class="normal">109</span>
<span class="normal">110</span>
<span class="normal">111</span>
<span class="normal">112</span>
<span class="normal">113</span>
<span class="normal">114</span>
<span class="normal">115</span>
<span class="normal">116</span>
<span class="normal">117</span>
<span class="normal">118</span>
<span class="normal">119</span>
<span class="normal">120</span>
<span class="normal">121</span>
<span class="normal">122</span>
<span class="normal">123</span>
<span class="normal">124</span>
<span class="normal">125</span>
<span class="normal">126</span>
<span class="normal">127</span>
<span class="normal">128</span>
<span class="normal">129</span>
<span class="normal">130</span>
<span class="normal">131</span>
<span class="normal">132</span>
<span class="normal">133</span>
<span class="normal">134</span>
<span class="normal">135</span>
<span class="normal">136</span>
<span class="normal">137</span>
<span class="normal">138</span>
<span class="normal">139</span>
<span class="normal">140</span>
<span class="normal">141</span>
<span class="normal">142</span>
<span class="normal">143</span>
<span class="normal">144</span>
<span class="normal">145</span>
<span class="normal">146</span>
<span class="normal">147</span>
<span class="normal">148</span>
<span class="normal">149</span>
<span class="normal">150</span>
<span class="normal">151</span>
<span class="normal">152</span>
<span class="normal">153</span>
<span class="normal">154</span>
<span class="normal">155</span>
<span class="normal">156</span>
<span class="normal">157</span>
<span class="normal">158</span>
<span class="normal">159</span>
<span class="normal">160</span>
<span class="normal">161</span>
<span class="normal">162</span>
<span class="normal">163</span>
<span class="normal">164</span>
<span class="normal">165</span>
<span class="normal">166</span>
<span class="normal">167</span>
<span class="normal">168</span>
<span class="normal">169</span>
<span class="normal">170</span>
<span class="normal">171</span>
<span class="normal">172</span>
<span class="normal">173</span>
<span class="normal">174</span>
<span class="normal">175</span>
<span class="normal">176</span>
<span class="normal">177</span>
<span class="normal">178</span>
<span class="normal">179</span>
<span class="normal">180</span>
<span class="normal">181</span>
<span class="normal">182</span>
<span class="normal">183</span>
<span class="normal">184</span>
<span class="normal">185</span>
<span class="normal">186</span>
<span class="normal">187</span>
<span class="normal">188</span>
<span class="normal">189</span>
<span class="normal">190</span>
<span class="normal">191</span>
<span class="normal">192</span>
<span class="normal">193</span>
<span class="normal">194</span>
<span class="normal">195</span>
<span class="normal">196</span>
<span class="normal">197</span>
<span class="normal">198</span>
<span class="normal">199</span>
<span class="normal">200</span>
<span class="normal">201</span>
<span class="normal">202</span>
<span class="normal">203</span>
<span class="normal">204</span>
<span class="normal">205</span>
<span class="normal">206</span>
<span class="normal">207</span>
<span class="normal">208</span>
<span class="normal">209</span>
<span class="normal">210</span>
<span class="normal">211</span>
<span class="normal">212</span>
<span class="normal">213</span>
<span class="normal">214</span>
<span class="normal">215</span>
<span class="normal">216</span>
<span class="normal">217</span>
<span class="normal">218</span>
<span class="normal">219</span>
<span class="normal">220</span>
<span class="normal">221</span>
<span class="normal">222</span>
<span class="normal">223</span>
<span class="normal">224</span>
<span class="normal">225</span>
<span class="normal">226</span>
<span class="normal">227</span>
<span class="normal">228</span>
<span class="normal">229</span>
<span class="normal">230</span>
<span class="normal">231</span>
<span class="normal">232</span>
<span class="normal">233</span>
<span class="normal">234</span>
<span class="normal">235</span>
<span class="normal">236</span>
<span class="normal">237</span>
<span class="normal">238</span>
<span class="normal">239</span>
<span class="normal">240</span>
<span class="normal">241</span>
<span class="normal">242</span>
<span class="normal">243</span>
<span class="normal">244</span>
<span class="normal">245</span>
<span class="normal">246</span>
<span class="normal">247</span>
<span class="normal">248</span>
<span class="normal">249</span>
<span class="normal">250</span>
<span class="normal">251</span>
<span class="normal">252</span>
<span class="normal">253</span>
<span class="normal">254</span>
<span class="normal">255</span>
<span class="normal">256</span>
<span class="normal">257</span>
<span class="normal">258</span>
<span class="normal">259</span>
<span class="normal">260</span>
<span class="normal">261</span>
<span class="normal">262</span>
<span class="normal">263</span>
<span class="normal">264</span>
<span class="normal">265</span>
<span class="normal">266</span>
<span class="normal">267</span>
<span class="normal">268</span>
<span class="normal">269</span>
<span class="normal">270</span>
<span class="normal">271</span>
<span class="normal">272</span>
<span class="normal">273</span>
<span class="normal">274</span>
<span class="normal">275</span>
<span class="normal">276</span>
<span class="normal">277</span>
<span class="normal">278</span>
<span class="normal">279</span>
<span class="normal">280</span>
<span class="normal">281</span>
<span class="normal">282</span>
<span class="normal">283</span>
<span class="normal">284</span>
<span class="normal">285</span>
<span class="normal">286</span>
<span class="normal">287</span>
<span class="normal">288</span>
<span class="normal">289</span>
<span class="normal">290</span>
<span class="normal">291</span>
<span class="normal">292</span>
<span class="normal">293</span>
<span class="normal">294</span>
<span class="normal">295</span>
<span class="normal">296</span>
<span class="normal">297</span>
<span class="normal">298</span>
<span class="normal">299</span>
<span class="normal">300</span>
<span class="normal">301</span>
<span class="normal">302</span>
<span class="normal">303</span>
<span class="normal">304</span>
<span class="normal">305</span>
<span class="normal">306</span>
<span class="normal">307</span>
<span class="normal">308</span>
<span class="normal">309</span>
<span class="normal">310</span>
<span class="normal">311</span>
<span class="normal">312</span>
<span class="normal">313</span>
<span class="normal">314</span>
<span class="normal">315</span>
<span class="normal">316</span>
<span class="normal">317</span>
<span class="normal">318</span>
<span class="normal">319</span>
<span class="normal">320</span>
<span class="normal">321</span>
<span class="normal">322</span>
<span class="normal">323</span>
<span class="normal">324</span>
<span class="normal">325</span>
<span class="normal">326</span>
<span class="normal">327</span>
<span class="normal">328</span>
<span class="normal">329</span>
<span class="normal">330</span>
<span class="normal">331</span>
<span class="normal">332</span>
<span class="normal">333</span>
<span class="normal">334</span>
<span class="normal">335</span>
<span class="normal">336</span>
<span class="normal">337</span>
<span class="normal">338</span>
<span class="normal">339</span>
<span class="normal">340</span>
<span class="normal">341</span>
<span class="normal">342</span>
<span class="normal">343</span>
<span class="normal">344</span>
<span class="normal">345</span>
<span class="normal">346</span>
<span class="normal">347</span>
<span class="normal">348</span>
<span class="normal">349</span>
<span class="normal">350</span>
<span class="normal">351</span>
<span class="normal">352</span>
<span class="normal">353</span>
<span class="normal">354</span>
<span class="normal">355</span>
<span class="normal">356</span>
<span class="normal">357</span>
<span class="normal">358</span>
<span class="normal">359</span>
<span class="normal">360</span>
<span class="normal">361</span>
<span class="normal">362</span>
<span class="normal">363</span>
<span class="normal">364</span>
<span class="normal">365</span>
<span class="normal">366</span>
<span class="normal">367</span>
<span class="normal">368</span>
<span class="normal">369</span>
<span class="normal">370</span>
<span class="normal">371</span>
<span class="normal">372</span>
<span class="normal">373</span>
<span class="normal">374</span>
<span class="normal">375</span>
<span class="normal">376</span>
<span class="normal">377</span>
<span class="normal">378</span>
<span class="normal">379</span>
<span class="normal">380</span>
<span class="normal">381</span>
<span class="normal">382</span>
<span class="normal">383</span>
<span class="normal">384</span>
<span class="normal">385</span>
<span class="normal">386</span>
<span class="normal">387</span>
<span class="normal">388</span>
<span class="normal">389</span>
<span class="normal">390</span>
<span class="normal">391</span>
<span class="normal">392</span>
<span class="normal">393</span>
<span class="normal">394</span>
<span class="normal">395</span>
<span class="normal">396</span>
<span class="normal">397</span>
<span class="normal">398</span>
<span class="normal">399</span>
<span class="normal">400</span>
<span class="normal">401</span>
<span class="normal">402</span>
<span class="normal">403</span>
<span class="normal">404</span>
<span class="normal">405</span>
<span class="normal">406</span>
<span class="normal">407</span>
<span class="normal">408</span>
<span class="normal">409</span>
<span class="normal">410</span>
<span class="normal">411</span>
<span class="normal">412</span>
<span class="normal">413</span>
<span class="normal">414</span>
<span class="normal">415</span>
<span class="normal">416</span>
<span class="normal">417</span>
<span class="normal">418</span>
<span class="normal">419</span>
<span class="normal">420</span>
<span class="normal">421</span>
<span class="normal">422</span>
<span class="normal">423</span>
<span class="normal">424</span>
<span class="normal">425</span>
<span class="normal">426</span>
<span class="normal">427</span>
<span class="normal">428</span>
<span class="normal">429</span>
<span class="normal">430</span>
<span class="normal">431</span>
<span class="normal">432</span>
<span class="normal">433</span>
<span class="normal">434</span>
<span class="normal">435</span>
<span class="normal">436</span>
<span class="normal">437</span>
<span class="normal">438</span>
<span class="normal">439</span>
<span class="normal">440</span>
<span class="normal">441</span>
<span class="normal">442</span>
<span class="normal">443</span>
<span class="normal">444</span>
<span class="normal">445</span>
<span class="normal">446</span>
<span class="normal">447</span>
<span class="normal">448</span>
<span class="normal">449</span>
<span class="normal">450</span>
<span class="normal">451</span>
<span class="normal">452</span>
<span class="normal">453</span>
<span class="normal">454</span>
<span class="normal">455</span>
<span class="normal">456</span>
<span class="normal">457</span>
<span class="normal">458</span>
<span class="normal">459</span>
<span class="normal">460</span>
<span class="normal">461</span>
<span class="normal">462</span>
<span class="normal">463</span>
<span class="normal">464</span>
<span class="normal">465</span>
<span class="normal">466</span>
<span class="normal">467</span>
<span class="normal">468</span>
<span class="normal">469</span>
<span class="normal">470</span>
<span class="normal">471</span>
<span class="normal">472</span>
<span class="normal">473</span>
<span class="normal">474</span>
<span class="normal">475</span>
<span class="normal">476</span>
<span class="normal">477</span>
<span class="normal">478</span>
<span class="normal">479</span>
<span class="normal">480</span>
<span class="normal">481</span>
<span class="normal">482</span>
<span class="normal">483</span>
<span class="normal">484</span>
<span class="normal">485</span>
<span class="normal">486</span>
<span class="normal">487</span>
<span class="normal">488</span>
<span class="normal">489</span>
<span class="normal">490</span>
<span class="normal">491</span>
<span class="normal">492</span>
<span class="normal">493</span>
<span class="normal">494</span>
<span class="normal">495</span>
<span class="normal">496</span>
<span class="normal">497</span>
<span class="normal">498</span>
<span class="normal">499</span>
<span class="normal">500</span>
<span class="normal">501</span>
<span class="normal">502</span>
<span class="normal">503</span>
<span class="normal">504</span>
<span class="normal">505</span>
<span class="normal">506</span>
<span class="normal">507</span>
<span class="normal">508</span>
<span class="normal">509</span>
<span class="normal">510</span>
<span class="normal">511</span>
<span class="normal">512</span>
<span class="normal">513</span>
<span class="normal">514</span>
<span class="normal">515</span>
<span class="normal">516</span>
<span class="normal">517</span>
<span class="normal">518</span>
<span class="normal">519</span>
<span class="normal">520</span>
<span class="normal">521</span>
<span class="normal">522</span>
<span class="normal">523</span>
<span class="normal">524</span>
<span class="normal">525</span>
<span class="normal">526</span>
<span class="normal">527</span>
<span class="normal">528</span>
<span class="normal">529</span>
<span class="normal">530</span>
<span class="normal">531</span>
<span class="normal">532</span>
<span class="normal">533</span>
<span class="normal">534</span>
<span class="normal">535</span>
<span class="normal">536</span>
<span class="normal">537</span>
<span class="normal">538</span>
<span class="normal">539</span>
<span class="normal">540</span>
<span class="normal">541</span>
<span class="normal">542</span>
<span class="normal">543</span>
<span class="normal">544</span>
<span class="normal">545</span>
<span class="normal">546</span>
<span class="normal">547</span>
<span class="normal">548</span>
<span class="normal">549</span>
<span class="normal">550</span>
<span class="normal">551</span>
<span class="normal">552</span>
<span class="normal">553</span>
<span class="normal">554</span>
<span class="normal">555</span>
<span class="normal">556</span>
<span class="normal">557</span>
<span class="normal">558</span>
<span class="normal">559</span>
<span class="normal">560</span>
<span class="normal">561</span>
<span class="normal">562</span>
<span class="normal">563</span>
<span class="normal">564</span>
<span class="normal">565</span>
<span class="normal">566</span>
<span class="normal">567</span>
<span class="normal">568</span>
<span class="normal">569</span>
<span class="normal">570</span>
<span class="normal">571</span>
<span class="normal">572</span>
<span class="normal">573</span>
<span class="normal">574</span>
<span class="normal">575</span>
<span class="normal">576</span>
<span class="normal">577</span>
<span class="normal">578</span>
<span class="normal">579</span>
<span class="normal">580</span>
<span class="normal">581</span>
<span class="normal">582</span>
<span class="normal">583</span>
<span class="normal">584</span>
<span class="normal">585</span>
<span class="normal">586</span>
<span class="normal">587</span>
<span class="normal">588</span>
<span class="normal">589</span>
<span class="normal">590</span>
<span class="normal">591</span>
<span class="normal">592</span>
<span class="normal">593</span>
<span class="normal">594</span>
<span class="normal">595</span>
<span class="normal">596</span>
<span class="normal">597</span>
<span class="normal">598</span>
<span class="normal">599</span>
<span class="normal">600</span>
<span class="normal">601</span>
<span class="normal">602</span>
<span class="normal">603</span>
<span class="normal">604</span>
<span class="normal">605</span>
<span class="normal">606</span>
<span class="normal">607</span>
<span class="normal">608</span>
<span class="normal">609</span>
<span class="normal">610</span>
<span class="normal">611</span>
<span class="normal">612</span>
<span class="normal">613</span>
<span class="normal">614</span>
<span class="normal">615</span>
<span class="normal">616</span>
<span class="normal">617</span>
<span class="normal">618</span>
<span class="normal">619</span>
<span class="normal">620</span>
<span class="normal">621</span>
<span class="normal">622</span>
<span class="normal">623</span>
<span class="normal">624</span>
<span class="normal">625</span>
<span class="normal">626</span>
<span class="normal">627</span>
<span class="normal">628</span>
<span class="normal">629</span>
<span class="normal">630</span>
<span class="normal">631</span>
<span class="normal">632</span>
<span class="normal">633</span>
<span class="normal">634</span>
<span class="normal">635</span>
<span class="normal">636</span>
<span class="normal">637</span>
<span class="normal">638</span>
<span class="normal">639</span>
<span class="normal">640</span>
<span class="normal">641</span>
<span class="normal">642</span>
<span class="normal">643</span>
<span class="normal">644</span>
<span class="normal">645</span>
<span class="normal">646</span>
<span class="normal">647</span>
<span class="normal">648</span>
<span class="normal">649</span>
<span class="normal">650</span>
<span class="normal">651</span>
<span class="normal">652</span>
<span class="normal">653</span>
<span class="normal">654</span>
<span class="normal">655</span>
<span class="normal">656</span>
<span class="normal">657</span>
<span class="normal">658</span>
<span class="normal">659</span>
<span class="normal">660</span>
<span class="normal">661</span>
<span class="normal">662</span>
<span class="normal">663</span>
<span class="normal">664</span>
<span class="normal">665</span>
<span class="normal">666</span>
<span class="normal">667</span>
<span class="normal">668</span>
<span class="normal">669</span>
<span class="normal">670</span>
<span class="normal">671</span>
<span class="normal">672</span>
<span class="normal">673</span>
<span class="normal">674</span>
<span class="normal">675</span>
<span class="normal">676</span>
<span class="normal">677</span>
<span class="normal">678</span>
<span class="normal">679</span>
<span class="normal">680</span>
<span class="normal">681</span>
<span class="normal">682</span>
<span class="normal">683</span>
<span class="normal">684</span>
<span class="normal">685</span>
<span class="normal">686</span>
<span class="normal">687</span>
<span class="normal">688</span>
<span class="normal">689</span>
<span class="normal">690</span>
<span class="normal">691</span>
<span class="normal">692</span>
<span class="normal">693</span>
<span class="normal">694</span>
<span class="normal">695</span>
<span class="normal">696</span>
<span class="normal">697</span>
<span class="normal">698</span>
<span class="normal">699</span>
<span class="normal">700</span>
<span class="normal">701</span>
<span class="normal">702</span>
<span class="normal">703</span>
<span class="normal">704</span>
<span class="normal">705</span>
<span class="normal">706</span>
<span class="normal">707</span>
<span class="normal">708</span>
<span class="normal">709</span>
<span class="normal">710</span>
<span class="normal">711</span>
<span class="normal">712</span>
<span class="normal">713</span>
<span class="normal">714</span>
<span class="normal">715</span>
<span class="normal">716</span>
<span class="normal">717</span>
<span class="normal">718</span>
<span class="normal">719</span>
<span class="normal">720</span>
<span class="normal">721</span>
<span class="normal">722</span>
<span class="normal">723</span>
<span class="normal">724</span>
<span class="normal">725</span>
<span class="normal">726</span>
<span class="normal">727</span>
<span class="normal">728</span>
<span class="normal">729</span>
<span class="normal">730</span>
<span class="normal">731</span>
<span class="normal">732</span>
<span class="normal">733</span>
<span class="normal">734</span>
<span class="normal">735</span>
<span class="normal">736</span>
<span class="normal">737</span>
<span class="normal">738</span>
<span class="normal">739</span>
<span class="normal">740</span>
<span class="normal">741</span>
<span class="normal">742</span>
<span class="normal">743</span>
<span class="normal">744</span>
<span class="normal">745</span>
<span class="normal">746</span>
<span class="normal">747</span>
<span class="normal">748</span>
<span class="normal">749</span>
<span class="normal">750</span>
<span class="normal">751</span>
<span class="normal">752</span>
<span class="normal">753</span>
<span class="normal">754</span>
<span class="normal">755</span>
<span class="normal">756</span>
<span class="normal">757</span>
<span class="normal">758</span>
<span class="normal">759</span>
<span class="normal">760</span>
<span class="normal">761</span>
<span class="normal">762</span>
<span class="normal">763</span>
<span class="normal">764</span>
<span class="normal">765</span>
<span class="normal">766</span>
<span class="normal">767</span>
<span class="normal">768</span>
<span class="normal">769</span>
<span class="normal">770</span>
<span class="normal">771</span>
<span class="normal">772</span>
<span class="normal">773</span>
<span class="normal">774</span>
<span class="normal">775</span>
<span class="normal">776</span>
<span class="normal">777</span>
<span class="normal">778</span>
<span class="normal">779</span>
<span class="normal">780</span>
<span class="normal">781</span>
<span class="normal">782</span>
<span class="normal">783</span>
<span class="normal">784</span>
<span class="normal">785</span>
<span class="normal">786</span>
<span class="normal">787</span>
<span class="normal">788</span>
<span class="normal">789</span>
<span class="normal">790</span>
<span class="normal">791</span>
<span class="normal">792</span>
<span class="normal">793</span>
<span class="normal">794</span>
<span class="normal">795</span>
<span class="normal">796</span>
<span class="normal">797</span>
<span class="normal">798</span>
<span class="normal">799</span>
<span class="normal">800</span>
<span class="normal">801</span>
<span class="normal">802</span>
<span class="normal">803</span>
<span class="normal">804</span>
<span class="normal">805</span>
<span class="normal">806</span>
<span class="normal">807</span>
<span class="normal">808</span>
<span class="normal">809</span>
<span class="normal">810</span>
<span class="normal">811</span>
<span class="normal">812</span>
<span class="normal">813</span>
<span class="normal">814</span>
<span class="normal">815</span>
<span class="normal">816</span>
<span class="normal">817</span>
<span class="normal">818</span>
<span class="normal">819</span>
<span class="normal">820</span>
<span class="normal">821</span>
<span class="normal">822</span>
<span class="normal">823</span>
<span class="normal">824</span>
<span class="normal">825</span>
<span class="normal">826</span>
<span class="normal">827</span>
<span class="normal">828</span>
<span class="normal">829</span>
<span class="normal">830</span>
<span class="normal">831</span>
<span class="normal">832</span>
<span class="normal">833</span>
<span class="normal">834</span>
<span class="normal">835</span>
<span class="normal">836</span>
<span class="normal">837</span>
<span class="normal">838</span>
<span class="normal">839</span>
<span class="normal">840</span>
<span class="normal">841</span>
<span class="normal">842</span>
<span class="normal">843</span>
<span class="normal">844</span>
<span class="normal">845</span>
<span class="normal">846</span>
<span class="normal">847</span>
<span class="normal">848</span>
<span class="normal">849</span>
<span class="normal">850</span>
<span class="normal">851</span>
<span class="normal">852</span>
<span class="normal">853</span>
<span class="normal">854</span>
<span class="normal">855</span>
<span class="normal">856</span>
<span class="normal">857</span>
<span class="normal">858</span>
<span class="normal">859</span>
<span class="normal">860</span>
<span class="normal">861</span>
<span class="normal">862</span>
<span class="normal">863</span>
<span class="normal">864</span>
<span class="normal">865</span>
<span class="normal">866</span>
<span class="normal">867</span>
<span class="normal">868</span>
<span class="normal">869</span>
<span class="normal">870</span>
<span class="normal">871</span>
<span class="normal">872</span>
<span class="normal">873</span>
<span class="normal">874</span>
<span class="normal">875</span>
<span class="normal">876</span>
<span class="normal">877</span>
<span class="normal">878</span>
<span class="normal">879</span>
<span class="normal">880</span>
<span class="normal">881</span>
<span class="normal">882</span>
<span class="normal">883</span>
<span class="normal">884</span>
<span class="normal">885</span>
<span class="normal">886</span>
<span class="normal">887</span>
<span class="normal">888</span>
<span class="normal">889</span>
<span class="normal">890</span>
<span class="normal">891</span>
<span class="normal">892</span>
<span class="normal">893</span>
<span class="normal">894</span>
<span class="normal">895</span>
<span class="normal">896</span>
<span class="normal">897</span>
<span class="normal">898</span>
<span class="normal">899</span>
<span class="normal">900</span>
<span class="normal">901</span>
<span class="normal">902</span>
<span class="normal">903</span>
<span class="normal">904</span></pre></div></td><td class="code"><div><pre><div id="l1" class="code_block"><span class="k">\chapter</span><span class="nb">{</span>Library Utilities<span class="nb">}</span> <span class="k">\label</span><span class="nb">{</span>library<span class="nb">_</span>utilities<span class="nb">}</span>
</div><div id="l2" class="code_block"><span class="c">%====================================================</span>
</div><div id="l3" class="code_block">
</div><div id="l4" class="code_block">In this chapter we introduce some useful predicates that are supplied
</div><div id="l5" class="code_block">with the system. These predicates are available only when imported
</div><div id="l6" class="code_block">them from (or explicitly consult) the corresponding modules.
</div><div id="l7" class="code_block">
</div><div id="l8" class="code_block">
</div><div id="l9" class="code_block"><span class="k">\section</span><span class="nb">{</span>List Processing<span class="nb">}</span>
</div><div id="l10" class="code_block"><span class="c">%========================</span>
</div><div id="l11" class="code_block">The XSB library contains various list utilities, some of which 
</div><div id="l12" class="code_block">are listed below.  These predicates should be explicitly imported from
</div><div id="l13" class="code_block">the module specified after the skeletal specification of each predicate.
</div><div id="l14" class="code_block">There are a lot more useful list processing predicates in various modules
</div><div id="l15" class="code_block">of the XSB system, and the interested user can find them by 
</div><div id="l16" class="code_block">looking at the sources.
</div><div id="l17" class="code_block">
</div><div id="l18" class="code_block"><span class="k">\begin</span><span class="nb">{</span>description<span class="nb">}</span>
</div><div id="l19" class="code_block"><span class="k">\ournewitem</span><span class="nb">{</span>append(?List1, ?List2, ?List3)<span class="nb">}{</span>basics<span class="nb">}</span><span class="k">\index</span><span class="nb">{{</span><span class="k">\tt</span> append/3<span class="nb">}}</span>
</div><div id="l20" class="code_block"><span class="c">%\predindex{append/3~(L)}</span>
</div><div id="l21" class="code_block">    Succeeds if list <span class="nb">{</span><span class="k">\tt</span> List3<span class="nb">}</span> is the concatenation of lists 
</div><div id="l22" class="code_block">    <span class="nb">{</span><span class="k">\tt</span> List1<span class="nb">}</span> and <span class="nb">{</span><span class="k">\tt</span> List2<span class="nb">}</span>.
</div><div id="l23" class="code_block">
</div><div id="l24" class="code_block"><span class="k">\ournewitem</span><span class="nb">{</span>member(?Element, ?List)<span class="nb">}{</span>basics<span class="nb">}</span><span class="k">\index</span><span class="nb">{{</span><span class="k">\tt</span> member/2<span class="nb">}}</span>
</div><div id="l25" class="code_block"><span class="c">%\predindex{member/2~(L)}</span>
</div><div id="l26" class="code_block">    Checks whether <span class="nb">{</span><span class="k">\tt</span> Element<span class="nb">}</span> unifies with any element of list 
</div><div id="l27" class="code_block">    <span class="nb">{</span><span class="k">\tt</span> List<span class="nb">}</span>, succeeding more than once if there are multiple 
</div><div id="l28" class="code_block">    such elements.
</div><div id="l29" class="code_block">
</div><div id="l30" class="code_block"><span class="k">\ournewitem</span><span class="nb">{</span>memberchk(?Element, ?List)<span class="nb">}{</span>basics<span class="nb">}</span><span class="k">\index</span><span class="nb">{{</span><span class="k">\tt</span> memberchk/2<span class="nb">}}</span>
</div><div id="l31" class="code_block"><span class="c">%\predindex{memberchk/2~(L)}</span>
</div><div id="l32" class="code_block">    Similar to <span class="nb">{</span><span class="k">\tt</span> member<span class="nb">}</span>/2, except that <span class="nb">{</span><span class="k">\tt</span> memberchk<span class="nb">}</span>/2 is
</div><div id="l33" class="code_block">    deterministic, i.e.<span class="k">\</span> does not succeed more than once for any call.
</div><div id="l34" class="code_block">
</div><div id="l35" class="code_block"><span class="k">\ournewitem</span><span class="nb">{</span>ith(?Index, ?List, ?Element)<span class="nb">}{</span>basics<span class="nb">}</span><span class="k">\index</span><span class="nb">{{</span><span class="k">\tt</span> ith/3<span class="nb">}}</span>
</div><div id="l36" class="code_block"><span class="c">%\predindex{ith/3~(L)}</span>
</div><div id="l37" class="code_block">    Succeeds if the <span class="s">$</span><span class="nb">{</span><span class="nv">\tt</span><span class="nb"> Index^{th}}</span><span class="s">$</span> element of the list <span class="nb">{</span><span class="k">\tt</span> List<span class="nb">}</span> 
</div><div id="l38" class="code_block">    unifies with <span class="nb">{</span><span class="k">\tt</span> Element<span class="nb">}</span>.  Fails if <span class="nb">{</span><span class="k">\tt</span> Index<span class="nb">}</span> is not a positive
</div><div id="l39" class="code_block">    integer or greater than the length of <span class="nb">{</span><span class="k">\tt</span> List<span class="nb">}</span>.
</div><div id="l40" class="code_block">    Either <span class="nb">{</span><span class="k">\tt</span> Index<span class="nb">}</span> and <span class="nb">{</span><span class="k">\tt</span> List<span class="nb">}</span>, or <span class="nb">{</span><span class="k">\tt</span> List<span class="nb">}</span> and <span class="nb">{</span><span class="k">\tt</span> Element<span class="nb">}</span>, 
</div><div id="l41" class="code_block">    should be instantiated (but not necessarily ground) at the time of 
</div><div id="l42" class="code_block">    the call.
</div><div id="l43" class="code_block">
</div><div id="l44" class="code_block"><span class="k">\ournewitem</span><span class="nb">{</span>length(?List, ?Length)<span class="nb">}{</span>basics<span class="nb">}</span><span class="k">\index</span><span class="nb">{{</span><span class="k">\tt</span> length/2<span class="nb">}}</span>
</div><div id="l45" class="code_block"><span class="c">%\predindex{length/2~(L)}</span>
</div><div id="l46" class="code_block">    Succeeds if the length of the list <span class="nb">{</span><span class="k">\tt</span> List<span class="nb">}</span> is <span class="nb">{</span><span class="k">\tt</span> Length<span class="nb">}</span>.
</div><div id="l47" class="code_block">    This predicate is deterministic if <span class="nb">{</span><span class="k">\tt</span> List<span class="nb">}</span> is instantiated 
</div><div id="l48" class="code_block">    to a list of definite length, but is nondeterministic if 
</div><div id="l49" class="code_block">    <span class="nb">{</span><span class="k">\tt</span> List<span class="nb">}</span> is a variable or has a variable tail.  If <span class="nb">{</span><span class="k">\tt</span> List<span class="nb">}</span>
</div><div id="l50" class="code_block">    is uninstantiated, it is unified with a list of length <span class="nb">{</span><span class="k">\tt</span> Length<span class="nb">}</span>
</div><div id="l51" class="code_block">    that contains variables.
</div><div id="l52" class="code_block">
</div><div id="l53" class="code_block"><span class="k">\ournewitem</span><span class="nb">{</span>same<span class="k">\_length</span>(?List1, ?List2)<span class="nb">}{</span>basics<span class="nb">}</span><span class="k">\index</span><span class="nb">{{</span><span class="k">\tt</span> same<span class="k">\_length</span>/2<span class="nb">}}</span>
</div><div id="l54" class="code_block"><span class="c">%\predindex{same\_length/2~(L)}</span>
</div><div id="l55" class="code_block">    Succeeds if list <span class="nb">{</span><span class="k">\tt</span> List1<span class="nb">}</span> and <span class="nb">{</span><span class="k">\tt</span> List2<span class="nb">}</span> are both lists of
</div><div id="l56" class="code_block">    the same number of elements.  No relation between the types or
</div><div id="l57" class="code_block">    values of their elements is implied.  This predicate may be used
</div><div id="l58" class="code_block">    to generate either list (containing variables as elements) given
</div><div id="l59" class="code_block">    the other, or to generate two lists of the same length, in which
</div><div id="l60" class="code_block">    case the arguments will be bound to lists of length <span class="s">$</span><span class="m">0</span><span class="nb">,</span><span class="m">1</span><span class="nb">,</span><span class="m">2</span><span class="nb">,</span><span class="nv">\ldots</span><span class="s">$</span>.
</div><div id="l61" class="code_block">
</div><div id="l62" class="code_block"><span class="k">\ournewitem</span><span class="nb">{</span>select(?Element, ?L1, ?L2)<span class="nb">}{</span>basics<span class="nb">}</span><span class="k">\index</span><span class="nb">{{</span><span class="k">\tt</span> select/3<span class="nb">}}</span>
</div><div id="l63" class="code_block"><span class="c">%\predindex{select/3~(L)}</span>
</div><div id="l64" class="code_block">    <span class="nb">{</span><span class="k">\tt</span> List2<span class="nb">}</span> derives from <span class="nb">{</span><span class="k">\tt</span> List1<span class="nb">}</span> by selecting (removing) an 
</div><div id="l65" class="code_block">    <span class="nb">{</span><span class="k">\tt</span> Element<span class="nb">}</span> non-deterministically.
</div><div id="l66" class="code_block">
</div><div id="l67" class="code_block"><span class="k">\ournewitem</span><span class="nb">{</span>reverse(+List, ?ReversedList)<span class="nb">}{</span>basics<span class="nb">}</span><span class="k">\index</span><span class="nb">{{</span><span class="k">\tt</span> reverse/2<span class="nb">}}</span>
</div><div id="l68" class="code_block"><span class="c">%\predindex{reverse/2~(L)}</span>
</div><div id="l69" class="code_block">    Succeeds if <span class="nb">{</span><span class="k">\tt</span> ReversedList<span class="nb">}</span> is the reverse of list <span class="nb">{</span><span class="k">\tt</span> List<span class="nb">}</span>.
</div><div id="l70" class="code_block">    If <span class="nb">{</span><span class="k">\tt</span> List<span class="nb">}</span> is not a proper list, <span class="nb">{</span><span class="k">\tt</span> reverse/2<span class="nb">}</span> can succeed
</div><div id="l71" class="code_block">    arbitrarily many times.  It works only one way.
</div><div id="l72" class="code_block">
</div><div id="l73" class="code_block"><span class="k">\ournewitem</span><span class="nb">{</span>perm(+List, ?Perm)<span class="nb">}{</span>basics<span class="nb">}</span><span class="k">\index</span><span class="nb">{{</span><span class="k">\tt</span> perm/2<span class="nb">}}</span>
</div><div id="l74" class="code_block"><span class="c">%\predindex{perm/2~(L)}</span>
</div><div id="l75" class="code_block">    Succeeds when <span class="nb">{</span><span class="k">\tt</span> List<span class="nb">}</span> and <span class="nb">{</span><span class="k">\tt</span> Perm<span class="nb">}</span> are permutations of each
</div><div id="l76" class="code_block">    other.  The main use of <span class="nb">{</span><span class="k">\tt</span> perm/2<span class="nb">}</span> is to generate permutations
</div><div id="l77" class="code_block">    of a given list.  <span class="nb">{</span><span class="k">\tt</span> List<span class="nb">}</span> must be a proper list.
</div><div id="l78" class="code_block">    <span class="nb">{</span><span class="k">\tt</span> Perm<span class="nb">}</span> may be partly instantiated.
</div><div id="l79" class="code_block">
</div><div id="l80" class="code_block"><span class="k">\ournewitem</span><span class="nb">{</span>subseq(?Sequence, ?SubSequence, ?Complement)<span class="nb">}{</span>basics<span class="nb">}</span>
</div><div id="l81" class="code_block"><span class="k">\index</span><span class="nb">{{</span><span class="k">\tt</span> subseq/3<span class="nb">}}</span>
</div><div id="l82" class="code_block"><span class="c">%\predindex{subseq/3(L)}</span>
</div><div id="l83" class="code_block">    Succeeds when <span class="nb">{</span><span class="k">\tt</span> SubSequence<span class="nb">}</span> and <span class="nb">{</span><span class="k">\tt</span> Complement<span class="nb">}</span> are both
</div><div id="l84" class="code_block">    subsequences of the list <span class="nb">{</span><span class="k">\tt</span> Sequence<span class="nb">}</span> (the order of corresponding
</div><div id="l85" class="code_block">    elements being preserved) and every element of <span class="nb">{</span><span class="k">\tt</span> Sequence<span class="nb">}</span> which
</div><div id="l86" class="code_block">    is not in <span class="nb">{</span><span class="k">\tt</span> SubSequence<span class="nb">}</span> is in the <span class="nb">{</span><span class="k">\tt</span> Complement<span class="nb">}</span> and vice
</div><div id="l87" class="code_block">    versa.  That is,
</div><div id="l88" class="code_block">    <span class="sb">\[</span><span class="nb"> length</span><span class="o">(</span><span class="nb">{</span><span class="nv">\tt</span><span class="nb"> Sequence}</span><span class="o">)</span><span class="nb"> </span><span class="o">=</span>
</div><div id="l89" class="code_block"><span class="nb">		length</span><span class="o">(</span><span class="nb">{</span><span class="nv">\tt</span><span class="nb"> SubSequence}</span><span class="o">)+</span><span class="nb">length</span><span class="o">(</span><span class="nb">{</span><span class="nv">\tt</span><span class="nb"> Complement}</span><span class="o">)</span><span class="nb"> </span><span class="s">\]</span>
</div><div id="l90" class="code_block">    for example, <span class="nb">{</span><span class="k">\tt</span> subseq([1,2,3,4], [1,3], [2,4]).<span class="nb">}</span>
</div><div id="l91" class="code_block">    The main use of <span class="nb">{</span><span class="k">\tt</span> subseq/3<span class="nb">}</span> is to generate subsets and their
</div><div id="l92" class="code_block">    complements together, but can also be used to interleave two lists
</div><div id="l93" class="code_block">    in all possible ways.
</div><div id="l94" class="code_block">
</div><div id="l95" class="code_block"><span class="k">\ournewitem</span><span class="nb">{</span>merge(+List1, +List2, ?List3)<span class="nb">}{</span>listutil<span class="nb">}</span><span class="k">\index</span><span class="nb">{{</span><span class="k">\tt</span> merge/3<span class="nb">}}</span>
</div><div id="l96" class="code_block"><span class="c">%\predindex{merge/3~(L)}</span>
</div><div id="l97" class="code_block">    Succeeds if <span class="nb">{</span><span class="k">\tt</span> List3<span class="nb">}</span> is the list resulting from ``merging&#39;&#39; lists 
</div><div id="l98" class="code_block">    <span class="nb">{</span><span class="k">\tt</span> List1<span class="nb">}</span> and <span class="nb">{</span><span class="k">\tt</span> List2<span class="nb">}</span>,
</div><div id="l99" class="code_block">    i.e.<span class="k">\</span> the elements of <span class="nb">{</span><span class="k">\tt</span> List1<span class="nb">}</span> together with any element of 
</div><div id="l100" class="code_block">    <span class="nb">{</span><span class="k">\tt</span> List2<span class="nb">}</span> not occurring in <span class="nb">{</span><span class="k">\tt</span> List1<span class="nb">}</span>.
</div><div id="l101" class="code_block">    If~<span class="nb">{</span><span class="k">\tt</span> List1<span class="nb">}</span> or~<span class="nb">{</span><span class="k">\tt</span> List2<span class="nb">}</span> contain duplicates, <span class="nb">{</span><span class="k">\tt</span> List3<span class="nb">}</span> may 
</div><div id="l102" class="code_block">    also contain duplicates.
</div><div id="l103" class="code_block">
</div><div id="l104" class="code_block"><span class="k">\ournewitem</span><span class="nb">{</span>absmerge(+List1, +List2, ?List3)<span class="nb">}{</span>listutil<span class="nb">}</span><span class="k">\index</span><span class="nb">{{</span><span class="k">\tt</span> absmerge/3<span class="nb">}}</span>
</div><div id="l105" class="code_block"><span class="c">%\predindex{absmerge/3~(L)}</span>
</div><div id="l106" class="code_block">    Predicate <span class="nb">{</span><span class="k">\tt</span> absmerge/3<span class="nb">}</span> is similar to <span class="nb">{</span><span class="k">\tt</span> merge/3<span class="nb">}</span>, except that 
</div><div id="l107" class="code_block">    it uses predicate <span class="nb">{</span><span class="k">\tt</span> absmember/2<span class="nb">}</span> described below rather than 
</div><div id="l108" class="code_block">    <span class="nb">{</span><span class="k">\tt</span> member/2<span class="nb">}</span>.
</div><div id="l109" class="code_block">
</div><div id="l110" class="code_block"><span class="k">\ournewitem</span><span class="nb">{</span>absmember(+Element, +List)<span class="nb">}{</span>listutil<span class="nb">}</span><span class="k">\index</span><span class="nb">{{</span><span class="k">\tt</span> absmember/2<span class="nb">}}</span>
</div><div id="l111" class="code_block"><span class="c">%\predindex{absmember/2~(L)}</span>
</div><div id="l112" class="code_block">    Similar to <span class="nb">{</span><span class="k">\tt</span> member<span class="nb">}</span>/2, except that it checks for identity
</div><div id="l113" class="code_block">    (through the use of predicate <span class="nb">{</span><span class="k">\tt</span> &#39;==&#39;/2<span class="nb">}</span>) rather than unifiability 
</div><div id="l114" class="code_block">    (through <span class="nb">{</span><span class="k">\tt</span> &#39;=&#39;/2<span class="nb">}</span>) of <span class="nb">{</span><span class="k">\tt</span> Element<span class="nb">}</span> with elements of <span class="nb">{</span><span class="k">\tt</span> List<span class="nb">}</span>.
</div><div id="l115" class="code_block">
</div><div id="l116" class="code_block"><span class="k">\ournewitem</span><span class="nb">{</span>member2(?Element, ?List)<span class="nb">}{</span>listutil<span class="nb">}</span><span class="k">\index</span><span class="nb">{{</span><span class="k">\tt</span> member2/2<span class="nb">}}</span>
</div><div id="l117" class="code_block"><span class="c">%\predindex{member2/2~(L)}</span>
</div><div id="l118" class="code_block">    Checks whether <span class="nb">{</span><span class="k">\tt</span> Element<span class="nb">}</span> unifies with any of the actual elements 
</div><div id="l119" class="code_block">    of <span class="nb">{</span><span class="k">\tt</span> List<span class="nb">}</span>.  The only difference between this predicate and 
</div><div id="l120" class="code_block">    predicate <span class="nb">{</span><span class="k">\tt</span> member/2<span class="nb">}</span> is on lists having a variable tail, 
</div><div id="l121" class="code_block">    e.g.<span class="k">\</span> <span class="k">\verb</span>&#39;[a, b, c | <span class="nb">_</span> ]&#39;: while <span class="nb">{</span><span class="k">\tt</span> member/2<span class="nb">}</span> would insert 
</div><div id="l122" class="code_block">    <span class="nb">{</span><span class="k">\tt</span> Element<span class="nb">}</span> at the end of such a list if it did not find it, 
</div><div id="l123" class="code_block">    Predicate <span class="nb">{</span><span class="k">\tt</span> member2/2<span class="nb">}</span> only checks for membership but does not 
</div><div id="l124" class="code_block">    insert the <span class="nb">{</span><span class="k">\tt</span> Element<span class="nb">}</span> into the list if it is not there.
</div><div id="l125" class="code_block">
</div><div id="l126" class="code_block"><span class="k">\ournewitem</span><span class="nb">{</span>delete<span class="k">\_ith</span>(+Index, +List, ?Element, ?RestList)<span class="nb">}{</span>listutil<span class="nb">}</span>
</div><div id="l127" class="code_block"><span class="k">\index</span><span class="nb">{{</span><span class="k">\tt</span> delete<span class="k">\_ith</span>/4<span class="nb">}}</span>
</div><div id="l128" class="code_block"><span class="c">%\predindex{delete\_ith/4~(L)}</span>
</div><div id="l129" class="code_block">    Succeeds if the <span class="s">$</span><span class="nb">{</span><span class="nv">\tt</span><span class="nb"> Index^{th}}</span><span class="s">$</span> element of the list <span class="nb">{</span><span class="k">\tt</span> List<span class="nb">}</span>
</div><div id="l130" class="code_block">    unifies with <span class="nb">{</span><span class="k">\tt</span> Element<span class="nb">}</span>, and <span class="nb">{</span><span class="k">\tt</span> RestList<span class="nb">}</span> is <span class="nb">{</span><span class="k">\tt</span> List<span class="nb">}</span> with
</div><div id="l131" class="code_block">    <span class="nb">{</span><span class="k">\tt</span> Element<span class="nb">}</span> removed.  Fails if <span class="nb">{</span><span class="k">\tt</span> Index<span class="nb">}</span> is not a positive
</div><div id="l132" class="code_block">    integer or greater than the length of <span class="nb">{</span><span class="k">\tt</span> List<span class="nb">}</span>.
</div><div id="l133" class="code_block">
</div><div id="l134" class="code_block"><span class="k">\ournewitem</span><span class="nb">{</span>closetail(?List)<span class="nb">}{</span>listutil<span class="nb">}</span><span class="k">\index</span><span class="nb">{{</span><span class="k">\tt</span> closetail/1<span class="nb">}}</span>
</div><div id="l135" class="code_block"><span class="c">%\predindex{closetail/1~(L)}</span>
</div><div id="l136" class="code_block">    Predicate <span class="nb">{</span><span class="k">\tt</span> closetail/1<span class="nb">}</span> closes the tail of an open-ended list.
</div><div id="l137" class="code_block">    It succeeds only once.
</div><div id="l138" class="code_block">
</div><div id="l139" class="code_block"><span class="k">\ouritem</span><span class="nb">{</span>remove<span class="k">\_dupls</span>(+List1, ?List2)<span class="nb">}</span><span class="k">\index</span><span class="nb">{{</span><span class="k">\tt</span> remove<span class="k">\_dupls</span>/2<span class="nb">}}</span>
</div><div id="l140" class="code_block">    There is no need to provide such a predicate.  If you need one use
</div><div id="l141" class="code_block">    the <span class="nb">{</span><span class="k">\tt</span> sort/2<span class="nb">}</span> standard predicate (described in section~<span class="k">\ref</span><span class="nb">{</span>Comparison<span class="nb">}</span>).
</div><div id="l142" class="code_block"><span class="k">\end</span><span class="nb">{</span>description<span class="nb">}</span>
</div><div id="l143" class="code_block">
</div><div id="l144" class="code_block">
</div><div id="l145" class="code_block">
</div><div id="l146" class="code_block"><span class="k">\section</span><span class="nb">{</span>Asserting Dynamic Code<span class="nb">}</span> <span class="k">\label</span><span class="nb">{</span>LoadDyn<span class="nb">}</span>
</div><div id="l147" class="code_block"><span class="c">%===============================================</span>
</div><div id="l148" class="code_block">
</div><div id="l149" class="code_block">The module <span class="nb">{</span><span class="k">\tt</span> consult<span class="nb">}</span> in directory <span class="nb">{</span><span class="k">\tt</span> lib<span class="nb">}</span> provides several handy
</div><div id="l150" class="code_block">library predicates that can assert the contents of a file into
</div><div id="l151" class="code_block"><span class="k">\ourprolog</span>&#39;s database.  The use of these predicates may be necessary
</div><div id="l152" class="code_block">when the code needs to be <span class="nb">{</span><span class="k">\tt</span> dynamic<span class="nb">}</span> (so that it is retractable),
</div><div id="l153" class="code_block">or when it contains atoms whose length is more than 255 that cannot be
</div><div id="l154" class="code_block">handled by the XSB compiler.
</div><div id="l155" class="code_block">
</div><div id="l156" class="code_block"><span class="k">\begin</span><span class="nb">{</span>description<span class="nb">}</span>
</div><div id="l157" class="code_block"><span class="k">\ournewitem</span><span class="nb">{</span>load<span class="k">\_dyn</span>(+FileName)<span class="nb">}{</span>consult<span class="nb">}</span>
</div><div id="l158" class="code_block"><span class="k">\index</span><span class="nb">{{</span><span class="k">\tt</span> load<span class="k">\_dyn</span>/1<span class="nb">}}</span><span class="k">\label</span><span class="nb">{</span>load<span class="nb">_</span>dyn/1<span class="nb">}</span>
</div><div id="l159" class="code_block"><span class="c">%\predindex{load\_dyn/1~(L)}</span>
</div><div id="l160" class="code_block">    Asserts the contents of file <span class="nb">{</span><span class="k">\tt</span> FileName<span class="nb">}</span> into the database.
</div><div id="l161" class="code_block">    All existing clauses of the predicates in the file that already
</div><div id="l162" class="code_block">    appear in the database, are retracted unless there is a <span class="nb">{</span><span class="k">\tt</span>
</div><div id="l163" class="code_block">    multifile/1<span class="nb">}</span> declaration for them.  Clauses in the file must be
</div><div id="l164" class="code_block">    in a format that <span class="nb">{</span><span class="k">\tt</span> read/1<span class="nb">}</span> will process.  So, for example,
</div><div id="l165" class="code_block">    operators are permitted.  As usual, clauses of predicates are not
</div><div id="l166" class="code_block">    retracted if they are compiled instead of dynamically asserted.
</div><div id="l167" class="code_block">    All predicates are loaded into <span class="nb">{</span><span class="k">\tt</span> usermod<span class="nb">}</span>.  Module declarations
</div><div id="l168" class="code_block">    such as <span class="nb">{</span><span class="k">\tt</span> :- export<span class="nb">}</span> are ignored and a warning is issued.
</div><div id="l169" class="code_block">    Starting with Version 1.5.0, this predicate is a standard predicate
</div><div id="l170" class="code_block">    of <span class="k">\ourprolog</span>.
</div><div id="l171" class="code_block">
</div><div id="l172" class="code_block"><span class="k">\ournewitem</span><span class="nb">{</span>ensure<span class="k">\_dyn\_loaded</span>(+FileName)<span class="nb">}{</span>consult<span class="nb">}</span>
</div><div id="l173" class="code_block"><span class="k">\index</span><span class="nb">{{</span><span class="k">\tt</span> ensure<span class="k">\_dyn\_loaded</span>/1<span class="nb">}}</span>
</div><div id="l174" class="code_block">    Is similar to <span class="nb">{</span><span class="k">\tt</span> load<span class="k">\_dyn</span>/1<span class="nb">}</span> except that it does nothing if the
</div><div id="l175" class="code_block">    file has previously been loaded and the file has not been changed
</div><div id="l176" class="code_block">    since.  However the file will be reloaded if the index declaration of
</div><div id="l177" class="code_block">    any predicate in that file has changed to require more indexing, or a
</div><div id="l178" class="code_block">    larger hash table.
</div><div id="l179" class="code_block">
</div><div id="l180" class="code_block"><span class="k">\ournewitem</span><span class="nb">{</span>load<span class="k">\_dync</span>(+FileName)<span class="nb">}{</span>consult<span class="nb">}</span><span class="k">\index</span><span class="nb">{{</span><span class="k">\tt</span> load<span class="k">\_dync</span>/1<span class="nb">}}</span>
</div><div id="l181" class="code_block"><span class="c">%\predindex{load\_dync/1~(L)}</span>
</div><div id="l182" class="code_block">    Asserts the contents of file <span class="nb">{</span><span class="k">\tt</span> FileName<span class="nb">}</span> into the database.
</div><div id="l183" class="code_block">    All existing clauses of the predicates in the file that already appear
</div><div id="l184" class="code_block">    in the database, are retracted unless there is a <span class="nb">{</span><span class="k">\tt</span> multifile/1<span class="nb">}</span>
</div><div id="l185" class="code_block">    directive for them.  The terms in the file <span class="nb">{</span><span class="k">\tt</span> FileName<span class="nb">}</span> must be in
</div><div id="l186" class="code_block">    ``canonical&#39;&#39; format; that is, they must not use any operators (or
</div><div id="l187" class="code_block">    list notation.) This is the format produced by the predicate <span class="nb">{</span><span class="k">\tt</span>
</div><div id="l188" class="code_block">    write<span class="k">\_canonical</span>/1<span class="nb">}</span>. (See <span class="nb">{</span><span class="k">\tt</span> cvt<span class="k">\_canonical</span>/2<span class="nb">}</span> to convert a file from
</div><div id="l189" class="code_block">    the usual <span class="nb">{</span><span class="k">\tt</span> read/1<span class="nb">}</span> format to <span class="nb">{</span><span class="k">\tt</span> read<span class="k">\_canonical</span><span class="nb">}</span> format.)  As
</div><div id="l190" class="code_block">    usual, clauses of predicates are not retracted if they are compiled
</div><div id="l191" class="code_block">    instead of dynamically asserted. All predicates are loaded into <span class="nb">{</span><span class="k">\tt</span>
</div><div id="l192" class="code_block">    usermod<span class="nb">}</span>.  <span class="nb">{</span><span class="k">\tt</span> :- export<span class="nb">}</span> declarations are ignored and a warning is
</div><div id="l193" class="code_block">    issued.
</div><div id="l194" class="code_block">
</div><div id="l195" class="code_block">    Notice that this predicate can be used to load files of Datalog facts
</div><div id="l196" class="code_block">    (since they will be in canonical format).  This predicate is
</div><div id="l197" class="code_block">    significantly faster than <span class="nb">{</span><span class="k">\tt</span> load<span class="k">\_dyn</span>/1<span class="nb">}</span> and should be used when
</div><div id="l198" class="code_block">    speed is important.  A file that is to be dynamically loaded often but
</div><div id="l199" class="code_block">    not often modified by hand should be loaded with this predicate.  Use
</div><div id="l200" class="code_block">    predicate <span class="nb">{</span><span class="k">\tt</span> cvt<span class="k">\_canonical</span>/2<span class="nb">}</span> (see below) to convert a usual file
</div><div id="l201" class="code_block">    to a format readable by this predicate.
</div><div id="l202" class="code_block">
</div><div id="l203" class="code_block"><span class="k">\ournewitem</span><span class="nb">{</span>ensure<span class="k">\_dync\_loaded</span>(+FileName)<span class="nb">}{</span>consult<span class="nb">}</span>
</div><div id="l204" class="code_block"><span class="k">\index</span><span class="nb">{{</span><span class="k">\tt</span> ensure<span class="k">\_dync\_loaded</span>/1<span class="nb">}}</span>
</div><div id="l205" class="code_block">    Is similar to <span class="nb">{</span><span class="k">\tt</span> load<span class="k">\_dync</span>/1<span class="nb">}</span> except that it does nothing if the
</div><div id="l206" class="code_block">    file has previously been loaded and the file has not been changed
</div><div id="l207" class="code_block">    since.  However the file will be reloaded if the index declaration of
</div><div id="l208" class="code_block">    any predicate in that file has changed to require more indexing, or a
</div><div id="l209" class="code_block">    larger hash table.
</div><div id="l210" class="code_block">
</div><div id="l211" class="code_block"><span class="k">\ournewitem</span><span class="nb">{</span>cvt<span class="k">\_canonical</span>(+FileName1,+FileName2)<span class="nb">}{</span>consult<span class="nb">}</span>
</div><div id="l212" class="code_block"><span class="k">\index</span><span class="nb">{{</span><span class="k">\tt</span> cvt<span class="k">\_canonical</span>/2<span class="nb">}}</span>
</div><div id="l213" class="code_block">    Converts a file from standard term format to ``canonical&#39;&#39; format.
</div><div id="l214" class="code_block">    The input file name is <span class="nb">{</span><span class="k">\tt</span> FileName1<span class="nb">}</span>; the converted file is put in
</div><div id="l215" class="code_block">    <span class="nb">{</span><span class="k">\tt</span> FileName2<span class="nb">}</span>.  This predicate can be used to convert a file in
</div><div id="l216" class="code_block">    standard Prolog format to one loadable by <span class="nb">{</span><span class="k">\tt</span> load<span class="k">\_dync</span>/1<span class="nb">}</span>.
</div><div id="l217" class="code_block"><span class="k">\end</span><span class="nb">{</span>description<span class="nb">}</span>
</div><div id="l218" class="code_block">
</div><div id="l219" class="code_block"><span class="c">%----------------------------------------------------------------------</span>
</div><div id="l220" class="code_block">
</div><div id="l221" class="code_block">
</div><div id="l222" class="code_block"><span class="k">\section</span><span class="nb">{</span>Ground, Numbervars, Subsumption, Variant<span class="nb">}</span> <span class="k">\label</span><span class="nb">{</span>NumberVars<span class="nb">}</span>
</div><div id="l223" class="code_block"><span class="c">%====================================================================</span>
</div><div id="l224" class="code_block">
</div><div id="l225" class="code_block"><span class="k">\begin</span><span class="nb">{</span>description<span class="nb">}</span>
</div><div id="l226" class="code_block"><span class="k">\ournewitem</span><span class="nb">{</span>ground(+X)<span class="nb">}{</span>basics<span class="nb">}</span><span class="k">\index</span><span class="nb">{{</span><span class="k">\tt</span> ground/1<span class="nb">}}</span>
</div><div id="l227" class="code_block"><span class="c">%\predindex{ground/1~(L)}</span>
</div><div id="l228" class="code_block">    Succeeds if <span class="nb">{</span><span class="k">\tt</span> X<span class="nb">}</span> is currently instantiated to a term that is 
</div><div id="l229" class="code_block">    completely bound (has no uninstantiated variables in it); 
</div><div id="l230" class="code_block">    otherwise it fails.  Predicate <span class="nb">{</span><span class="k">\tt</span> ground/1<span class="nb">}</span> has no associated 
</div><div id="l231" class="code_block">    error conditions.
</div><div id="l232" class="code_block">
</div><div id="l233" class="code_block"><span class="k">\ournewitem</span><span class="nb">{</span>numbervars(+Term, +FirstN, ?LastN)<span class="nb">}{</span>num<span class="k">\_vars</span><span class="nb">}</span>
</div><div id="l234" class="code_block"><span class="k">\index</span><span class="nb">{{</span><span class="k">\tt</span> numbervars/3<span class="nb">}}</span>
</div><div id="l235" class="code_block"><span class="c">%\predindex{numbervars/3~(L)}</span>
</div><div id="l236" class="code_block">    This predicate provides a mechanism for grounding a (HiLog) term
</div><div id="l237" class="code_block">    so that it may be analyzed.  Each variable in the (HiLog) term
</div><div id="l238" class="code_block">    <span class="nb">{</span><span class="k">\tt</span> Term<span class="nb">}</span> is instantiated to a term of the form <span class="k">\verb</span>|&#39;<span class="s">$</span><span class="nb">VAR&#39;</span><span class="o">(</span><span class="nb">N</span><span class="o">)</span><span class="nb">|,</span>
</div><div id="l239" class="code_block"><span class="nb">    where {</span><span class="nv">\tt</span><span class="nb"> N} is an integer starting from {</span><span class="nv">\tt</span><span class="nb"> FirstN}.  </span>
</div><div id="l240" class="code_block"><span class="nb">    {</span><span class="nv">\tt</span><span class="nb"> FirstN} is used as the value of {</span><span class="nv">\tt</span><span class="nb"> N} for the first</span>
</div><div id="l241" class="code_block"><span class="nb">    variable in {</span><span class="nv">\tt</span><span class="nb"> Term} </span><span class="o">(</span><span class="nb">starting from the left</span><span class="o">)</span><span class="nb">. The second distinct</span>
</div><div id="l242" class="code_block"><span class="nb">    variable in {</span><span class="nv">\tt</span><span class="nb"> Term} is given a value of {</span><span class="nv">\tt</span><span class="nb"> N} satisfying</span>
</div><div id="l243" class="code_block"><span class="nb">    {</span><span class="nv">\tt</span><span class="nb"> &quot;N is FirstN </span><span class="o">+</span><span class="nb"> </span><span class="m">1</span><span class="nb">&quot;} and so on.  The last variable in {</span><span class="nv">\tt</span><span class="nb"> Term}</span>
</div><div id="l244" class="code_block"><span class="nb">    has the value {</span><span class="nv">\tt</span><span class="nb"> LastN</span><span class="o">-</span><span class="m">1</span><span class="nb">}.</span>
</div><div id="l245" class="code_block">
</div><div id="l246" class="code_block"><span class="nv">\ournewitem</span><span class="nb">{numbervars</span><span class="o">(+</span><span class="nb">Term</span><span class="o">)</span><span class="nb">}{num</span><span class="nv">\_</span><span class="nb">vars}</span><span class="nv">\index</span><span class="nb">{{</span><span class="nv">\tt</span><span class="nb"> numbervars</span><span class="o">/</span><span class="m">1</span><span class="nb">}}</span>
</div><div id="l247" class="code_block"><span class="c">%\predindex{numbervars/1~(L)}</span>
</div><div id="l248" class="code_block"><span class="nb">    This predicate is defined as:</span>
</div><div id="l249" class="code_block"><span class="nb">    </span><span class="nv">\begin</span><span class="nb">{center}</span>
</div><div id="l250" class="code_block"><span class="nb">    {</span><span class="nv">\tt</span><span class="nb">   numbervars</span><span class="o">(</span><span class="nb">Term, </span><span class="m">0</span><span class="nb">, </span><span class="nv">\_</span><span class="o">)</span><span class="nb">}.</span>
</div><div id="l251" class="code_block"><span class="nb">    </span><span class="nv">\end</span><span class="nb">{center}</span>
</div><div id="l252" class="code_block"><span class="nb">    It is included solely for convenience.</span>
</div><div id="l253" class="code_block">
</div><div id="l254" class="code_block"><span class="c">%\ournewitem{varnumbers(Term, FirstN, Copy)}{num\_vars}</span>
</div><div id="l255" class="code_block"><span class="c">%\index{{\tt varnumbers/3}}</span>
</div><div id="l256" class="code_block"><span class="c">%%\predindex{varnumbers/3~(B)}</span>
</div><div id="l257" class="code_block"><span class="c">%    This predicate is a partial inverse of predicate {\tt numbervars/3}.</span>
</div><div id="l258" class="code_block"><span class="c">%    It unifies {\tt Copy} with a copy of {\tt Term} in which subterms of</span>
</div><div id="l259" class="code_block"><span class="c">%    the form \verb|&#39;$VAR&#39;(N)| where {\tt N} is an integer not less than</span>
</div><div id="l260" class="code_block"><span class="c">%    {\tt FirstN} have been systematically replaced by fresh variables. </span>
</div><div id="l261" class="code_block"><span class="c">%    Since 0 is the usual second argument of numbervars/3,</span>
</div><div id="l262" class="code_block"><span class="c">%    \begin{center}</span>
</div><div id="l263" class="code_block"><span class="c">%    {\tt   varnumbers(Term, Copy)}</span>
</div><div id="l264" class="code_block"><span class="c">%    \end{center}</span>
</div><div id="l265" class="code_block"><span class="c">%    is also provided.</span>
</div><div id="l266" class="code_block">
</div><div id="l267" class="code_block"><span class="nv">\ournewitem</span><span class="nb">{subsumes</span><span class="o">(</span><span class="nb">?Term</span><span class="m">1</span><span class="nb">, </span><span class="o">+</span><span class="nb">Term</span><span class="m">2</span><span class="o">)</span><span class="nb">}{subsumes}</span><span class="nv">\index</span><span class="nb">{{</span><span class="nv">\tt</span><span class="nb"> subsumes</span><span class="o">/</span><span class="m">2</span><span class="nb">}}</span>
</div><div id="l268" class="code_block"><span class="c">%\predindex{subsumes/2~(L)}</span>
</div><div id="l269" class="code_block"><span class="nb">    Term subsumption is a sort of one</span><span class="o">-</span><span class="nb">way unification.  Term {</span><span class="nv">\tt</span><span class="nb"> Term</span><span class="m">1</span><span class="nb">}</span>
</div><div id="l270" class="code_block"><span class="nb">    and {</span><span class="nv">\tt</span><span class="nb"> Term</span><span class="m">2</span><span class="nb">} unify if they have a common instance, and unification</span>
</div><div id="l271" class="code_block"><span class="nb">    in Prolog instantiates both terms to that </span><span class="o">(</span><span class="nb">most general</span><span class="o">)</span><span class="nb"> common instance.</span>
</div><div id="l272" class="code_block"><span class="nb">    {</span><span class="nv">\tt</span><span class="nb"> Term</span><span class="m">1</span><span class="nb">} subsumes {</span><span class="nv">\tt</span><span class="nb"> Term</span><span class="m">2</span><span class="nb">} if {</span><span class="nv">\tt</span><span class="nb"> Term</span><span class="m">2</span><span class="nb">} is already an instance of</span>
</div><div id="l273" class="code_block"><span class="nb">    {</span><span class="nv">\tt</span><span class="nb"> Term</span><span class="m">1</span><span class="nb">}.  For our purposes, {</span><span class="nv">\tt</span><span class="nb"> Term</span><span class="m">2</span><span class="nb">} is an instance of {</span><span class="nv">\tt</span><span class="nb"> Term</span><span class="m">1</span><span class="nb">}</span>
</div><div id="l274" class="code_block"><span class="nb">    if there is a substitution that leaves {</span><span class="nv">\tt</span><span class="nb"> Term</span><span class="m">2</span><span class="nb">} unchanged and makes</span>
</div><div id="l275" class="code_block"><span class="nb">    {</span><span class="nv">\tt</span><span class="nb"> Term</span><span class="m">1</span><span class="nb">} identical to {</span><span class="nv">\tt</span><span class="nb"> Term</span><span class="m">2</span><span class="nb">}.  Predicate {</span><span class="nv">\tt</span><span class="nb"> subsumes</span><span class="o">/</span><span class="m">2</span><span class="nb">} does</span>
</div><div id="l276" class="code_block"><span class="nb">    not work as described if {</span><span class="nv">\tt</span><span class="nb"> Term</span><span class="m">1</span><span class="nb">} and {</span><span class="nv">\tt</span><span class="nb"> Term</span><span class="m">2</span><span class="nb">} share common</span>
</div><div id="l277" class="code_block"><span class="nb">    variables.</span>
</div><div id="l278" class="code_block">
</div><div id="l279" class="code_block"><span class="nv">\ournewitem</span><span class="nb">{subsumes</span><span class="nv">\_</span><span class="nb">chk</span><span class="o">(+</span><span class="nb">Term</span><span class="m">1</span><span class="nb">, </span><span class="o">+</span><span class="nb">Term</span><span class="m">2</span><span class="o">)</span><span class="nb">}{subsumes}</span>
</div><div id="l280" class="code_block"><span class="nv">\index</span><span class="nb">{{</span><span class="nv">\tt</span><span class="nb"> subsumes</span><span class="nv">\_</span><span class="nb">chk</span><span class="o">/</span><span class="m">2</span><span class="nb">}}</span>
</div><div id="l281" class="code_block"><span class="c">%\predindex{subsumes\_chk/2~(L)}</span>
</div><div id="l282" class="code_block"><span class="nb">    The {</span><span class="nv">\tt</span><span class="nb"> subsumes</span><span class="nv">\_</span><span class="nb">chk</span><span class="o">/</span><span class="m">2</span><span class="nb">} predicate is true when {</span><span class="nv">\tt</span><span class="nb"> Term</span><span class="m">1</span><span class="nb">} subsumes </span>
</div><div id="l283" class="code_block"><span class="nb">    {</span><span class="nv">\tt</span><span class="nb"> Term</span><span class="m">2</span><span class="nb">}; that is, when {</span><span class="nv">\tt</span><span class="nb"> Term</span><span class="m">2</span><span class="nb">} is already an instance of</span>
</div><div id="l284" class="code_block"><span class="nb">    {</span><span class="nv">\tt</span><span class="nb"> Term</span><span class="m">1</span><span class="nb">}.  This predicate simply checks for subsumption and </span>
</div><div id="l285" class="code_block"><span class="nb">    does not bind any variables either in {</span><span class="nv">\tt</span><span class="nb"> Term</span><span class="m">1</span><span class="nb">} or in {</span><span class="nv">\tt</span><span class="nb"> Term</span><span class="m">2</span><span class="nb">}.</span>
</div><div id="l286" class="code_block">
</div><div id="l287" class="code_block"><span class="nb">    Examples:</span>
</div><div id="l288" class="code_block"><span class="nb">    {</span><span class="nv">\footnotesize</span>
</div><div id="l289" class="code_block"><span class="nb">     </span><span class="nv">\begin</span><span class="nb">{verbatim}</span>
</div><div id="l290" class="code_block"><span class="nb">            | ?</span><span class="o">-</span><span class="nb"> subsumes_chk</span><span class="o">(</span><span class="nb">a</span><span class="o">(</span><span class="nb">X,f,Y,X</span><span class="o">)</span><span class="nb">,a</span><span class="o">(</span><span class="nb">U,X,b,S</span><span class="o">))</span><span class="nb">.</span>
</div><div id="l291" class="code_block">
</div><div id="l292" class="code_block"><span class="nb">            no</span>
</div><div id="l293" class="code_block"><span class="nb">            | ?</span><span class="o">-</span><span class="nb"> subsumes_chk</span><span class="o">(</span><span class="nb">a</span><span class="o">(</span><span class="nb">X,Y,X</span><span class="o">)</span><span class="nb">,a</span><span class="o">(</span><span class="nb">b,b,b</span><span class="o">))</span><span class="nb">.</span>
</div><div id="l294" class="code_block">
</div><div id="l295" class="code_block"><span class="nb">            X </span><span class="o">=</span><span class="nb"> _</span><span class="m">595884</span>
</div><div id="l296" class="code_block"><span class="nb">            Y </span><span class="o">=</span><span class="nb"> _</span><span class="m">595624</span>
</div><div id="l297" class="code_block"><span class="nb">     </span><span class="nv">\end</span><span class="nb">{verbatim}}</span>
</div><div id="l298" class="code_block">
</div><div id="l299" class="code_block"><span class="nv">\ournewitem</span><span class="nb">{variant</span><span class="o">(</span><span class="nb">?Term</span><span class="m">1</span><span class="nb">, ?Term</span><span class="m">2</span><span class="o">)</span><span class="nb">}{subsumes}</span><span class="nv">\index</span><span class="nb">{{</span><span class="nv">\tt</span><span class="nb"> variant</span><span class="o">/</span><span class="m">2</span><span class="nb">}}</span>
</div><div id="l300" class="code_block"><span class="c">%\predindex{variant/2~(L)}</span>
</div><div id="l301" class="code_block"><span class="nb">    This predicate is true when {</span><span class="nv">\tt</span><span class="nb"> Term</span><span class="m">1</span><span class="nb">} and {</span><span class="nv">\tt</span><span class="nb"> Term</span><span class="m">2</span><span class="nb">} are </span>
</div><div id="l302" class="code_block"><span class="nb">    alphabetic variants.  That is, you could imagine that {</span><span class="nv">\tt</span><span class="nb"> variant</span><span class="o">/</span><span class="m">2</span><span class="nb">}</span>
</div><div id="l303" class="code_block"><span class="nb">    as being defined like:</span>
</div><div id="l304" class="code_block"><span class="nb">    </span><span class="nv">\begin</span><span class="nb">{center}</span>
</div><div id="l305" class="code_block"><span class="nb">    </span><span class="nv">\begin</span><span class="nb">{minipage}{</span><span class="m">3</span><span class="nb">.</span><span class="m">5</span><span class="nb">in}</span>
</div><div id="l306" class="code_block"><span class="nb">    </span><span class="nv">\begin</span><span class="nb">{verbatim}</span>
</div><div id="l307" class="code_block"><span class="nb">	variant</span><span class="o">(</span><span class="nb">Term</span><span class="m">1</span><span class="nb">, Term</span><span class="m">2</span><span class="o">)</span><span class="nb"> :</span><span class="o">-</span>
</div><div id="l308" class="code_block"><span class="nb">	     subsumes_chk</span><span class="o">(</span><span class="nb">Term</span><span class="m">1</span><span class="nb">, Term</span><span class="m">2</span><span class="o">)</span><span class="nb">,</span>
</div><div id="l309" class="code_block"><span class="nb">	     subsumes_chk</span><span class="o">(</span><span class="nb">Term</span><span class="m">2</span><span class="nb">, Term</span><span class="m">1</span><span class="o">)</span><span class="nb">.</span>
</div><div id="l310" class="code_block"><span class="nb">    </span><span class="nv">\end</span><span class="nb">{verbatim}</span>
</div><div id="l311" class="code_block"><span class="nb">    </span><span class="nv">\end</span><span class="nb">{minipage}</span>
</div><div id="l312" class="code_block"><span class="nb">    </span><span class="nv">\end</span><span class="nb">{center}</span>
</div><div id="l313" class="code_block"><span class="nb">    but the actual implementation of {</span><span class="nv">\tt</span><span class="nb"> variant</span><span class="o">/</span><span class="m">2</span><span class="nb">} is considerably more</span>
</div><div id="l314" class="code_block"><span class="nb">    efficient.  However, in general, it does not work for terms that share</span>
</div><div id="l315" class="code_block"><span class="nb">    variables; an assumption that holds for most </span><span class="o">(</span><span class="nb">reasonable</span><span class="o">)</span><span class="nb"> uses of</span>
</div><div id="l316" class="code_block"><span class="nb">    {</span><span class="nv">\tt</span><span class="nb"> variant</span><span class="o">/</span><span class="m">2</span><span class="nb">}.  Whenever the terms may share variables, the above</span>
</div><div id="l317" class="code_block"><span class="nb">    definition of variant </span><span class="o">(</span><span class="nb">via {</span><span class="nv">\tt</span><span class="nb"> subsumes</span><span class="nv">\_</span><span class="nb">chk</span><span class="o">/</span><span class="m">2</span><span class="nb">}</span><span class="o">)</span><span class="nb"> should be used.</span>
</div><div id="l318" class="code_block"><span class="nv">\end</span><span class="nb">{description}</span>
</div><div id="l319" class="code_block">
</div><div id="l320" class="code_block">
</div><div id="l321" class="code_block"><span class="nv">\section</span><span class="nb">{Lower</span><span class="o">-</span><span class="nb">Level I</span><span class="o">/</span><span class="nb">O}</span>
</div><div id="l322" class="code_block"><span class="c">%======================</span>
</div><div id="l323" class="code_block">
</div><div id="l324" class="code_block"><span class="nb">XSB  has various low</span><span class="o">-</span><span class="nb">level routines that support input and output, </span>
</div><div id="l325" class="code_block"><span class="nb">at both the term level and the character level.  The supporting</span>
</div><div id="l326" class="code_block"><span class="nb">predicates are described here.</span>
</div><div id="l327" class="code_block">
</div><div id="l328" class="code_block"><span class="nv">\begin</span><span class="nb">{description}</span>
</div><div id="l329" class="code_block">
</div><div id="l330" class="code_block"><span class="nv">\ournewitem</span><span class="nb">{fmt</span><span class="nv">\_</span><span class="nb">read</span><span class="o">(+</span><span class="nb">Fmt,</span><span class="o">+</span><span class="nb">Types,</span><span class="o">-</span><span class="nb">Term,</span><span class="o">-</span><span class="nb">Ret</span><span class="o">)</span><span class="nb">}{machine}</span><span class="nv">\index</span><span class="nb">{{</span><span class="nv">\tt</span><span class="nb"> fmt</span><span class="nv">\_</span><span class="nb">read</span><span class="o">/</span><span class="m">4</span><span class="nb">}}</span>
</div><div id="l331" class="code_block"><span class="c">%\predindex{fmt\_read/4~(L)}</span>
</div><div id="l332" class="code_block"><span class="nb">    This predicate provides a low</span><span class="o">-</span><span class="nb">level routine for reading data from</span>
</div><div id="l333" class="code_block"><span class="nb">    the current input file </span><span class="o">(</span><span class="nb">which must have been already opened by using</span>
</div><div id="l334" class="code_block"><span class="nb">    {</span><span class="nv">\tt</span><span class="nb"> see</span><span class="o">/</span><span class="m">1</span><span class="nb">}</span><span class="o">)</span><span class="nb"> according to a C format, as used in the C function</span>
</div><div id="l335" class="code_block"><span class="nb">    {</span><span class="nv">\tt</span><span class="nb"> scanf}. To use it, it must be imported from the module {</span><span class="nv">\tt</span>
</div><div id="l336" class="code_block"><span class="nb">    machine}.  {</span><span class="nv">\tt</span><span class="nb"> Fmt} must be an atom representing the format that</span>
</div><div id="l337" class="code_block"><span class="nb">    will be passed to the C call to {</span><span class="nv">\tt</span><span class="nb"> scanf}.  See the C</span>
</div><div id="l338" class="code_block"><span class="nb">    documentation for {</span><span class="nv">\tt</span><span class="nb"> scanf} for the meaning of this string.</span>
</div><div id="l339" class="code_block"><span class="nb">    Note that this argument is an atom, not a string, and the C escape</span>
</div><div id="l340" class="code_block"><span class="nb">    characters are NOT recognized.  So, for example, to include a</span>
</div><div id="l341" class="code_block"><span class="nb">    newline, one must put a newline directly in the atom, and not use</span>
</div><div id="l342" class="code_block"><span class="nb">    </span><span class="nv">\verb</span><span class="nb">|</span><span class="nv">\n</span><span class="nb">|.  {</span><span class="nv">\tt</span><span class="nb"> Types} is a term whose subfields describe the</span>
</div><div id="l343" class="code_block"><span class="nb">    types of the fields to be read.  For example, if three fields are</span>
</div><div id="l344" class="code_block"><span class="nb">    to be read, first an integer, then a string, and then a floating</span>
</div><div id="l345" class="code_block"><span class="nb">    point number, the term {</span><span class="nv">\tt</span><span class="nb"> type</span><span class="o">(</span><span class="m">2</span><span class="nb">,</span><span class="m">1</span><span class="nb">,</span><span class="m">3</span><span class="o">)</span><span class="nb">} could be used. The</span>
</div><div id="l346" class="code_block"><span class="nb">    functor symbol of {</span><span class="nv">\tt</span><span class="nb"> Type} is ignored. The arguments indicate</span>
</div><div id="l347" class="code_block"><span class="nb">    the types of the subfields: </span><span class="m">1</span><span class="nb"> indicates a string value; </span><span class="m">2</span>
</div><div id="l348" class="code_block"><span class="nb">    indicates an integer value; and </span><span class="m">3</span><span class="nb"> indicates a floating point</span>
</div><div id="l349" class="code_block"><span class="nb">    value.  {</span><span class="nv">\tt</span><span class="nb"> Term} is a term whose arguments will be unified with</span>
</div><div id="l350" class="code_block"><span class="nb">    the field values read in.  </span><span class="o">(</span><span class="nb">Again, the functor symbol of {</span><span class="nv">\tt</span>
</div><div id="l351" class="code_block"><span class="nb">    Term} is ignored.</span><span class="o">)</span><span class="nb">  It is an error </span><span class="o">(</span><span class="nb">and in some cases the results</span>
</div><div id="l352" class="code_block"><span class="nb">    are unpredictable</span><span class="o">)</span><span class="nb"> if the number of arguments and their types are</span>
</div><div id="l353" class="code_block"><span class="nb">    not consistent among {</span><span class="nv">\tt</span><span class="nb"> Fmt}, {</span><span class="nv">\tt</span><span class="nb"> Types}, and {</span><span class="nv">\tt</span><span class="nb"> Term}.  {</span><span class="nv">\tt</span>
</div><div id="l354" class="code_block"><span class="nb">    Ret} must be a variable and it will be assigned a return value by</span>
</div><div id="l355" class="code_block"><span class="nb">    the predicate: a negative integer if end</span><span class="o">-</span><span class="nb">of</span><span class="o">-</span><span class="nb">file is encountered;</span>
</div><div id="l356" class="code_block"><span class="nb">    otherwise the number of fields read </span><span class="o">(</span><span class="nb">as returned by {</span><span class="nv">\tt</span><span class="nb"> scanf}.</span><span class="o">)</span>
</div><div id="l357" class="code_block">
</div><div id="l358" class="code_block"><span class="nv">\ournewitem</span><span class="nb">{fmt</span><span class="nv">\_</span><span class="nb">write</span><span class="o">(+</span><span class="nb">Fmt,</span><span class="o">+</span><span class="nb">Term</span><span class="o">)</span><span class="nb">}{machine}</span><span class="nv">\index</span><span class="nb">{{</span><span class="nv">\tt</span><span class="nb"> fmt</span><span class="nv">\_</span><span class="nb">write</span><span class="o">/</span><span class="m">2</span><span class="nb">}}</span>
</div><div id="l359" class="code_block"><span class="c">%\predindex{fmt\_write/2~(L)}</span>
</div><div id="l360" class="code_block"><span class="nb">    This predicate provides a low</span><span class="o">-</span><span class="nb">level routine for writing data to</span>
</div><div id="l361" class="code_block"><span class="nb">    the current output file </span><span class="o">(</span><span class="nb">which must have been already opened by using</span>
</div><div id="l362" class="code_block"><span class="nb">    {</span><span class="nv">\tt</span><span class="nb"> tell</span><span class="o">/</span><span class="m">1</span><span class="nb">}</span><span class="o">)</span><span class="nb"> according to a C format, as used in the C function</span>
</div><div id="l363" class="code_block"><span class="nb">    {</span><span class="nv">\tt</span><span class="nb"> printf}.</span>
</div><div id="l364" class="code_block"><span class="nb">    To use it, it must be imported from the module {</span><span class="nv">\tt</span><span class="nb"> machine}.</span>
</div><div id="l365" class="code_block"><span class="nb">    {</span><span class="nv">\tt</span><span class="nb"> Fmt} must be an atom representing the format that will be</span>
</div><div id="l366" class="code_block"><span class="nb">    passed to the C call to {</span><span class="nv">\tt</span><span class="nb"> printf}.  See the C documentation</span>
</div><div id="l367" class="code_block"><span class="nb">    for {</span><span class="nv">\tt</span><span class="nb"> printf} for the meaning of this string.  Note that this</span>
</div><div id="l368" class="code_block"><span class="nb">    is an atom, not a string, and the C escape characters are NOT</span>
</div><div id="l369" class="code_block"><span class="nb">    recognized.  So, for example, to include a newline, one must put</span>
</div><div id="l370" class="code_block"><span class="nb">    a newline directly in the atom, and not use </span><span class="nv">\verb</span><span class="nb">|</span><span class="nv">\n</span><span class="nb">|.</span>
</div><div id="l371" class="code_block"><span class="nb">    {</span><span class="nv">\tt</span><span class="nb"> Term} is a term whose arguments will be output. They must</span>
</div><div id="l372" class="code_block"><span class="nb">    agree in number and in type with the field indicators in the</span>
</div><div id="l373" class="code_block"><span class="nb">    format {</span><span class="nv">\tt</span><span class="nb"> Fmt}.  </span><span class="o">(</span><span class="nb">The functor symbol of {</span><span class="nv">\tt</span><span class="nb"> Term} is ignored.</span><span class="o">)</span>
</div><div id="l374" class="code_block">
</div><div id="l375" class="code_block"><span class="nv">\ournewitem</span><span class="nb">{fmt</span><span class="nv">\_</span><span class="nb">write</span><span class="nv">\_</span><span class="nb">string</span><span class="o">(-</span><span class="nb">String,</span><span class="o">+</span><span class="nb">Fmt,</span><span class="o">+</span><span class="nb">Term</span><span class="o">)</span><span class="nb">}{machine}</span><span class="nv">\index</span><span class="nb">{{</span><span class="nv">\tt</span><span class="nb"> fmt</span><span class="nv">\_</span><span class="nb">write</span><span class="nv">\_</span><span class="nb">string</span><span class="o">/</span><span class="m">2</span><span class="nb">}}</span>
</div><div id="l376" class="code_block"><span class="nb">    This predicate works like the C function {</span><span class="nv">\tt</span><span class="nb"> sprintf}. It takes the</span>
</div><div id="l377" class="code_block"><span class="nb">    format string and substitutes the values from the arguments of {</span><span class="nv">\tt</span>
</div><div id="l378" class="code_block"><span class="nb">      Term} for the formatting instructions </span><span class="nv">\%</span><span class="nb">s, </span><span class="nv">\%</span><span class="nb">d, etc. The result is</span>
</div><div id="l379" class="code_block"><span class="nb">    available in {</span><span class="nv">\tt</span><span class="nb"> String}.</span>
</div><div id="l380" class="code_block">
</div><div id="l381" class="code_block">
</div><div id="l382" class="code_block"><span class="nv">\ournewitem</span><span class="nb">{read</span><span class="nv">\_</span><span class="nb">canonical</span><span class="o">(-</span><span class="nb">Term</span><span class="o">)</span><span class="nb">}{basics}</span><span class="nv">\index</span><span class="nb">{{</span><span class="nv">\tt</span><span class="nb"> read</span><span class="nv">\_</span><span class="nb">canonical</span><span class="o">/</span><span class="m">1</span><span class="nb">}}</span>
</div><div id="l383" class="code_block"><span class="nb">    Reads a term that is in canonical format from the current input</span>
</div><div id="l384" class="code_block"><span class="nb">    stream and returns it in {</span><span class="nv">\tt</span><span class="nb"> Term}. On end</span><span class="o">-</span><span class="nb">of</span><span class="o">-</span><span class="nb">file, it returns the</span>
</div><div id="l385" class="code_block"><span class="nb">    atom {</span><span class="nv">\tt</span><span class="nb"> end</span><span class="nv">\_</span><span class="nb">of</span><span class="nv">\_</span><span class="nb">file}.  If it encounters an error, it prints an</span>
</div><div id="l386" class="code_block"><span class="nb">    error message on stderr and returns the atom {</span><span class="nv">\tt</span>
</div><div id="l387" class="code_block"><span class="nb">    read</span><span class="nv">\_</span><span class="nb">canonical</span><span class="nv">\_</span><span class="nb">error}. This is significantly faster than {</span><span class="nv">\tt</span>
</div><div id="l388" class="code_block"><span class="nb">    read</span><span class="o">/</span><span class="m">1</span><span class="nb">}, but requires the input to be in canonical form.</span>
</div><div id="l389" class="code_block">
</div><div id="l390" class="code_block"><span class="nv">\ournewitem</span><span class="nb">{file</span><span class="nv">\_</span><span class="nb">read</span><span class="nv">\_</span><span class="nb">canonical</span><span class="o">(+</span><span class="nb">FileDes,</span><span class="o">-</span><span class="nb">Term,</span><span class="o">-</span><span class="nb">Psc</span><span class="o">)</span><span class="nb">}{machine}</span>
</div><div id="l391" class="code_block"><span class="nv">\index</span><span class="nb">{{</span><span class="nv">\tt</span><span class="nb"> file</span><span class="nv">\_</span><span class="nb">read</span><span class="nv">\_</span><span class="nb">canonical</span><span class="o">/</span><span class="m">3</span><span class="nb">}}</span>
</div><div id="l392" class="code_block"><span class="nb">    Reads a term that is in canonical format from the the file</span>
</div><div id="l393" class="code_block"><span class="nb">    indicated by {</span><span class="nv">\tt</span><span class="nb"> FileDes} </span><span class="o">(</span><span class="nb">as returned by {</span><span class="nv">\tt</span><span class="nb"> file</span><span class="nv">\_</span><span class="nb">open</span><span class="o">/</span><span class="m">3</span><span class="nb">} or</span>
</div><div id="l394" class="code_block"><span class="nb">    by {</span><span class="nv">\tt</span><span class="nb"> stat</span><span class="nv">\_</span><span class="nb">flag</span><span class="o">(</span><span class="m">10</span><span class="nb">,FileDes</span><span class="o">))</span><span class="nb">}, and returns it in {</span><span class="nv">\tt</span><span class="nb"> Term}.</span>
</div><div id="l395" class="code_block"><span class="nb">    It also returns </span><span class="o">(</span><span class="nb">in {</span><span class="nv">\tt</span><span class="nb"> Psc}</span><span class="o">)</span><span class="nb"> the psc address of the main functor</span>
</div><div id="l396" class="code_block"><span class="nb">    symbol of the term, if it is the same as that of the previously</span>
</div><div id="l397" class="code_block"><span class="nb">    read term, and the current term is a ground </span><span class="o">(</span><span class="nb">non </span><span class="m">0</span><span class="o">-</span><span class="nb">ary</span><span class="o">)</span><span class="nb"> fact.</span>
</div><div id="l398" class="code_block"><span class="nb">    </span><span class="o">(</span><span class="nb">This is used for efficiency in the implementation of {</span><span class="nv">\tt</span>
</div><div id="l399" class="code_block"><span class="nb">    load</span><span class="nv">\_</span><span class="nb">dync</span><span class="o">/</span><span class="m">1</span><span class="nb">}</span><span class="o">)</span><span class="nb">.  Otherwise {</span><span class="nv">\tt</span><span class="nb"> Psc} is set to </span><span class="m">0</span><span class="nb">.  To initialize</span>
</div><div id="l400" class="code_block"><span class="nb">    its previous psc value to zero, this predicate can be called with</span>
</div><div id="l401" class="code_block"><span class="nb">    {</span><span class="nv">\tt</span><span class="nb"> FileDes} of </span><span class="o">-</span><span class="m">1000</span><span class="nb">.</span>
</div><div id="l402" class="code_block">
</div><div id="l403" class="code_block"><span class="nv">\ournewitem</span><span class="nb">{file</span><span class="nv">\_</span><span class="nb">open</span><span class="o">(+</span><span class="nb">FileName,</span><span class="o">+</span><span class="nb">Mode,</span><span class="o">-</span><span class="nb">FileDes</span><span class="o">)</span><span class="nb">}{machine}</span>
</div><div id="l404" class="code_block"><span class="nv">\index</span><span class="nb">{{</span><span class="nv">\tt</span><span class="nb"> file</span><span class="nv">\_</span><span class="nb">open</span><span class="o">/</span><span class="m">3</span><span class="nb">}}</span>
</div><div id="l405" class="code_block"><span class="nb">    Opens a file with name {</span><span class="nv">\tt</span><span class="nb"> FileName} to be accessed in mode {</span><span class="nv">\tt</span>
</div><div id="l406" class="code_block"><span class="nb">    Mode} and returns a file</span><span class="o">-</span><span class="nb">descriptor in {</span><span class="nv">\tt</span><span class="nb"> FileDes} that can be</span>
</div><div id="l407" class="code_block"><span class="nb">    used to access the file.  If {</span><span class="nv">\tt</span><span class="nb"> Mode} is </span><span class="m">0</span><span class="nb">, the the file is</span>
</div><div id="l408" class="code_block"><span class="nb">    opened for reading; if it is </span><span class="m">1</span><span class="nb">, the file is opened for writing; if</span>
</div><div id="l409" class="code_block"><span class="nb">    it is </span><span class="m">2</span><span class="nb">, the file is opened for appending.  If {</span><span class="nv">\tt</span><span class="nb"> Mode} is </span><span class="m">3</span><span class="nb">,</span>
</div><div id="l410" class="code_block"><span class="nb">    then the string making up the atom {</span><span class="nv">\tt</span><span class="nb"> FileName} is treated as</span>
</div><div id="l411" class="code_block"><span class="nb">    the contents of the file, and a descriptor is returned that allows</span>
</div><div id="l412" class="code_block"><span class="nb">    ``file&#39;&#39; access to that string.  This is how one can use</span>
</div><div id="l413" class="code_block"><span class="nb">    </span><span class="nv">\ourprolog</span><span class="nb"> &#39;s term I</span><span class="o">/</span><span class="nb">O routines to build terms from atoms.</span>
</div><div id="l414" class="code_block">
</div><div id="l415" class="code_block"><span class="nv">\ournewitem</span><span class="nb">{file</span><span class="nv">\_</span><span class="nb">close</span><span class="o">(+</span><span class="nb">FileDes</span><span class="o">)</span><span class="nb">}{machine}</span><span class="nv">\index</span><span class="nb">{{</span><span class="nv">\tt</span><span class="nb"> file</span><span class="nv">\_</span><span class="nb">close</span><span class="o">/</span><span class="m">1</span><span class="nb">}}</span>
</div><div id="l416" class="code_block"><span class="nb">    Closes the file </span><span class="o">(</span><span class="nb">or string</span><span class="o">)</span><span class="nb"> for descriptor {</span><span class="nv">\tt</span><span class="nb"> FileDes}.</span>
</div><div id="l417" class="code_block">
</div><div id="l418" class="code_block"><span class="nv">\ournewitem</span><span class="nb">{file</span><span class="nv">\_</span><span class="nb">read</span><span class="o">(+</span><span class="nb">FileDes,</span><span class="o">-</span><span class="nb">Term</span><span class="o">)</span><span class="nb">}{xsb</span><span class="nv">\_</span><span class="nb">read}</span>
</div><div id="l419" class="code_block"><span class="nv">\index</span><span class="nb">{{</span><span class="nv">\tt</span><span class="nb"> file</span><span class="nv">\_</span><span class="nb">read</span><span class="o">/</span><span class="m">2</span><span class="nb">}}</span>
</div><div id="l420" class="code_block"><span class="nb">    Reads a term from the file </span><span class="o">(</span><span class="nb">or string</span><span class="o">)</span><span class="nb"> with descriptor {</span><span class="nv">\tt</span>
</div><div id="l421" class="code_block"><span class="nb">    FileDes} into {</span><span class="nv">\tt</span><span class="nb"> Term}.  Note that the term must be terminated</span>
</div><div id="l422" class="code_block"><span class="nb">    with a period </span><span class="o">(</span><span class="nb">.</span><span class="o">)</span><span class="nb"> </span><span class="o">(</span><span class="nb">whether it appears in a file or in a string.</span><span class="o">)</span>
</div><div id="l423" class="code_block">
</div><div id="l424" class="code_block"><span class="nv">\ournewitem</span><span class="nb">{file</span><span class="nv">\_</span><span class="nb">read</span><span class="o">(+</span><span class="nb">FileDes,</span><span class="o">-</span><span class="nb">Term,</span><span class="o">-</span><span class="nb">Vars</span><span class="o">)</span><span class="nb">}{xsb</span><span class="nv">\_</span><span class="nb">read}</span>
</div><div id="l425" class="code_block"><span class="nv">\index</span><span class="nb">{{</span><span class="nv">\tt</span><span class="nb"> file</span><span class="nv">\_</span><span class="nb">read</span><span class="o">/</span><span class="m">3</span><span class="nb">}}</span>
</div><div id="l426" class="code_block"><span class="nb">    Reads a term from the file </span><span class="o">(</span><span class="nb">or string</span><span class="o">)</span><span class="nb"> with descriptor {</span><span class="nv">\tt</span>
</div><div id="l427" class="code_block"><span class="nb">    FileDes} into {</span><span class="nv">\tt</span><span class="nb"> Term}, and returns in {</span><span class="nv">\tt</span><span class="nb"> Vars} an open</span><span class="o">-</span><span class="nb">tailed list of</span>
</div><div id="l428" class="code_block"><span class="nb">    pairs of names of variables and the variables themselves that</span>
</div><div id="l429" class="code_block"><span class="nb">    appear in Term.  For example, reading a term {</span><span class="nv">\tt</span><span class="nb"> f</span><span class="o">(</span><span class="nb">a,X,Y,X</span><span class="o">)</span><span class="nb">}</span>
</div><div id="l430" class="code_block"><span class="nb">    would result in {</span><span class="nv">\tt</span><span class="nb"> term} being bound to {</span><span class="nv">\tt</span>
</div><div id="l431" class="code_block"><span class="nb">    f</span><span class="o">(</span><span class="nb">a,</span><span class="nv">\_</span><span class="m">25</span><span class="nb">,</span><span class="nv">\_</span><span class="m">26</span><span class="nb">,</span><span class="nv">\_</span><span class="m">25</span><span class="o">)</span><span class="nb">} </span><span class="o">(</span><span class="nb">for some internal variables</span><span class="o">)</span><span class="nb"> and {</span><span class="nv">\tt</span><span class="nb"> Vars}</span>
</div><div id="l432" class="code_block"><span class="nb">    being bound to {</span><span class="o">[</span><span class="nb">vv</span><span class="o">(</span><span class="nb">&#39;X&#39;,</span><span class="nv">\_</span><span class="m">25</span><span class="o">)</span><span class="nb">,vv</span><span class="o">(</span><span class="nb">&#39;Y&#39;,</span><span class="nv">\_</span><span class="m">26</span><span class="o">)</span><span class="nb">|</span><span class="nv">\_</span><span class="m">83</span><span class="o">]</span><span class="nb">}.  Note that the</span>
</div><div id="l433" class="code_block"><span class="nb">    pairing functor symbol is {</span><span class="nv">\tt</span><span class="nb"> vv</span><span class="o">/</span><span class="m">2</span><span class="nb">} and it must be imported from</span>
</div><div id="l434" class="code_block"><span class="nb">    {</span><span class="nv">\tt</span><span class="nb"> xsb</span><span class="nv">\_</span><span class="nb">read} along with this read predicate.  Also note that </span>
</div><div id="l435" class="code_block"><span class="nb">    {</span><span class="nv">\tt</span><span class="nb"> Vars} is not a proper list, but has a free variable instead </span>
</div><div id="l436" class="code_block"><span class="nb">    of </span><span class="o">[]</span><span class="nb"> at its end.</span>
</div><div id="l437" class="code_block">
</div><div id="l438" class="code_block"><span class="nv">\end</span><span class="nb">{description}</span>
</div><div id="l439" class="code_block">
</div><div id="l440" class="code_block"><span class="nv">\section</span><span class="nb">{Script Writing Utilities}</span>
</div><div id="l441" class="code_block"><span class="c">%========================</span>
</div><div id="l442" class="code_block">
</div><div id="l443" class="code_block"><span class="nb">Prolog, </span><span class="o">(</span><span class="nb">or XSB</span><span class="o">)</span><span class="nb"> can be useful for writing scripts in a UNIX system.</span>
</div><div id="l444" class="code_block"><span class="nb">Prolog&#39;s simple syntax and declarative semantics make it especially</span>
</div><div id="l445" class="code_block"><span class="nb">suitable for scripts that involve text processing.  The following</span>
</div><div id="l446" class="code_block"><span class="nb">library functions are intended to be used on UNIX</span><span class="o">-</span><span class="nb">based platforms.</span>
</div><div id="l447" class="code_block"><span class="nb">Furthermore, they are new to Version </span><span class="m">1</span><span class="nb">.</span><span class="m">7</span><span class="nb"> and should be considered to</span>
</div><div id="l448" class="code_block"><span class="nb">be in the Beta test stage.</span>
</div><div id="l449" class="code_block">
</div><div id="l450" class="code_block"><span class="nv">\begin</span><span class="nb">{description}</span>
</div><div id="l451" class="code_block"><span class="nv">\ournewitem</span><span class="nb">{date</span><span class="o">(</span><span class="nb">?Date</span><span class="o">)</span><span class="nb">}{scrptutl}</span>
</div><div id="l452" class="code_block"><span class="nv">\index</span><span class="nb">{{</span><span class="nv">\tt</span><span class="nb"> date</span><span class="o">/</span><span class="m">1</span><span class="nb">}}</span>
</div><div id="l453" class="code_block"><span class="nb">	Unifies {</span><span class="nv">\tt</span><span class="nb"> Date} to the current date, returned as a Prolog</span>
</div><div id="l454" class="code_block"><span class="nb">term, suitable for term comparison.</span>
</div><div id="l455" class="code_block">
</div><div id="l456" class="code_block"><span class="nb">Example:</span>
</div><div id="l457" class="code_block"><span class="nb">{</span><span class="nv">\footnotesize</span>
</div><div id="l458" class="code_block"><span class="nv">\begin</span><span class="nb">{verbatim}</span>
</div><div id="l459" class="code_block"><span class="nb">                &gt; date </span>
</div><div id="l460" class="code_block"><span class="nb">                Thu Feb </span><span class="m">20</span><span class="nb"> </span><span class="m">08</span><span class="nb">:</span><span class="m">46</span><span class="nb">:</span><span class="m">08</span><span class="nb"> EST </span><span class="m">1997</span>
</div><div id="l461" class="code_block"><span class="nb">                &gt; xsb </span><span class="o">-</span><span class="nb">i</span>
</div><div id="l462" class="code_block"><span class="nb">               XSB Version </span><span class="m">1</span><span class="nb">.</span><span class="m">7</span>
</div><div id="l463" class="code_block"><span class="nb">               </span><span class="o">[</span><span class="nb">sequential, single word, optimal mode</span><span class="o">]</span>
</div><div id="l464" class="code_block"><span class="nb">               | ?</span><span class="o">-</span><span class="nb"> </span><span class="o">[</span><span class="nb">scrptutl</span><span class="o">]</span><span class="nb">.</span>
</div><div id="l465" class="code_block"><span class="nb">               </span><span class="o">[</span><span class="nb">scrptutl loaded</span><span class="o">]</span>
</div><div id="l466" class="code_block">
</div><div id="l467" class="code_block"><span class="nb">               yes</span>
</div><div id="l468" class="code_block"><span class="nb">               | ?</span><span class="o">-</span><span class="nb"> date</span><span class="o">(</span><span class="nb">D</span><span class="o">)</span><span class="nb">.</span>
</div><div id="l469" class="code_block"><span class="nb">               D </span><span class="o">=</span><span class="nb"> date</span><span class="o">(</span><span class="m">1997</span><span class="nb">,</span><span class="m">1</span><span class="nb">,</span><span class="m">20</span><span class="nb">,</span><span class="m">8</span><span class="nb">,</span><span class="m">47</span><span class="nb">,</span><span class="m">41</span><span class="o">)</span>
</div><div id="l470" class="code_block">
</div><div id="l471" class="code_block"><span class="nb">               yes</span>
</div><div id="l472" class="code_block"><span class="nv">\end</span><span class="nb">{verbatim}}</span>
</div><div id="l473" class="code_block">
</div><div id="l474" class="code_block"><span class="nv">\ournewitem</span><span class="nb">{file</span><span class="nv">\_</span><span class="nb">time</span><span class="o">(+</span><span class="nb">FileName, </span><span class="o">-</span><span class="nb">time</span><span class="o">(</span><span class="nb">Time</span><span class="m">1</span><span class="nb">,Time</span><span class="m">2</span><span class="o">))</span><span class="nb">}{machine}</span>
</div><div id="l475" class="code_block"><span class="nv">\index</span><span class="nb">{{</span><span class="nv">\tt</span><span class="nb"> file</span><span class="nv">\_</span><span class="nb">time</span><span class="o">/</span><span class="m">2</span><span class="nb">}}</span>
</div><div id="l476" class="code_block">
</div><div id="l477" class="code_block"><span class="nb">Returns file&#39;s modification time. Because </span>
</div><div id="l478" class="code_block"><span class="nb">XSB steals </span><span class="m">5</span><span class="nb"> bits from each word, time must be returned as two words:</span>
</div><div id="l479" class="code_block"><span class="nb">Time</span><span class="m">1</span><span class="nb">, representing the most significant digits, and Time</span><span class="m">2</span><span class="nb">, representing</span>
</div><div id="l480" class="code_block"><span class="nb">the less significant digits.</span>
</div><div id="l481" class="code_block">
</div><div id="l482" class="code_block"><span class="nv">\ournewitem</span><span class="nb">{directory</span><span class="o">(+</span><span class="nb">Path,?Directory</span><span class="o">)</span><span class="nb">}{directry}</span>
</div><div id="l483" class="code_block"><span class="nv">\index</span><span class="nb">{{</span><span class="nv">\tt</span><span class="nb"> directory</span><span class="o">/</span><span class="m">2</span><span class="nb">}}</span>
</div><div id="l484" class="code_block">
</div><div id="l485" class="code_block"><span class="nb">	Unifies {</span><span class="nv">\tt</span><span class="nb"> Directory} with a list of files in the directory</span>
</div><div id="l486" class="code_block"><span class="nb">specified by path.  Information about the files is similar to that</span>
</div><div id="l487" class="code_block"><span class="nb">obtained by {</span><span class="nv">\tt</span><span class="nb"> ls </span><span class="o">-</span><span class="nb">l}, but transformed for ease of processing.</span>
</div><div id="l488" class="code_block">
</div><div id="l489" class="code_block"><span class="nv">\ournewitem</span><span class="nb">{fget</span><span class="nv">\_</span><span class="nb">line</span><span class="o">(+</span><span class="nb">Str,?Inlist,?Next</span><span class="o">)</span><span class="nb">}{scrptutl}</span>
</div><div id="l490" class="code_block"><span class="nv">\index</span><span class="nb">{{</span><span class="nv">\tt</span><span class="nb"> fget</span><span class="nv">\_</span><span class="nb">line</span><span class="o">/</span><span class="m">3</span><span class="nb">}}</span>
</div><div id="l491" class="code_block">
</div><div id="l492" class="code_block"><span class="nb">{</span><span class="nv">\tt</span><span class="nb"> fget</span><span class="nv">\_</span><span class="nb">line</span><span class="o">/</span><span class="m">3</span><span class="nb">} reads one line from the input stream {</span><span class="nv">\tt</span><span class="nb"> Str} and</span>
</div><div id="l493" class="code_block"><span class="nb">unifies {</span><span class="nv">\tt</span><span class="nb"> Inlist} to the list of ASCII integers representing the</span>
</div><div id="l494" class="code_block"><span class="nb">characters in the line, and {</span><span class="nv">\tt</span><span class="nb"> Next} to the line terminator, either</span>
</div><div id="l495" class="code_block"><span class="nb">a newline </span><span class="o">(</span><span class="nb">{</span><span class="nv">\tt</span><span class="nb"> </span><span class="m">10</span><span class="nb">}</span><span class="o">)</span><span class="nb"> or EOF </span><span class="o">(</span><span class="nb">{</span><span class="nv">\tt</span><span class="o">-</span><span class="m">1</span><span class="nb">}</span><span class="o">)</span><span class="nb">.</span>
</div><div id="l496" class="code_block">
</div><div id="l497" class="code_block"><span class="nv">\ournewitem</span><span class="nb">{file</span><span class="nv">\_</span><span class="nb">read</span><span class="nv">\_</span><span class="nb">line</span><span class="o">(+</span><span class="nb">FileDes,</span><span class="o">-</span><span class="nb">String,</span><span class="o">-</span><span class="nb">IsFullLine</span><span class="o">)</span><span class="nb">}{machine}</span>
</div><div id="l498" class="code_block"><span class="nv">\index</span><span class="nb">{{</span><span class="nv">\tt</span><span class="nb"> file</span><span class="nv">\_</span><span class="nb">read</span><span class="nv">\_</span><span class="nb">line</span><span class="o">/</span><span class="m">3</span><span class="nb">}}</span>
</div><div id="l499" class="code_block"><span class="nv">\index</span><span class="nb">{{</span><span class="nv">\tt</span><span class="nb"> intern</span><span class="nv">\_</span><span class="nb">string</span><span class="o">/</span><span class="m">2</span><span class="nb">}}</span>
</div><div id="l500" class="code_block"><span class="nb">    This is a low</span><span class="o">-</span><span class="nb">level predicate that allows XSB to read input files</span>
</div><div id="l501" class="code_block"><span class="nb">    efficiently, line by line. It returns the string read from {</span><span class="nv">\tt</span>
</div><div id="l502" class="code_block"><span class="nb">      FileDes} using the variable {</span><span class="nv">\tt</span><span class="nb"> String}. The output variable {</span><span class="nv">\tt</span>
</div><div id="l503" class="code_block"><span class="nb">      IsFullLine} is </span><span class="m">1</span><span class="nb">, if the line read contains the newline character at</span>
</div><div id="l504" class="code_block"><span class="nb">    the end. Otherwise, it is </span><span class="m">0</span><span class="nb">. This latter case arises in two situations:</span>
</div><div id="l505" class="code_block"><span class="nb">    when the last line in the stream does not have a newline  character or</span>
</div><div id="l506" class="code_block"><span class="nb">    when the line is very long, longer than the buffer allocated for that</span>
</div><div id="l507" class="code_block"><span class="nb">    purpose. </span><span class="o">(</span><span class="nb">In such a case {</span><span class="nv">\tt</span><span class="nb"> file</span><span class="nv">\_</span><span class="nb">read</span><span class="nv">\_</span><span class="nb">line</span><span class="o">/</span><span class="m">3</span><span class="nb">} will read only as</span>
</div><div id="l508" class="code_block"><span class="nb">    much as the buffer allows.</span><span class="o">)</span><span class="nb"> </span>
</div><div id="l509" class="code_block">
</div><div id="l510" class="code_block"><span class="nb">    This predicate fails on reaching the end of file.</span>
</div><div id="l511" class="code_block">
</div><div id="l512" class="code_block"><span class="nb">    This predicate is much more efficient than {{</span><span class="nv">\tt</span><span class="nb"> fget</span><span class="nv">\_</span><span class="nb">line</span><span class="o">/</span><span class="m">3</span><span class="nb">}}, but it</span>
</div><div id="l513" class="code_block"><span class="nb">    is also much more low level </span><span class="o">(</span><span class="nb">see next</span><span class="o">)</span><span class="nb">. Also, there is a difference</span>
</div><div id="l514" class="code_block"><span class="nb">    between {{</span><span class="nv">\tt</span><span class="nb"> fget</span><span class="nv">\_</span><span class="nb">line</span><span class="o">/</span><span class="m">3</span><span class="nb">}} and {</span><span class="nv">\tt</span><span class="nb"> file</span><span class="nv">\_</span><span class="nb">read</span><span class="nv">\_</span><span class="nb">line</span><span class="o">/</span><span class="m">3</span><span class="nb">} in that the</span>
</div><div id="l515" class="code_block"><span class="nb">    former returns strings, while the latter returns lists of ASCII</span>
</div><div id="l516" class="code_block"><span class="nb">    characters.</span>
</div><div id="l517" class="code_block"><span class="nb">    </span>
</div><div id="l518" class="code_block"><span class="nb">    {</span><span class="nv">\bf</span><span class="nb"> Important}: {</span><span class="nv">\tt</span><span class="nb"> file</span><span class="nv">\_</span><span class="nb">read</span><span class="nv">\_</span><span class="nb">line</span><span class="o">/</span><span class="m">3</span><span class="nb">} does </span><span class="nv">\underline</span><span class="nb">{not} intern</span>
</div><div id="l519" class="code_block"><span class="nb">    the strings it reads from the input file. This is done for efficiency</span>
</div><div id="l520" class="code_block"><span class="nb">    reasons </span><span class="o">(</span><span class="nb">it is designed to be a low</span><span class="o">-</span><span class="nb">level I</span><span class="o">/</span><span class="nb">O predicate</span><span class="o">)</span><span class="nb">.  In</span>
</div><div id="l521" class="code_block"><span class="nb">    particular, this means you cannot compare these strings to normal</span>
</div><div id="l522" class="code_block"><span class="nb">    </span><span class="o">(</span><span class="nb">interned</span><span class="o">)</span><span class="nb"> XSB strings. If interning is necessary, this should be done</span>
</div><div id="l523" class="code_block"><span class="nb">    explicitly. For instance, {</span><span class="nv">\tt</span><span class="nb"> intern</span><span class="nv">\_</span><span class="nb">string</span><span class="o">(</span><span class="nb">Uninterned, Interned</span><span class="o">)</span><span class="nb">}</span>
</div><div id="l524" class="code_block"><span class="nb">    converts an uninterned string into an interned one.</span>
</div><div id="l525" class="code_block">
</div><div id="l526" class="code_block"><span class="nv">\ournewitem</span><span class="nb">{expand</span><span class="nv">\_</span><span class="nb">filename</span><span class="o">(+</span><span class="nb">FileName,</span><span class="o">-</span><span class="nb">ExpandedName</span><span class="o">)</span><span class="nb">}{machine}</span>
</div><div id="l527" class="code_block"><span class="nv">\index</span><span class="nb">{{</span><span class="nv">\tt</span><span class="nb"> expand</span><span class="nv">\_</span><span class="nb">filename</span><span class="o">/</span><span class="m">2</span><span class="nb">}}</span>
</div><div id="l528" class="code_block"><span class="nb">Expands the file name passed as the first argument and binds the variable</span>
</div><div id="l529" class="code_block"><span class="nb">in the second argument to the expanded name. This includes expanding Unix</span>
</div><div id="l530" class="code_block"><span class="nb">tildas, prepending the current directory, etc. In addition, the expanded</span>
</div><div id="l531" class="code_block"><span class="nb">file name is ``rectified&#39;&#39; so that multiple repeated slashes are replaced</span>
</div><div id="l532" class="code_block"><span class="nb">with a single slash, the intervening ``.</span><span class="o">/</span><span class="nb">&#39;&#39; are removed, and ``..</span><span class="o">/</span><span class="nb">&#39;&#39; are</span>
</div><div id="l533" class="code_block"><span class="nb">applied so that the preceding item in the path name is deleted. For</span>
</div><div id="l534" class="code_block"><span class="nb">instance, if the current directory is {</span><span class="nv">\tt</span><span class="nb"> </span><span class="o">/</span><span class="nb">home}, then {</span><span class="nv">\tt</span>
</div><div id="l535" class="code_block"><span class="nb">  abc</span><span class="o">//</span><span class="nb">cde</span><span class="o">/</span><span class="nb">..</span><span class="o">///</span><span class="nb">ff</span><span class="o">/</span><span class="nb">.</span><span class="o">/</span><span class="nb">b} will be converted into {</span><span class="nv">\tt</span><span class="nb"> </span><span class="o">/</span><span class="nb">home</span><span class="o">/</span><span class="nb">abc</span><span class="o">/</span><span class="nb">ff</span><span class="o">/</span><span class="nb">b}.</span>
</div><div id="l536" class="code_block">
</div><div id="l537" class="code_block"><span class="nb">Under NT and DOS, this predicates does rectification </span><span class="o">(</span><span class="nb">using backslashes</span>
</div><div id="l538" class="code_block"><span class="nb">when appropriate</span><span class="o">)</span><span class="nb">, but it does not expand the tildas.</span>
</div><div id="l539" class="code_block">
</div><div id="l540" class="code_block"><span class="nv">\ournewitem</span><span class="nb">{tilde</span><span class="nv">\_</span><span class="nb">expand</span><span class="nv">\_</span><span class="nb">filename</span><span class="o">(+</span><span class="nb">FileName,</span><span class="o">-</span><span class="nb">ExpandedName</span><span class="o">)</span><span class="nb">}{machine}</span>
</div><div id="l541" class="code_block"><span class="nv">\index</span><span class="nb">{{</span><span class="nv">\tt</span><span class="nb"> tilde</span><span class="nv">\_</span><span class="nb">expand</span><span class="nv">\_</span><span class="nb">filename</span><span class="o">/</span><span class="m">2</span><span class="nb">}}</span>
</div><div id="l542" class="code_block"><span class="nb">Like {</span><span class="nv">\tt</span><span class="nb"> expand</span><span class="nv">\_</span><span class="nb">filename</span><span class="o">/</span><span class="m">2</span><span class="nb">}, but only expands tildas and does</span>
</div><div id="l543" class="code_block"><span class="nb">rectification. This does not prepend the current working directory to</span>
</div><div id="l544" class="code_block"><span class="nb">relative file names.</span>
</div><div id="l545" class="code_block">
</div><div id="l546" class="code_block"><span class="nv">\ournewitem</span><span class="nb">{is</span><span class="nv">\_</span><span class="nb">absolute</span><span class="nv">\_</span><span class="nb">filename</span><span class="o">(+</span><span class="nb">FileName</span><span class="o">)</span><span class="nb">}{machine}</span>
</div><div id="l547" class="code_block"><span class="nv">\index</span><span class="nb">{{</span><span class="nv">\tt</span><span class="nb"> is</span><span class="nv">\_</span><span class="nb">absolute</span><span class="nv">\_</span><span class="nb">filename</span><span class="o">/</span><span class="m">1</span><span class="nb">}}</span>
</div><div id="l548" class="code_block"><span class="nb">Succeeds, if file name is absolute; fails otherwise.</span>
</div><div id="l549" class="code_block"><span class="nb">This predicate works also under NT and DOS, {</span><span class="nv">\it</span><span class="nb"> i.e.}, it recognizes drive</span>
</div><div id="l550" class="code_block"><span class="nb">letters, etc.</span>
</div><div id="l551" class="code_block">
</div><div id="l552" class="code_block"><span class="nv">\ournewitem</span><span class="nb">{parse</span><span class="nv">\_</span><span class="nb">filename</span><span class="o">(+</span><span class="nb">FileName,</span><span class="o">-</span><span class="nb">Dir,</span><span class="o">-</span><span class="nb">Base,</span><span class="o">-</span><span class="nb">Extension</span><span class="o">)</span><span class="nb">}{machine}</span>
</div><div id="l553" class="code_block"><span class="nv">\index</span><span class="nb">{{</span><span class="nv">\tt</span><span class="nb"> parse</span><span class="nv">\_</span><span class="nb">filename</span><span class="o">/</span><span class="m">4</span><span class="nb">}}</span>
</div><div id="l554" class="code_block"><span class="nb">This predicate parses file names by separating the directory part, the base</span>
</div><div id="l555" class="code_block"><span class="nb">name part, and file extension. If file extension is found, it is removed</span>
</div><div id="l556" class="code_block"><span class="nb">from the base name. Also, directory names are rectified and if a directory</span>
</div><div id="l557" class="code_block"><span class="nb">name starts with a tilde </span><span class="o">(</span><span class="nb">in Unix</span><span class="o">)</span><span class="nb">, then it is expanded. Directory names</span>
</div><div id="l558" class="code_block"><span class="nb">always end with a slash or a backslash, as appropriate for the OS at hand.</span>
</div><div id="l559" class="code_block">
</div><div id="l560" class="code_block"><span class="nb">For instance, {</span><span class="nv">\tt</span><span class="nb"> </span><span class="s">$</span><span class="k">\sim</span><span class="s">$</span><span class="nb">john</span><span class="o">///</span><span class="nb">doe</span><span class="o">/</span><span class="nb">dir</span><span class="m">1</span><span class="o">//</span><span class="nb">..</span><span class="o">/</span><span class="nb">foo.bar} will be parsed into:</span>
</div><div id="l561" class="code_block"><span class="nb">{</span><span class="nv">\tt</span><span class="nb"> </span><span class="o">/</span><span class="nb">home</span><span class="o">/</span><span class="nb">john</span><span class="o">/</span><span class="nb">doe</span><span class="o">/</span><span class="nb">}, {</span><span class="nv">\tt</span><span class="nb"> foo}, and {</span><span class="nv">\tt</span><span class="nb"> bar} </span><span class="o">(</span><span class="nb">where we assume that    </span>
</div><div id="l562" class="code_block"><span class="nb">{</span><span class="nv">\tt</span><span class="nb"> </span><span class="o">/</span><span class="nb">home</span><span class="o">/</span><span class="nb">john} is what {</span><span class="nv">\tt</span><span class="nb"> </span><span class="s">$</span><span class="k">\sim</span><span class="s">$</span><span class="nb">john} expands into</span><span class="o">)</span><span class="nb">.  </span>
</div><div id="l563" class="code_block">
</div><div id="l564" class="code_block">
</div><div id="l565" class="code_block"><span class="nv">\ournewitem</span><span class="nb">{sysin</span><span class="o">(+</span><span class="nb">Command,?Output</span><span class="o">)</span><span class="nb">}{scrptutl}</span>
</div><div id="l566" class="code_block"><span class="nv">\index</span><span class="nb">{{</span><span class="nv">\tt</span><span class="nb"> sysin</span><span class="o">/</span><span class="m">2</span><span class="nb">}}</span>
</div><div id="l567" class="code_block">
</div><div id="l568" class="code_block"><span class="nb">	Unifies {</span><span class="nv">\tt</span><span class="nb"> Output} with the stdout of {</span><span class="nv">\tt</span><span class="nb"> Command}</span>
</div><div id="l569" class="code_block"><span class="nb">represented as a list of lists of tokens, where each element in the</span>
</div><div id="l570" class="code_block"><span class="nb">outer list of {</span><span class="nv">\tt</span><span class="nb"> Command} represents a line of stdout.</span>
</div><div id="l571" class="code_block">
</div><div id="l572" class="code_block"><span class="nb">Example:</span>
</div><div id="l573" class="code_block"><span class="nb">{</span><span class="nv">\footnotesize</span>
</div><div id="l574" class="code_block"><span class="nv">\begin</span><span class="nb">{verbatim}</span>
</div><div id="l575" class="code_block"><span class="nb">                &gt; uname </span><span class="o">-</span><span class="nb">a</span>
</div><div id="l576" class="code_block"><span class="nb">                Linux swiftlap </span><span class="m">1</span><span class="nb">.</span><span class="m">2</span><span class="nb">.</span><span class="m">8</span><span class="nb"> #</span><span class="m">1</span><span class="nb"> Sun May </span><span class="m">7</span><span class="nb"> </span><span class="m">13</span><span class="nb">:</span><span class="m">10</span><span class="nb">:</span><span class="m">10</span><span class="nb"> CDT </span><span class="m">1995</span><span class="nb"> i</span><span class="m">486</span>
</div><div id="l577" class="code_block"><span class="nb">                | ?</span><span class="o">-</span><span class="nb"> sysin</span><span class="o">(</span><span class="nb">&#39;uname </span><span class="o">-</span><span class="nb">a&#39;,Output</span><span class="o">)</span><span class="nb">.</span>
</div><div id="l578" class="code_block">
</div><div id="l579" class="code_block"><span class="nb">                Output </span><span class="o">=</span><span class="nb"> </span><span class="o">[[</span><span class="nb">Linux,swiftlap,</span><span class="m">1</span><span class="nb">.</span><span class="m">2</span><span class="nb">.</span><span class="m">8</span><span class="nb">,#</span><span class="m">1</span><span class="nb">,Sun,May,</span><span class="m">7</span><span class="nb">,</span><span class="m">13</span><span class="nb">:</span><span class="m">10</span><span class="nb">:</span><span class="m">10</span><span class="nb">,CDT,</span><span class="m">1995</span><span class="nb">,i</span><span class="m">486</span><span class="o">]]</span>
</div><div id="l580" class="code_block">
</div><div id="l581" class="code_block"><span class="nb">                yes</span>
</div><div id="l582" class="code_block"><span class="nv">\end</span><span class="nb">{verbatim}}</span>
</div><div id="l583" class="code_block">
</div><div id="l584" class="code_block"><span class="nv">\end</span><span class="nb">{description}</span>
</div><div id="l585" class="code_block">
</div><div id="l586" class="code_block"><span class="nv">\comment</span><span class="nb">{</span>
</div><div id="l587" class="code_block">
</div><div id="l588" class="code_block"><span class="nb">TLS </span><span class="o">---</span><span class="nb"> Im not quite sure that the sockets are ready for prime time.</span>
</div><div id="l589" class="code_block">
</div><div id="l590" class="code_block"><span class="nv">\section</span><span class="nb">{The Socket Library}</span>
</div><div id="l591" class="code_block">
</div><div id="l592" class="code_block"><span class="nb">As a convenience, XSB provides access to sockets through the following</span>
</div><div id="l593" class="code_block"><span class="nb">routines.  Currently only the domain {</span><span class="nv">\tt</span><span class="nb"> AF</span><span class="nv">\_</span><span class="nb">INET} is supported.</span>
</div><div id="l594" class="code_block">
</div><div id="l595" class="code_block"><span class="nv">\begin</span><span class="nb">{description}</span>
</div><div id="l596" class="code_block"><span class="nv">\ournewitem</span><span class="nb">{socket</span><span class="o">(-</span><span class="nb">Socket</span><span class="nv">\_</span><span class="nb">fd</span><span class="o">)</span><span class="nb">}{socket}</span>
</div><div id="l597" class="code_block">
</div><div id="l598" class="code_block"><span class="nv">\ournewitem</span><span class="nb">{socket</span><span class="nv">\_</span><span class="nb">request</span><span class="o">(+</span><span class="nb">Socket</span><span class="nv">\_</span><span class="nb">fd,</span><span class="o">+</span><span class="nb">Port,</span><span class="o">+</span><span class="nb">Hostname,</span><span class="o">+</span><span class="nb">Sockfptr</span><span class="o">)</span><span class="nb">}{socket}</span>
</div><div id="l599" class="code_block">
</div><div id="l600" class="code_block">
</div><div id="l601" class="code_block">
</div><div id="l602" class="code_block"><span class="nv">\ournewitem</span><span class="nb">{socket</span><span class="nv">\_</span><span class="nb">bind</span><span class="o">(+</span><span class="nb">Socket</span><span class="nv">\_</span><span class="nb">fd,</span><span class="o">+</span><span class="nb">Port</span><span class="o">)</span><span class="nb">}{socket}</span>
</div><div id="l603" class="code_block">
</div><div id="l604" class="code_block"><span class="nv">\ournewitem</span><span class="nb">{socket</span><span class="nv">\_</span><span class="nb">listen</span><span class="o">(+</span><span class="nb">Socket</span><span class="nv">\_</span><span class="nb">fd,</span><span class="o">+</span><span class="nb">Length</span><span class="o">)</span><span class="nb">}{socket}</span>
</div><div id="l605" class="code_block">
</div><div id="l606" class="code_block"><span class="nv">\ournewitem</span><span class="nb">{socket</span><span class="nv">\_</span><span class="nb">accept</span><span class="o">(+</span><span class="nb">Socket</span><span class="nv">\_</span><span class="nb">fd,Sockfptr</span><span class="o">)</span><span class="nb">}{socket}</span>
</div><div id="l607" class="code_block">
</div><div id="l608" class="code_block"><span class="nv">\ournewitem</span><span class="nb">{socket</span><span class="nv">\_</span><span class="nb">connect</span><span class="o">(+</span><span class="nb">Socket</span><span class="nv">\_</span><span class="nb">fd,Port,Hostname,Sockfptr</span><span class="o">)</span><span class="nb">}{socket}</span>
</div><div id="l609" class="code_block">
</div><div id="l610" class="code_block"><span class="nv">\ournewitem</span><span class="nb">{socket</span><span class="nv">\_</span><span class="nb">flush</span><span class="o">(+</span><span class="nb">Socket</span><span class="nv">\_</span><span class="nb">fd</span><span class="o">)</span><span class="nb">}{socket}</span>
</div><div id="l611" class="code_block">
</div><div id="l612" class="code_block"><span class="nv">\ournewitem</span><span class="nb">{socket</span><span class="nv">\_</span><span class="nb">close</span><span class="o">(+</span><span class="nb">Socket</span><span class="nv">\_</span><span class="nb">fd</span><span class="o">)</span><span class="nb">}{socket}</span>
</div><div id="l613" class="code_block">
</div><div id="l614" class="code_block"><span class="nv">\end</span><span class="nb">{description}</span>
</div><div id="l615" class="code_block">
</div><div id="l616" class="code_block"><span class="o">(</span><span class="nb">dsw </span><span class="o">-</span><span class="nb"> This is stuff Hasan wrote, wich ought to be formated, cleaned up an dincluded: </span><span class="o">)</span>
</div><div id="l617" class="code_block">
</div><div id="l618" class="code_block"><span class="nb">The following calls can be imported from the ``socket&#39;&#39; library.</span>
</div><div id="l619" class="code_block">
</div><div id="l620" class="code_block"><span class="nb">socket</span><span class="o">(-</span><span class="nb">Sockfd</span><span class="o">)</span><span class="nb"> :</span>
</div><div id="l621" class="code_block"><span class="nb">Creates a new TCP communication end point of type AF_INET. Succeeds with</span>
</div><div id="l622" class="code_block"><span class="nb">binding Sockfd to a small integer called a socket descriptor.</span>
</div><div id="l623" class="code_block">
</div><div id="l624" class="code_block"><span class="nb">socket_bind</span><span class="o">(+</span><span class="nb">Sockfd, </span><span class="o">+</span><span class="nb">Port</span><span class="o">)</span><span class="nb"> :</span>
</div><div id="l625" class="code_block"><span class="nb">Used for attaching a specific local </span><span class="o">(</span><span class="nb">integer</span><span class="o">)</span><span class="nb"> Port for the socket with</span>
</div><div id="l626" class="code_block"><span class="nb">descriptor Sockfd.</span>
</div><div id="l627" class="code_block">
</div><div id="l628" class="code_block"><span class="nb">socket_listen</span><span class="o">(+</span><span class="nb">Sockfd, </span><span class="o">+</span><span class="nb">QueueLength</span><span class="o">)</span><span class="nb"> :</span>
</div><div id="l629" class="code_block"><span class="nb">Used for announcing willingness to accept connections at the socket identified</span>
</div><div id="l630" class="code_block"><span class="nb">with descriptor Sockfd. The </span><span class="o">(</span><span class="nb">integer</span><span class="o">)</span><span class="nb"> QueueLength sets the length of the queue</span>
</div><div id="l631" class="code_block"><span class="nb">for the incoming connections at this socket.</span>
</div><div id="l632" class="code_block">
</div><div id="l633" class="code_block"><span class="nb">socket_accept</span><span class="o">(+</span><span class="nb">Sockfd, </span><span class="o">-</span><span class="nb">NewSockfd</span><span class="o">)</span><span class="nb"> :</span>
</div><div id="l634" class="code_block"><span class="nb">Block the caller until a connection attempt arrives. If the incoming queue is</span>
</div><div id="l635" class="code_block"><span class="nb">not empty, the first connection request is accepted, the call succeeds and</span>
</div><div id="l636" class="code_block"><span class="nb">binds NewSockfd with a socket descriptor that will be used for this new</span>
</div><div id="l637" class="code_block"><span class="nb">connection.</span>
</div><div id="l638" class="code_block">
</div><div id="l639" class="code_block"><span class="nb">socket_connect</span><span class="o">(+</span><span class="nb">Sockfd, </span><span class="o">+</span><span class="nb">Port, </span><span class="o">+</span><span class="nb">Hostname, </span><span class="o">-</span><span class="nb">Sockfileptr</span><span class="o">)</span><span class="nb"> :</span>
</div><div id="l640" class="code_block"><span class="nb">The caller identifies a server&#39;s IP address in Hostname and port in Port.</span>
</div><div id="l641" class="code_block"><span class="nb">TCP will attempt to establish a connection with the server using local socket</span>
</div><div id="l642" class="code_block"><span class="nb">with descriptor Sockfd. For information about Sockfileptr argument see the</span>
</div><div id="l643" class="code_block"><span class="nb">note below.</span>
</div><div id="l644" class="code_block">
</div><div id="l645" class="code_block"><span class="nb">socket_close</span><span class="o">(+</span><span class="nb">Sockfd</span><span class="o">)</span><span class="nb"> :</span>
</div><div id="l646" class="code_block"><span class="nb">Terminates and closes a connection identified with the descriptor Sockfd.</span>
</div><div id="l647" class="code_block">
</div><div id="l648" class="code_block"><span class="nb">socket_recv</span><span class="o">(+</span><span class="nb">Sockfd, </span><span class="o">-</span><span class="nb">Data</span><span class="o">)</span><span class="nb"> :</span>
</div><div id="l649" class="code_block"><span class="nb">Receives a message from the connection identified with the descriptor Sockfd,</span>
</div><div id="l650" class="code_block"><span class="nb">strips off the special end_of_message symbol ```&#39;&#39; and binds it to variable Data.</span>
</div><div id="l651" class="code_block">
</div><div id="l652" class="code_block"><span class="nb">socket_send</span><span class="o">(+</span><span class="nb">Sockfd, </span><span class="o">+</span><span class="nb">Data</span><span class="o">)</span><span class="nb"> :</span>
</div><div id="l653" class="code_block"><span class="nb">Appends the end_of_message symbol ```&#39;&#39; to the atom Data and sends Data over</span>
</div><div id="l654" class="code_block"><span class="nb">the connection identified with the descriptor Sockfd.</span>
</div><div id="l655" class="code_block">
</div><div id="l656" class="code_block"><span class="nb">socket_send_eof</span><span class="o">(+</span><span class="nb">Sockfd</span><span class="o">)</span><span class="nb"> :</span>
</div><div id="l657" class="code_block"><span class="nb">Sends the special EOF symbol appended with end_of_message symbol ```&#39;&#39; over</span>
</div><div id="l658" class="code_block"><span class="nb">the connection identified with the descriptor Sockfd.</span>
</div><div id="l659" class="code_block">
</div><div id="l660" class="code_block"><span class="nb">socket_send_asci</span><span class="o">(+</span><span class="nb">Sockfd, Code</span><span class="o">)</span><span class="nb"> :</span>
</div><div id="l661" class="code_block"><span class="nb">Send the ascii character with ASCII code Code appended with end_of_message</span>
</div><div id="l662" class="code_block"><span class="nb">symbol ```&#39;&#39;  over the connection identified with the descriptor Sockfd.</span>
</div><div id="l663" class="code_block">
</div><div id="l664" class="code_block">
</div><div id="l665" class="code_block"><span class="nb">Note: </span><span class="o">(</span><span class="nb">UNIX only</span><span class="o">)</span><span class="nb"> file_write_canonical</span><span class="o">(+</span><span class="nb">Sockfileptr, </span><span class="o">+</span><span class="nb">Data</span><span class="o">)</span>
</div><div id="l666" class="code_block"><span class="nb">		  file_read_canonical</span><span class="o">(+</span><span class="nb">Sockfileptr, </span><span class="o">-</span><span class="nb">Data, </span><span class="o">-</span><span class="nb">Psc</span><span class="o">)</span><span class="nb"> </span>
</div><div id="l667" class="code_block"><span class="nb">		  socket_flush</span><span class="o">(+</span><span class="nb">Sockfileptr</span><span class="o">)</span>
</div><div id="l668" class="code_block">
</div><div id="l669" class="code_block"><span class="nb">The above calls can be used for sending</span><span class="o">/</span><span class="nb">flushing and receiving Data over a</span>
</div><div id="l670" class="code_block"><span class="nb">Unix file descriptor Sockfileptr associated with a socket. Sockfileptr can be</span>
</div><div id="l671" class="code_block"><span class="nb">either obtained from the socket_accept</span><span class="o">(+</span><span class="nb">Sockfd, </span><span class="o">-</span><span class="nb">Sockfileptr</span><span class="o">)</span><span class="nb"> in server mode</span>
</div><div id="l672" class="code_block"><span class="nb">or from socket_connect</span><span class="o">(+</span><span class="nb">Sockfd, </span><span class="o">+</span><span class="nb">Port, </span><span class="o">+</span><span class="nb">Hostname, </span><span class="o">-</span><span class="nb">Sockfileptr</span><span class="o">)</span><span class="nb"> in client mode.</span>
</div><div id="l673" class="code_block">
</div><div id="l674" class="code_block"><span class="nb">}</span>
</div><div id="l675" class="code_block">
</div><div id="l676" class="code_block"><span class="nv">\section</span><span class="nb">{Arrays}</span>
</div><div id="l677" class="code_block"><span class="c">%===============</span>
</div><div id="l678" class="code_block">
</div><div id="l679" class="code_block"><span class="nb">The module {</span><span class="nv">\tt</span><span class="nb"> array</span><span class="m">1</span><span class="nb">} in directory {</span><span class="nv">\tt</span><span class="nb"> lib} provides a very simple </span>
</div><div id="l680" class="code_block"><span class="nb">backtrackable array implementation.  The predicates through which the </span>
</div><div id="l681" class="code_block"><span class="nb">array objects are manipulated are:</span>
</div><div id="l682" class="code_block">
</div><div id="l683" class="code_block"><span class="nv">\begin</span><span class="nb">{description}</span>
</div><div id="l684" class="code_block"><span class="nv">\ournewitem</span><span class="nb">{array</span><span class="nv">\_</span><span class="nb">new</span><span class="o">(-</span><span class="nb">Array, </span><span class="o">+</span><span class="nb">Size</span><span class="o">)</span><span class="nb">}{array</span><span class="m">1</span><span class="nb">}</span><span class="nv">\index</span><span class="nb">{{</span><span class="nv">\tt</span><span class="nb"> array</span><span class="nv">\_</span><span class="nb">new</span><span class="o">/</span><span class="m">2</span><span class="nb">}}</span>
</div><div id="l685" class="code_block"><span class="c">%\predindex{array\_new/2~(L)}</span>
</div><div id="l686" class="code_block"><span class="nb">    Creates a one dimensional empty array of size {</span><span class="nv">\tt</span><span class="nb"> Size}.  All the </span>
</div><div id="l687" class="code_block"><span class="nb">    elements of this array are variables.</span>
</div><div id="l688" class="code_block"><span class="nv">\ournewitem</span><span class="nb">{array</span><span class="nv">\_</span><span class="nb">elt</span><span class="o">(+</span><span class="nb">Array, </span><span class="o">+</span><span class="nb">Index, ?Element</span><span class="o">)</span><span class="nb">}{array</span><span class="m">1</span><span class="nb">}</span>
</div><div id="l689" class="code_block"><span class="nv">\index</span><span class="nb">{{</span><span class="nv">\tt</span><span class="nb"> array</span><span class="nv">\_</span><span class="nb">elt</span><span class="o">/</span><span class="m">3</span><span class="nb">}}</span>
</div><div id="l690" class="code_block"><span class="c">%\predindex{array\_elt/3~(L)}</span>
</div><div id="l691" class="code_block"><span class="nb">    True iff {</span><span class="nv">\tt</span><span class="nb"> Element} is the {</span><span class="nv">\tt</span><span class="nb"> Index}</span><span class="o">-</span><span class="nb">th element of array </span>
</div><div id="l692" class="code_block"><span class="nb">    {</span><span class="nv">\tt</span><span class="nb"> Array}.</span>
</div><div id="l693" class="code_block"><span class="nv">\ournewitem</span><span class="nb">{array</span><span class="nv">\_</span><span class="nb">update</span><span class="o">(+</span><span class="nb">Array, </span><span class="o">+</span><span class="nb">Index, </span><span class="o">+</span><span class="nb">Elem, </span><span class="o">-</span><span class="nb">NewArray</span><span class="o">)</span><span class="nb">}{array</span><span class="m">1</span><span class="nb">}</span>
</div><div id="l694" class="code_block"><span class="nv">\index</span><span class="nb">{{</span><span class="nv">\tt</span><span class="nb"> array</span><span class="nv">\_</span><span class="nb">update</span><span class="o">/</span><span class="m">4</span><span class="nb">}}</span>
</div><div id="l695" class="code_block"><span class="c">%\predindex{array\_update/4~(L)}</span>
</div><div id="l696" class="code_block"><span class="nb">    Updates the array {</span><span class="nv">\tt</span><span class="nb"> Array} such that the {</span><span class="nv">\tt</span><span class="nb"> Index}</span><span class="o">-</span><span class="nb">th element</span>
</div><div id="l697" class="code_block"><span class="nb">    of the new array is {</span><span class="nv">\tt</span><span class="nb"> Elem} and returns the new array in </span>
</div><div id="l698" class="code_block"><span class="nb">    {</span><span class="nv">\tt</span><span class="nb"> NewArray}.  The implementation is quite efficient in that it </span>
</div><div id="l699" class="code_block"><span class="nb">    avoids the copying of the entire array.</span>
</div><div id="l700" class="code_block"><span class="nv">\end</span><span class="nb">{description}</span>
</div><div id="l701" class="code_block">
</div><div id="l702" class="code_block"><span class="nb">A small example that shows the use of these predicates is the following:</span>
</div><div id="l703" class="code_block"><span class="nb">{</span><span class="nv">\footnotesize</span>
</div><div id="l704" class="code_block"><span class="nb"> </span><span class="nv">\begin</span><span class="nb">{verbatim}</span>
</div><div id="l705" class="code_block"><span class="nb">           | ?</span><span class="o">-</span><span class="nb"> import </span><span class="o">[</span><span class="nb">array_new</span><span class="o">/</span><span class="m">2</span><span class="nb">, array_elt</span><span class="o">/</span><span class="m">3</span><span class="nb">, array_update</span><span class="o">/</span><span class="m">4</span><span class="o">]</span><span class="nb"> from array</span><span class="m">1</span><span class="nb">.</span>
</div><div id="l706" class="code_block">
</div><div id="l707" class="code_block"><span class="nb">           yes</span>
</div><div id="l708" class="code_block"><span class="nb">           | ?</span><span class="o">-</span><span class="nb"> array_new</span><span class="o">(</span><span class="nb">A, </span><span class="m">4</span><span class="o">)</span><span class="nb">, array_update</span><span class="o">(</span><span class="nb">A,</span><span class="m">1</span><span class="nb">,</span><span class="m">1</span><span class="nb">,B</span><span class="o">)</span><span class="nb">, array_update</span><span class="o">(</span><span class="nb">B,</span><span class="m">2</span><span class="nb">,</span><span class="m">2</span><span class="nb">,C</span><span class="o">)</span><span class="nb">,</span>
</div><div id="l709" class="code_block"><span class="nb">                </span><span class="o">(</span><span class="nb"> array_update</span><span class="o">(</span><span class="nb">C,</span><span class="m">3</span><span class="nb">,</span><span class="m">3</span><span class="nb">,D</span><span class="o">)</span><span class="nb">, array_elt</span><span class="o">(</span><span class="nb">D,</span><span class="m">3</span><span class="nb">,E</span><span class="o">)</span>
</div><div id="l710" class="code_block"><span class="nb">                ; array_update</span><span class="o">(</span><span class="nb">C,</span><span class="m">3</span><span class="nb">,</span><span class="m">6</span><span class="nb">,D</span><span class="o">)</span><span class="nb">, array_elt</span><span class="o">(</span><span class="nb">D,</span><span class="m">3</span><span class="nb">,E</span><span class="o">)</span>
</div><div id="l711" class="code_block"><span class="nb">                ; array_update</span><span class="o">(</span><span class="nb">C,</span><span class="m">3</span><span class="nb">,</span><span class="m">7</span><span class="nb">,D</span><span class="o">)</span><span class="nb">, array_elt</span><span class="o">(</span><span class="nb">D,</span><span class="m">3</span><span class="nb">,E</span><span class="o">)</span>
</div><div id="l712" class="code_block"><span class="nb">                </span><span class="o">)</span><span class="nb">.</span>
</div><div id="l713" class="code_block">
</div><div id="l714" class="code_block"><span class="nb">           A </span><span class="o">=</span><span class="nb"> array</span><span class="o">(</span><span class="m">1</span><span class="nb">,</span><span class="m">2</span><span class="nb">,</span><span class="m">3</span><span class="nb">,_</span><span class="m">874600</span><span class="o">)</span>
</div><div id="l715" class="code_block"><span class="nb">           B </span><span class="o">=</span><span class="nb"> array</span><span class="o">(</span><span class="m">1</span><span class="nb">,</span><span class="m">2</span><span class="nb">,</span><span class="m">3</span><span class="nb">,_</span><span class="m">874600</span><span class="o">)</span>
</div><div id="l716" class="code_block"><span class="nb">           C </span><span class="o">=</span><span class="nb"> array</span><span class="o">(</span><span class="m">1</span><span class="nb">,</span><span class="m">2</span><span class="nb">,</span><span class="m">3</span><span class="nb">,_</span><span class="m">874600</span><span class="o">)</span>
</div><div id="l717" class="code_block"><span class="nb">           D </span><span class="o">=</span><span class="nb"> array</span><span class="o">(</span><span class="m">1</span><span class="nb">,</span><span class="m">2</span><span class="nb">,</span><span class="m">3</span><span class="nb">,_</span><span class="m">874600</span><span class="o">)</span>
</div><div id="l718" class="code_block"><span class="nb">           E </span><span class="o">=</span><span class="nb"> </span><span class="m">3</span><span class="nb">;</span>
</div><div id="l719" class="code_block">
</div><div id="l720" class="code_block"><span class="nb">           A </span><span class="o">=</span><span class="nb"> array</span><span class="o">(</span><span class="m">1</span><span class="nb">,</span><span class="m">2</span><span class="nb">,</span><span class="m">6</span><span class="nb">,_</span><span class="m">874600</span><span class="o">)</span>
</div><div id="l721" class="code_block"><span class="nb">           B </span><span class="o">=</span><span class="nb"> array</span><span class="o">(</span><span class="m">1</span><span class="nb">,</span><span class="m">2</span><span class="nb">,</span><span class="m">6</span><span class="nb">,_</span><span class="m">874600</span><span class="o">)</span>
</div><div id="l722" class="code_block"><span class="nb">           C </span><span class="o">=</span><span class="nb"> array</span><span class="o">(</span><span class="m">1</span><span class="nb">,</span><span class="m">2</span><span class="nb">,</span><span class="m">6</span><span class="nb">,_</span><span class="m">874600</span><span class="o">)</span>
</div><div id="l723" class="code_block"><span class="nb">           D </span><span class="o">=</span><span class="nb"> array</span><span class="o">(</span><span class="m">1</span><span class="nb">,</span><span class="m">2</span><span class="nb">,</span><span class="m">6</span><span class="nb">,_</span><span class="m">874600</span><span class="o">)</span>
</div><div id="l724" class="code_block"><span class="nb">           E </span><span class="o">=</span><span class="nb"> </span><span class="m">6</span><span class="nb">;</span>
</div><div id="l725" class="code_block">
</div><div id="l726" class="code_block"><span class="nb">           A </span><span class="o">=</span><span class="nb"> array</span><span class="o">(</span><span class="m">1</span><span class="nb">,</span><span class="m">2</span><span class="nb">,</span><span class="m">7</span><span class="nb">,_</span><span class="m">874600</span><span class="o">)</span>
</div><div id="l727" class="code_block"><span class="nb">           B </span><span class="o">=</span><span class="nb"> array</span><span class="o">(</span><span class="m">1</span><span class="nb">,</span><span class="m">2</span><span class="nb">,</span><span class="m">7</span><span class="nb">,_</span><span class="m">874600</span><span class="o">)</span>
</div><div id="l728" class="code_block"><span class="nb">           C </span><span class="o">=</span><span class="nb"> array</span><span class="o">(</span><span class="m">1</span><span class="nb">,</span><span class="m">2</span><span class="nb">,</span><span class="m">7</span><span class="nb">,_</span><span class="m">874600</span><span class="o">)</span>
</div><div id="l729" class="code_block"><span class="nb">           D </span><span class="o">=</span><span class="nb"> array</span><span class="o">(</span><span class="m">1</span><span class="nb">,</span><span class="m">2</span><span class="nb">,</span><span class="m">7</span><span class="nb">,_</span><span class="m">874600</span><span class="o">)</span>
</div><div id="l730" class="code_block"><span class="nb">           E </span><span class="o">=</span><span class="nb"> </span><span class="m">7</span><span class="nb">;</span>
</div><div id="l731" class="code_block">
</div><div id="l732" class="code_block"><span class="nb">           no</span>
</div><div id="l733" class="code_block"><span class="nb"> </span><span class="nv">\end</span><span class="nb">{verbatim}</span>
</div><div id="l734" class="code_block"><span class="nb">}</span>
</div><div id="l735" class="code_block">
</div><div id="l736" class="code_block">
</div><div id="l737" class="code_block"><span class="nv">\section</span><span class="nb">{The Profiling Library}</span>
</div><div id="l738" class="code_block"><span class="c">%==============================</span>
</div><div id="l739" class="code_block">
</div><div id="l740" class="code_block"><span class="nb">These predicates are available by loading the library through</span>
</div><div id="l741" class="code_block"><span class="nb">{</span><span class="nv">\tt</span><span class="nb"> </span><span class="o">[</span><span class="nb">prof</span><span class="nv">\_</span><span class="nb">lib</span><span class="o">]</span><span class="nb">}.</span>
</div><div id="l742" class="code_block">
</div><div id="l743" class="code_block"><span class="nv">\begin</span><span class="nb">{description}</span>
</div><div id="l744" class="code_block"><span class="nv">\ournewitem</span><span class="nb">{measure</span><span class="o">(+</span><span class="nb">Call</span><span class="o">)</span><span class="nb">}{prof</span><span class="nv">\_</span><span class="nb">lib}</span><span class="nv">\index</span><span class="nb">{{</span><span class="nv">\tt</span><span class="nb"> measure</span><span class="o">/</span><span class="m">1</span><span class="nb">}}</span>
</div><div id="l745" class="code_block"><span class="c">%\predindex{measure/1~(L)}\label{p:measure}</span>
</div><div id="l746" class="code_block"><span class="nb">     The same as {</span><span class="nv">\tt</span><span class="nb"> once</span><span class="o">/</span><span class="m">1</span><span class="nb">} </span><span class="o">(</span><span class="nb">see section~</span><span class="nv">\ref</span><span class="nb">{meta_predicates}</span><span class="o">)</span><span class="nb">, </span>
</div><div id="l747" class="code_block"><span class="nb">     but it also prints out statistical information about the call,</span>
</div><div id="l748" class="code_block"><span class="nb">     that looks like the information printed out by predicate</span>
</div><div id="l749" class="code_block"><span class="nb">     {</span><span class="nv">\tt</span><span class="nb"> statistics</span><span class="o">/</span><span class="m">0</span><span class="nb">} </span><span class="o">(</span><span class="nb">see section~</span><span class="nv">\ref</span><span class="nb">{environmental}</span><span class="o">)</span><span class="nb">.</span>
</div><div id="l750" class="code_block"><span class="nv">\end</span><span class="nb">{description}</span>
</div><div id="l751" class="code_block">
</div><div id="l752" class="code_block"><span class="c">%----------------------------------------------------------------------</span>
</div><div id="l753" class="code_block"><span class="c">%\input{tr_assert}</span>
</div><div id="l754" class="code_block"><span class="nv">\section</span><span class="nb">{Asserts</span><span class="o">/</span><span class="nb">Retracts using Tries }</span>
</div><div id="l755" class="code_block">
</div><div id="l756" class="code_block"><span class="nv">\index</span><span class="nb">{{</span><span class="nv">\tt</span><span class="nb"> trie</span><span class="nv">\_</span><span class="nb">assert</span><span class="o">/</span><span class="m">1</span><span class="nb">}}</span>
</div><div id="l757" class="code_block"><span class="nv">\index</span><span class="nb">{{</span><span class="nv">\tt</span><span class="nb"> trie</span><span class="nv">\_</span><span class="nb">retract</span><span class="o">/</span><span class="m">1</span><span class="nb">}}</span>
</div><div id="l758" class="code_block"><span class="nv">\index</span><span class="nb">{{</span><span class="nv">\tt</span><span class="nb"> trie</span><span class="nv">\_</span><span class="nb">retractall</span><span class="o">/</span><span class="m">1</span><span class="nb">}}</span>
</div><div id="l759" class="code_block"><span class="nv">\index</span><span class="nb">{{</span><span class="nv">\tt</span><span class="nb"> trie</span><span class="nv">\_</span><span class="nb">retract</span><span class="nv">\_</span><span class="nb">nr</span><span class="o">/</span><span class="m">1</span><span class="nb">}}</span>
</div><div id="l760" class="code_block"><span class="nv">\index</span><span class="nb">{{</span><span class="nv">\tt</span><span class="nb"> abolish</span><span class="nv">\_</span><span class="nb">trie</span><span class="nv">\_</span><span class="nb">asserted</span><span class="o">/</span><span class="m">1</span><span class="nb">}}</span>
</div><div id="l761" class="code_block"><span class="nv">\index</span><span class="nb">{{</span><span class="nv">\tt</span><span class="nb"> trie</span><span class="nv">\_</span><span class="nb">dynamic</span><span class="o">/</span><span class="m">1</span><span class="nb">}}</span>
</div><div id="l762" class="code_block">
</div><div id="l763" class="code_block"><span class="nb">In </span><span class="nv">\version</span><span class="nb">, trie asserted code has been merged with standard asserted</span>
</div><div id="l764" class="code_block"><span class="nb">code.  If the user wishes to use tries for dynamic code, the</span>
</div><div id="l765" class="code_block"><span class="nb">recommended programming practice is as outlined in Section</span>
</div><div id="l766" class="code_block"><span class="nv">\ref</span><span class="nb">{sec:assert}.  For compatability with previous versions, the</span>
</div><div id="l767" class="code_block"><span class="nb">predicates {</span><span class="nv">\tt</span><span class="nb"> trie</span><span class="nv">\_</span><span class="nb">assert</span><span class="o">/</span><span class="m">1</span><span class="nb">}, {</span><span class="nv">\tt</span><span class="nb"> trie</span><span class="nv">\_</span><span class="nb">retract</span><span class="o">/</span><span class="m">1</span><span class="nb">}, {</span><span class="nv">\tt</span>
</div><div id="l768" class="code_block"><span class="nb">trie</span><span class="nv">\_</span><span class="nb">retractall</span><span class="o">/</span><span class="m">1</span><span class="nb">}, {</span><span class="nv">\tt</span><span class="nb"> trie</span><span class="nv">\_</span><span class="nb">retract</span><span class="nv">\_</span><span class="nb">nr</span><span class="o">/</span><span class="m">1</span><span class="nb">}, {</span><span class="nv">\tt</span>
</div><div id="l769" class="code_block"><span class="nb">abolish</span><span class="nv">\_</span><span class="nb">trie</span><span class="nv">\_</span><span class="nb">asserted</span><span class="o">/</span><span class="m">1</span><span class="nb">} and {</span><span class="nv">\tt</span><span class="nb"> trie</span><span class="nv">\_</span><span class="nb">dynamic</span><span class="o">/</span><span class="m">1</span><span class="nb">} can be imported</span>
</div><div id="l770" class="code_block"><span class="nb">from the module {</span><span class="nv">\sf</span><span class="nb"> tables}.  However, if the current index</span>
</div><div id="l771" class="code_block"><span class="nb">specification of these predicates is {</span><span class="nv">\tt</span><span class="nb"> trie} </span><span class="o">(</span><span class="nb">see Section</span>
</div><div id="l772" class="code_block"><span class="nv">\ref</span><span class="nb">{sec:assert}</span><span class="o">)</span><span class="nb">, the predicates are defined as {</span><span class="nv">\tt</span><span class="nb"> assert</span><span class="o">/</span><span class="m">1</span><span class="nb">}, {</span><span class="nv">\tt</span>
</div><div id="l773" class="code_block"><span class="nb">retract</span><span class="o">/</span><span class="m">1</span><span class="nb">}, {</span><span class="nv">\tt</span><span class="nb"> retractall</span><span class="o">/</span><span class="m">1</span><span class="nb">}, {</span><span class="nv">\tt</span><span class="nb"> retract</span><span class="nv">\_</span><span class="nb">nr</span><span class="o">/</span><span class="m">1</span><span class="nb">}, {</span><span class="nv">\tt</span><span class="nb"> abolish</span><span class="o">/</span><span class="m">1</span><span class="nb">}</span>
</div><div id="l774" class="code_block"><span class="nb">and {</span><span class="nv">\tt</span><span class="nb"> dynamic</span><span class="o">/</span><span class="m">1</span><span class="nb">} respectively.  If the index specification is other</span>
</div><div id="l775" class="code_block"><span class="nb">than {</span><span class="nv">\tt</span><span class="nb"> tries}, the predicate will issue a warning message and have</span>
</div><div id="l776" class="code_block"><span class="nb">no effect on the database.</span>
</div><div id="l777" class="code_block">
</div><div id="l778" class="code_block"><span class="nv">\section</span><span class="nb">{Extended Logic Programs}  </span><span class="nv">\label</span><span class="nb">{library_utilities:wfsx}</span>
</div><div id="l779" class="code_block"><span class="nv">\index</span><span class="nb">{WFSX}</span>
</div><div id="l780" class="code_block"><span class="nv">\index</span><span class="nb">{negation</span><span class="o">!</span><span class="nb">explicit negation}</span>
</div><div id="l781" class="code_block"><span class="nb">As explained in Section </span><span class="nv">\ref</span><span class="nb">{tabling_overview} XSB can compute normal</span>
</div><div id="l782" class="code_block"><span class="nb">logic programs according to the well</span><span class="o">-</span><span class="nb">founded semantics.  In fact, XSB</span>
</div><div id="l783" class="code_block"><span class="nb">can also compute {</span><span class="nv">\em</span><span class="nb"> Extended Logic Programs}, which contain an</span>
</div><div id="l784" class="code_block"><span class="nb">operator for explicit negation </span><span class="o">(</span><span class="nb">written using the symbol {</span><span class="nv">\tt</span><span class="nb"> </span><span class="o">-</span><span class="nb">} in</span>
</div><div id="l785" class="code_block"><span class="nb">addition to the negation</span><span class="o">-</span><span class="nb">by</span><span class="o">-</span><span class="nb">failure of the well</span><span class="o">-</span><span class="nb">founded semantics</span>
</div><div id="l786" class="code_block"><span class="o">(</span><span class="nv">\verb</span><span class="nb">|</span><span class="nv">\+</span><span class="nb">| or {</span><span class="nv">\tt</span><span class="nb"> not}</span><span class="o">)</span><span class="nb">.  Extended logic programs can be extremely</span>
</div><div id="l787" class="code_block"><span class="nb">useful when reasoning about actions, for model</span><span class="o">-</span><span class="nb">based diagnosis, and</span>
</div><div id="l788" class="code_block"><span class="nb">for many other uses </span><span class="nv">\cite</span><span class="nb">{AlPe</span><span class="m">95</span><span class="nb">}.  The library, {</span><span class="nv">\sf</span><span class="nb"> slx} provides a means</span>
</div><div id="l789" class="code_block"><span class="nb">to compile programs so that they can be executed by XSB according to</span>
</div><div id="l790" class="code_block"><span class="nb">the {</span><span class="nv">\em</span><span class="nb"> well</span><span class="o">-</span><span class="nb">founded semantics with explicit negation} </span><span class="nv">\cite</span><span class="nb">{ADP</span><span class="m">95</span><span class="nb">}.</span>
</div><div id="l791" class="code_block"><span class="nb">Briefly, WFSX is an extension of the well</span><span class="o">-</span><span class="nb">founded semantics to include</span>
</div><div id="l792" class="code_block"><span class="nb">explicit negation and which is based on the {</span><span class="nv">\em</span><span class="nb"> coherence principle}</span>
</div><div id="l793" class="code_block"><span class="nb">in which an atom is taken to be default false if it is proven to be</span>
</div><div id="l794" class="code_block"><span class="nb">explicitly false, intutively:</span>
</div><div id="l795" class="code_block"><span class="nv">\[</span>
</div><div id="l796" class="code_block"><span class="o">-</span><span class="nb">p </span><span class="nv">\Rightarrow</span><span class="nb"> not</span><span class="nv">\</span><span class="nb"> p.</span>
</div><div id="l797" class="code_block"><span class="nv">\]</span>
</div><div id="l798" class="code_block">
</div><div id="l799" class="code_block"><span class="nb">This section is not intended to be a primer on extended logic</span>
</div><div id="l800" class="code_block"><span class="nb">programming or on WFSX semantics, but we do provide a few sample</span>
</div><div id="l801" class="code_block"><span class="nb">programs to indicate the action of WFSX.  Consider the program</span>
</div><div id="l802" class="code_block"><span class="nb">{</span><span class="nv">\small</span><span class="nb"> </span>
</div><div id="l803" class="code_block"><span class="nv">\begin</span><span class="nb">{verbatim}</span>
</div><div id="l804" class="code_block"><span class="nb">s:</span><span class="o">-</span><span class="nb"> not t.</span>
</div><div id="l805" class="code_block">
</div><div id="l806" class="code_block"><span class="nb">t:</span><span class="o">-</span><span class="nb"> r.</span>
</div><div id="l807" class="code_block"><span class="nb">t.</span>
</div><div id="l808" class="code_block">
</div><div id="l809" class="code_block"><span class="nb">r:</span><span class="o">-</span><span class="nb"> not r.</span>
</div><div id="l810" class="code_block"><span class="nv">\end</span><span class="nb">{verbatim}</span>
</div><div id="l811" class="code_block"><span class="nb">}</span>
</div><div id="l812" class="code_block"><span class="nb">If the clause {</span><span class="nv">\tt</span><span class="nb"> </span><span class="o">-</span><span class="nb">t} were not present, the atoms {</span><span class="nv">\tt</span><span class="nb"> r, t, s} would</span>
</div><div id="l813" class="code_block"><span class="nb">all be undefined in WFSX just as they would be in the well</span><span class="o">-</span><span class="nb">founded</span>
</div><div id="l814" class="code_block"><span class="nb">semantics.  However, when the clause {</span><span class="nv">\tt</span><span class="nb"> t} is included, {</span><span class="nv">\tt</span><span class="nb"> t}</span>
</div><div id="l815" class="code_block"><span class="nb">becomes true in the well</span><span class="o">-</span><span class="nb">founded model, while {</span><span class="nv">\tt</span><span class="nb"> s} becomes false.</span>
</div><div id="l816" class="code_block"><span class="nb">Next, consider the program</span>
</div><div id="l817" class="code_block"><span class="nb">{</span><span class="nv">\small</span><span class="nb"> </span>
</div><div id="l818" class="code_block"><span class="nv">\begin</span><span class="nb">{verbatim}</span>
</div><div id="l819" class="code_block"><span class="nb">s:</span><span class="o">-</span><span class="nb"> not t.</span>
</div><div id="l820" class="code_block">
</div><div id="l821" class="code_block"><span class="nb">t:</span><span class="o">-</span><span class="nb"> r.</span>
</div><div id="l822" class="code_block"><span class="o">-</span><span class="nb">t.</span>
</div><div id="l823" class="code_block">
</div><div id="l824" class="code_block"><span class="nb">r:</span><span class="o">-</span><span class="nb"> not r.</span>
</div><div id="l825" class="code_block"><span class="nv">\end</span><span class="nb">{verbatim}</span>
</div><div id="l826" class="code_block"><span class="nb">}</span>
</div><div id="l827" class="code_block"><span class="nb">In this program, the explicitly false truth value for {</span><span class="nv">\tt</span><span class="nb"> t} obtained</span>
</div><div id="l828" class="code_block"><span class="nb">by the rule {</span><span class="nv">\tt</span><span class="nb"> </span><span class="o">-</span><span class="nb">t} overrides the undefined truth value for {</span><span class="nv">\tt</span><span class="nb"> t}</span>
</div><div id="l829" class="code_block"><span class="nb">obtained by the rule {</span><span class="nv">\tt</span><span class="nb"> t:</span><span class="o">-</span><span class="nb"> r}.  The WFSX model for this program</span>
</div><div id="l830" class="code_block"><span class="nb">will assign the truth value of {</span><span class="nv">\tt</span><span class="nb"> t} as false, and that of {</span><span class="nv">\tt</span><span class="nb"> s}</span>
</div><div id="l831" class="code_block"><span class="nb">as true.  If the above program were contained in the file {</span><span class="nv">\tt</span>
</div><div id="l832" class="code_block"><span class="nb">test.P}, an XSB session ising {</span><span class="nv">\tt</span><span class="nb"> test.P} might look like the</span>
</div><div id="l833" class="code_block"><span class="nb">following:</span>
</div><div id="l834" class="code_block"><span class="nb">{</span><span class="nv">\small</span>
</div><div id="l835" class="code_block"><span class="nv">\begin</span><span class="nb">{verbatim}</span>
</div><div id="l836" class="code_block"><span class="nb">              &gt; xsb</span>
</div><div id="l837" class="code_block"><span class="nb">              </span>
</div><div id="l838" class="code_block"><span class="nb">              | ?</span><span class="o">-</span><span class="nb"> </span><span class="o">[</span><span class="nb">slx</span><span class="o">]</span><span class="nb">.</span>
</div><div id="l839" class="code_block"><span class="nb">              </span><span class="o">[</span><span class="nb">slx loaded</span><span class="o">]</span>
</div><div id="l840" class="code_block"><span class="nb">            </span>
</div><div id="l841" class="code_block"><span class="nb">              yes</span>
</div><div id="l842" class="code_block"><span class="nb">              | ?</span><span class="o">-</span><span class="nb"> slx_compile</span><span class="o">(</span><span class="nb">&#39;test.P&#39;</span><span class="o">)</span><span class="nb">.</span>
</div><div id="l843" class="code_block"><span class="nb">              </span><span class="o">[</span><span class="nb">Compiling .</span><span class="o">/</span><span class="nb">tmptest</span><span class="o">]</span>
</div><div id="l844" class="code_block"><span class="nb">              </span><span class="o">[</span><span class="nb">tmptest compiled, cpu time used: </span><span class="m">0</span><span class="nb">.</span><span class="m">1280</span><span class="nb"> seconds</span><span class="o">]</span>
</div><div id="l845" class="code_block"><span class="nb">              </span><span class="o">[</span><span class="nb">tmptest loaded</span><span class="o">]</span>
</div><div id="l846" class="code_block"><span class="nb">            </span>
</div><div id="l847" class="code_block"><span class="nb">              | ?</span><span class="o">-</span><span class="nb"> s.</span>
</div><div id="l848" class="code_block"><span class="nb">              </span>
</div><div id="l849" class="code_block"><span class="nb">              yes</span>
</div><div id="l850" class="code_block"><span class="nb">              | ?</span><span class="o">-</span><span class="nb"> t.</span>
</div><div id="l851" class="code_block">
</div><div id="l852" class="code_block"><span class="nb">              no</span>
</div><div id="l853" class="code_block"><span class="nb">              | ?</span><span class="o">-</span><span class="nb"> naf t.</span>
</div><div id="l854" class="code_block"><span class="nb">              </span>
</div><div id="l855" class="code_block"><span class="nb">              yes</span>
</div><div id="l856" class="code_block"><span class="nb">              | ?</span><span class="o">-</span><span class="nb"> r.</span>
</div><div id="l857" class="code_block">
</div><div id="l858" class="code_block"><span class="nb">              no</span>
</div><div id="l859" class="code_block"><span class="nb">              | ?</span><span class="o">-</span><span class="nb"> naf r.</span>
</div><div id="l860" class="code_block"><span class="nb">              </span>
</div><div id="l861" class="code_block"><span class="nb">              no</span>
</div><div id="l862" class="code_block"><span class="nb">              | ?</span><span class="o">-</span><span class="nb"> und r.</span>
</div><div id="l863" class="code_block"><span class="nb">              </span>
</div><div id="l864" class="code_block"><span class="nb">              yes</span>
</div><div id="l865" class="code_block"><span class="nv">\end</span><span class="nb">{verbatim}</span>
</div><div id="l866" class="code_block"><span class="nb">}</span>
</div><div id="l867" class="code_block"><span class="nb">In the above program, the query {</span><span class="nv">\tt</span><span class="nb"> ?</span><span class="o">-</span><span class="nb"> t.} did not succeed,  because</span>
</div><div id="l868" class="code_block"><span class="nb">{</span><span class="nv">\tt</span><span class="nb"> t} is false in WFSX: accordingly the query {</span><span class="nv">\tt</span><span class="nb"> naf t} did</span>
</div><div id="l869" class="code_block"><span class="nb">succeed, because it is true that t is false via negation</span><span class="o">-</span><span class="nb">as</span><span class="o">-</span><span class="nb">failure,</span>
</div><div id="l870" class="code_block"><span class="nb">in addition to {</span><span class="nv">\tt</span><span class="nb"> t} being false via explicit negation.  Note that</span>
</div><div id="l871" class="code_block"><span class="nb">after being processed by the SLX preprocessor, {</span><span class="nv">\tt</span><span class="nb"> r} is undefined</span>
</div><div id="l872" class="code_block"><span class="nb">but does not succeed, although {</span><span class="nv">\tt</span><span class="nb"> und r} will succeed.</span>
</div><div id="l873" class="code_block">
</div><div id="l874" class="code_block"><span class="nb">We note in passing that programs under WFSX can be paraconsistent.</span>
</div><div id="l875" class="code_block"><span class="nb">For instance in the program.</span>
</div><div id="l876" class="code_block"><span class="nb">{</span><span class="nv">\small</span>
</div><div id="l877" class="code_block"><span class="nv">\begin</span><span class="nb">{verbatim}</span>
</div><div id="l878" class="code_block"><span class="nb">              p:</span><span class="o">-</span><span class="nb"> q.</span>
</div><div id="l879" class="code_block">
</div><div id="l880" class="code_block"><span class="nb">              q:</span><span class="o">-</span><span class="nb"> not q.</span>
</div><div id="l881" class="code_block"><span class="nb">              </span><span class="o">-</span><span class="nb">q.</span>
</div><div id="l882" class="code_block"><span class="nv">\end</span><span class="nb">{verbatim}</span>
</div><div id="l883" class="code_block"><span class="nb">}</span>
</div><div id="l884" class="code_block"><span class="nb">both {</span><span class="nv">\tt</span><span class="nb"> p} and {</span><span class="nv">\tt</span><span class="nb"> q} will be true {</span><span class="nv">\em</span><span class="nb"> and} false in the WFSX</span>
</div><div id="l885" class="code_block"><span class="nb">model.  Accordingly, under SLX preprocessing, both {</span><span class="nv">\tt</span><span class="nb"> p} and {</span><span class="nv">\tt</span>
</div><div id="l886" class="code_block"><span class="nb">naf p} will succeed.</span>
</div><div id="l887" class="code_block">
</div><div id="l888" class="code_block"><span class="nv">\begin</span><span class="nb">{description}</span>
</div><div id="l889" class="code_block"><span class="nv">\ournewitem</span><span class="nb">{slx</span><span class="nv">\_</span><span class="nb">compile</span><span class="o">(+</span><span class="nb">File</span><span class="o">)</span><span class="nb">}{slx}</span>
</div><div id="l890" class="code_block"><span class="nb">Preprocesses and loads the extended logic program named {</span><span class="nv">\tt</span><span class="nb"> File}.</span>
</div><div id="l891" class="code_block"><span class="nb">Default negation in {</span><span class="nv">\tt</span><span class="nb"> File} must be represented using the operator</span>
</div><div id="l892" class="code_block"><span class="nb">{</span><span class="nv">\tt</span><span class="nb"> not} rather than using {</span><span class="nv">\tt</span><span class="nb"> tnot} or </span><span class="nv">\verb</span><span class="nb">|</span><span class="nv">\+</span><span class="nb">|.  If {</span><span class="nv">\tt</span><span class="nb"> L} is an</span>
</div><div id="l893" class="code_block"><span class="nb">objective literal </span><span class="o">(</span><span class="nb">e.g. of the form </span><span class="s">$</span>A<span class="s">$</span><span class="nb"> or </span><span class="s">$</span>-A<span class="s">$</span><span class="nb"> where </span><span class="s">$</span>A<span class="s">$</span><span class="nb"> is an atom</span><span class="o">)</span><span class="nb">,</span>
</div><div id="l894" class="code_block"><span class="nb">a query {</span><span class="nv">\tt</span><span class="nb"> ?</span><span class="o">-</span><span class="nb"> L} will succeed if {</span><span class="nv">\tt</span><span class="nb"> L} is true in the WFSX model,</span>
</div><div id="l895" class="code_block"><span class="nb">{</span><span class="nv">\tt</span><span class="nb"> naf L} will succeed if {</span><span class="nv">\tt</span><span class="nb"> L} is false in the WFSX model, and</span>
</div><div id="l896" class="code_block"><span class="nb">{</span><span class="nv">\tt</span><span class="nb"> und L} will succeed if {</span><span class="nv">\tt</span><span class="nb"> L} is undefined in the WFSX model.</span>
</div><div id="l897" class="code_block"><span class="nv">\end</span><span class="nb">{description}</span>
</div><div id="l898" class="code_block">
</div><div id="l899" class="code_block">
</div><div id="l900" class="code_block">
</div><div id="l901" class="code_block"><span class="c">%%% Local Variables: </span>
</div><div id="l902" class="code_block"><span class="c">%%% mode: latex</span>
</div><div id="l903" class="code_block"><span class="c">%%% TeX-master: &quot;manual&quot;</span>
</div><div id="l904" class="code_block"><span class="c">%%% End: </span>
</div></pre></div></td></tr></table></div>

      
    </div>
  

                    </div>
                    
                    
                </div>
            



        </div>
    </section>
      

    <footer class="sandiego">
    <div class="as-row">
        <div class="footer-wrapper">
            <nav aria-label="Site Links" role="navigation">
                <section>
                    <div class="as-h2">SourceForge</div>
                    <ul>
                    
                        <li><a href="/create/" title="Create a Project">Create a Project</a></li>
                    
                        <li><a href="/directory/" title="Open Source Software Directory">Open Source Software</a></li>
                        <li><a href="/software/" title="Business Software Directory">Business Software</a></li>
                        
                            
                            <li><a href="/top" title="Top Open Source Projects">Top Downloaded Projects</a></li>
                        

                    </ul>
                </section>
            </nav>
            <nav aria-label="Company Links" role="navigation">
                <section>
                    <div class="as-h2">Company</div>
                    <ul>
                        <li><a href="/about">About</a></li>
                        <li><a href="/about/leadership" title="Open Source Software Directory">Team</a></li>
                        <li class="h-card">
                            <address>
                                <span class="p-name p-org">SourceForge Headquarters</span><br>
                                <span class="p-street-address">225 Broadway Suite 1600</span><br>
                                <span class="p-locality">San Diego, CA <span class="p-postal-code">92101</span></span><br>
                                <span class="p-tel">+1 (858) 422-6466</span><br>
                            </address>
                        </li>
                        <li id="social">
                            
<span></span>
<a href="https://twitter.com/sourceforge" class="twitter" rel="nofollow" target="_blank" title="SourceForge on X">


<svg  class="vertical-icon-fix" data-name="twitter" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1684 408q-67 98-162 167 1 14 1 42 0 130-38 259.5t-115.5 248.5-184.5 210.5-258 146-323 54.5q-271 0-496-145 35 4 78 4 225 0 401-138-105-2-188-64.5t-114-159.5q33 5 61 5 43 0 85-11-112-23-185.5-111.5t-73.5-205.5v-4q68 38 146 41-66-44-105-115t-39-154q0-88 44-163 121 149 294.5 238.5t371.5 99.5q-8-38-8-74 0-134 94.5-228.5t228.5-94.5q140 0 236 102 109-21 205-78-37 115-142 178 93-10 186-50z"/></svg></a>
<a href="https://fosstodon.org/@sourceforge" rel="me nofollow" target="_blank" title="SourceForge on Mastodon">


<svg  class="vertical-icon-fix" data-name="mastodon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M433 179.11c0-97.2-63.71-125.7-63.71-125.7-62.52-28.7-228.56-28.4-290.48 0 0 0-63.72 28.5-63.72 125.7 0 115.7-6.6 259.4 105.63 289.1 40.51 10.7 75.32 13 103.33 11.4 50.81-2.8 79.32-18.1 79.32-18.1l-1.7-36.9s-36.31 11.4-77.12 10.1c-40.41-1.4-83-4.4-89.63-54a102.54 102.54 0 0 1-.9-13.9c85.63 20.9 158.65 9.1 178.75 6.7 56.12-6.7 105-41.3 111.23-72.9 9.8-49.8 9-121.5 9-121.5zm-75.12 125.2h-46.63v-114.2c0-49.7-64-51.6-64 6.9v62.5h-46.33V197c0-58.5-64-56.6-64-6.9v114.2H90.19c0-122.1-5.2-147.9 18.41-175 25.9-28.9 79.82-30.8 103.83 6.1l11.6 19.5 11.6-19.5c24.11-37.1 78.12-34.8 103.83-6.1 23.71 27.3 18.4 53 18.4 175z"/></svg></a>
<a href="https://www.facebook.com/sourceforgenet/" class="facebook" rel="nofollow" target="_blank" title="SourceForge on Facebook">


<svg  data-name="facebook" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1343 12v264h-157q-86 0-116 36t-30 108v189h293l-39 296h-254v759h-306v-759h-255v-296h255v-218q0-186 104-288.5t277-102.5q147 0 228 12z"/></svg></a>
<a href="https://www.linkedin.com/company/sourceforge.net" class="linkedin" rel="nofollow" target="_blank" title="SourceForge on LinkedIn">


<svg  data-name="linkedin" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M477 625v991h-330v-991h330zm21-306q1 73-50.5 122t-135.5 49h-2q-82 0-132-49t-50-122q0-74 51.5-122.5t134.5-48.5 133 48.5 51 122.5zm1166 729v568h-329v-530q0-105-40.5-164.5t-126.5-59.5q-63 0-105.5 34.5t-63.5 85.5q-11 30-11 81v553h-329q2-399 2-647t-1-296l-1-48h329v144h-2q20-32 41-56t56.5-52 87-43.5 114.5-15.5q171 0 275 113.5t104 332.5z"/></svg></a>

<a href="/user/newsletters" rel=nofollow class="newsletter" title="Subscribe to our newsletter">


<svg  class="vertical-icon-fix" data-name="mmSF_11mail" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 42 42" enable-background="new 0 0 42 42" xml:space="preserve"><path fill="#FFFFFF" d="M0,6v30h42V6H0z M24.2,21.2c-0.8,0.8-2.3,2-3.2,2c-0.9,0-2.4-1.2-3.2-2L5.8,9.7h30.3L24.2,21.2z M13.7,21l-9.9,9.4V11.6L13.7,21z M15.7,23L15.7,23c0.5,0.5,2.9,2.9,5.3,2.9c2.4,0,4.8-2.4,5.2-2.8l0.1-0.1l9.8,9.4H5.8L15.7,23z M28.3,21l9.9-9.5v18.9L28.3,21z"/></svg></a>

<span></span>
                        </li>
                    </ul>
                </section>
            </nav>
             <nav aria-label="Resources Links" role="navigation">
                <section>
                    <div class="as-h2">Resources</div>
                    <ul>
                        
                            <li><a href="/support" title="Support Section">Support</a></li>
                            <li><a href="/p/forge/documentation/Docs%20Home/" title="Site Documentation">Site Documentation</a></li>
                        
                        <li><a href="https://fosstodon.org/@sourceforgestatus" title="Site Status" rel="me nofollow">Site Status</a></li>
                        <li><a href="/reviews" title="Reviews" rel="me nofollow">SourceForge Reviews</a></li>

                    </ul>
                </section>
            </nav>
            <section class="footer-logo">
                <a href="/" title="Home" class="sf-logo">
                    
    
    <img src="https://a.fsdn.com/con/images/sandiego/sf-logo-full.svg"  alt="SourceForge logo" class="sf-logo-full"/>
                </a>
            </section>
        </div>
    </div>
    <section class="l-nav-bottom">
        <nav class="row">
            
                
            
        
    <div class="columns small-12 large-6 copyright-notice">
        &copy; 2025 Slashdot Media. All Rights Reserved.
    </div>
    <div class="columns large-6 links links-right">
        

    
    

    <a href="https://slashdotmedia.com/terms-of-use" target="_blank" title="Terms" rel="nofollow">Terms</a>
    <a href="https://slashdotmedia.com/privacy-statement/" target="_blank" title="Privacy" rel="nofollow">Privacy</a>

    
    
    

    
        <a href="https://slashdotmedia.com/opt-out-choices/" target="_blank" title="Opt Out" rel="nofollow">Opt Out</a>
    

    
        <a href="https://slashdotmedia.com/contact/" target="_blank" title="Advertise" rel="nofollow">Advertise</a>
    
    </div>
        </nav>
    </section>

    </footer>
    





    
    
    <div id="newsletter-floating" class="sandiego newsletter-floating-new">
        <a class="close-button btn-closer" data-close aria-label="Close modal">
            <span aria-hidden="true">&times;</span>
        </a>
        <div class="as-h2">Want the latest updates on software, tech news, and AI?</div>
        <div class="row">
            <div class="column small-2 medium-2 large-2" style="padding-left: 0px; padding-right: 0px;"><img src="/images/sandiego/sf_email_icon.svg"  alt="" /></div>
            <div class="as-h3 column small-10 medium-10 large-10">Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.</div>
        </div>
        <form action="/user/newsletters/" method="post">
            <div class="row">
              <input class="newsletter-input" type="email" placeholder="Enter your email address" autocomplete="off" name="newsletter_email"
                     value="">
              <input type="hidden" name="source" value="floating">
              <button type="submit" class="button blue newsletter-button">Submit</button>
            </div>
        </form>
    </div>
    






</div>


<div id="messages">
    
</div>


    <!-- ew:body_js -->


    <script type="text/javascript" src="https://a.fsdn.com/allura/nf/1752697225/_ew_/_slim/js?href=allura%2Fjs%2Fjquery.notify.js%3Ballura%2Fjs%2Fjquery.tooltipster.js%3Ballura%2Fjs%2Fallura-base.js%3Ballura%2Fjs%2Fchecklist.js%3Ballura%2Fjs%2Fadmin_modal.js%3Bjs%2Fjquery.lightbox_me.js%3Ballura%2Fjs%2Fmemorable.js%3Btheme%2Fsftheme%2Fjs%2Fsftheme%2Fshared.js%3Btheme%2Fsftheme%2Fjs%2Fsftheme%2Fsticky.js%3Btheme%2Fsftheme%2Fjs%2Fsftheme%2Fsandiego%2Fchrome.js%3Btheme%2Fsftheme%2Fjs%2Fsftheme%2Fsandiego%2Futilities.js%3Btheme%2Fsftheme%2Fjs%2Fsftheme%2Fvendor%2Ffoundation6%2Fplugins%2Ffoundation.core.min.js%3Btheme%2Fsftheme%2Fjs%2Fsftheme%2Fvendor%2Ffoundation6%2Fplugins%2Ffoundation.util.mediaQuery.min.js%3Btheme%2Fsftheme%2Fjs%2Fsftheme%2Fvendor%2Ffoundation6%2Fplugins%2Ffoundation.util.keyboard.min.js%3Btheme%2Fsftheme%2Fjs%2Fsftheme%2Fvendor%2Ffoundation6%2Fplugins%2Ffoundation.util.box.min.js%3Btheme%2Fsftheme%2Fjs%2Fsftheme%2Fvendor%2Ffoundation6%2Fplugins%2Ffoundation.util.nest.min.js%3Btheme%2Fsftheme%2Fjs%2Fsftheme%2Fvendor%2Ffoundation6%2Fplugins%2Ffoundation.dropdownMenu.min.js%3Btheme%2Fsftheme%2Fjs%2Fsftheme%2Fvendor%2Ffoundation6%2Fplugins%2Ffoundation.offcanvas.min.js%3Btheme%2Fsftheme%2Fjs%2Fsftheme%2Fvendor%2Ffoundation6%2Fplugins%2Ffoundation.toggler.min.js%3Btheme%2Fsftheme%2Fjs%2Fsftheme%2Fsandiego%2Fproject.js%3Btheme%2Fsftheme%2Fjs%2Fsftheme%2Fvendor%2Fjquery.typeahead.min.js%3Ballura%2Fjs%2Fmaximize-content.js"></script>

    
<!-- /ew:body_js -->



    <!-- ew:body_js_tail -->


    <script type="text/javascript" src="https://a.fsdn.com/allura/nf/1752697225/_ew_/_slim/js?href=theme%2Fsftheme%2Fjs%2Fsftheme%2Fvendor%2Ffoundation6%2Fplugins%2Ffoundation.util.triggers.min.js%3Btheme%2Fsftheme%2Fjs%2Fsftheme%2Fvendor%2Ffoundation6%2Fplugins%2Ffoundation.reveal.min.js"></script>

    
<!-- /ew:body_js_tail -->




<script type="text/javascript">(function() {
  $('#access_urls .btn').click(function(evt){
    evt.preventDefault();
    var parent = $(this).parents('.btn-bar');
    var checkout_cmd = $(this).attr('data-url');
    $(parent).find('input').val(checkout_cmd);
    $(parent).find('span').text($(this).attr('title')+' access');
    $(this).parent().children('.btn').removeClass('active');
    $(this).addClass('active');
    if (checkout_cmd.indexOf(' http://') !== -1 || checkout_cmd.indexOf(' https://') !== -1 ) {
      $('#http-2fa-msg').show();
    } else {
      $('#http-2fa-msg').hide();
    }
  });
  $('#access_urls .btn').first().click();

  
  var repo_status = document.getElementById('repo_status');
  // The repo_status div will only be present if repo.status != 'ready'
  if (repo_status) {
    $('.spinner').show()
    var delay = 500;
    function check_status() {
        $.get('/p/xsb/src/status', function(data) {
            if (data.status === 'ready') {
                $('.spinner').hide()
                $('#repo_status h2').html('Repo status: ready. <a href="." rel="nofollow">Click here to refresh this page.</a>');
            }
            else {
                $('#repo_status h2 span').html(data.status);
                if (delay < 60000){
                    delay = delay * 2;
                }
                window.setTimeout(check_status, delay);
            }
        });
    }
    var status_checker = window.setTimeout(check_status, delay);
    
  }
}());
</script>

<script type="text/javascript">(function() {
  $(window).on('hashchange', function(e) {
    var hash = window.location.hash.substring(1);
    if ('originalEvent' in e && 'oldURL' in e.originalEvent) {
      $('#' + e.originalEvent.oldURL.split('#')[1]).css('background-color', 'transparent');
    }
    if (hash !== '' && hash.substring(0, 1) === 'l' && !isNaN(hash.substring(1))) {
      $('#' + hash).css('background-color', '#ffff99');
    }
  }).trigger('hashchange');

  var clicks = 0;
  $('.code_block').each(function(index, element) {
    $(element).on('click', function() {
      // Trick to ignore double and triple clicks
      clicks++;
      if (clicks === 1) {
        setTimeout(function() {
          if (clicks === 1) {
            var hash = window.location.hash.substring(1);
            if (hash !== '' && hash.substring(0, 1) === 'l' && !isNaN(hash.substring(1))) {
              $('#' + hash).css('background-color', 'transparent');
            }
            $(element).css('background-color', '#ffff99');
            window.history.pushState({}, document.title, window.location.pathname + window.location.search + '#' + $(element).attr('id'));
          }
          clicks = 0;
        }, 500);
      }
    });
  });
}());
</script>


    


    
    
    <noscript><p><img src="https://analytics.slashdotmedia.com/index.php?idsite=39" style="border:0;position:absolute;top:0;" alt="" /></p></noscript>
    
    <script>
        $(document).foundation();
    </script>
    








    

<script>
    (function () {
        function load_bombora() {
            /*global _ml:true, window */
            _ml = window._ml || {};
            
            _ml.eid = '771';
            _ml.fp = 'b9f291b2-714e-46d1-9d86-954ac497e743';  
            var s = document.getElementsByTagName('script')[0], cd = new Date(), mltag = document.createElement('script');
            mltag.type = 'text/javascript';
            mltag.async = true;
            mltag.defer = true;
            mltag.src = '//ml314.com/tag.aspx?' + cd.getDate() + cd.getMonth() + cd.getFullYear();
            s.parentNode.insertBefore(mltag, s);
        }
        bizx.cmp.ifConsent({ purposes: 'all', vendors: 'bombora'}, load_bombora);
    })();
</script>




<script>
    $(document).ready(function () {
        $(".tooltip, .m-tooltip").each(function(){
            let $el = $(this);
            $el.tooltipster({
                animation: 'fade',
                delay: 200,
                theme: 'tooltipster-light',
                trigger: 'hover',
                position: $el.data('position') || 'right',
                iconCloning: false,
                maxWidth: 300,
                contentAsHTML: true,
                interactive: true
            }).focus(function () {
                $(this).tooltipster('show');
            }).blur(function () {
                $(this).tooltipster('hide');
            });
        });
    });
</script>

    



<script type="text/javascript">
    bizx.cmp.ifConsent({ purposes: ['storage', 'measurement'], vendors: 'google-analytics'}, function () {
        /* jshint ignore:start */
        (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
                (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
            m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
        })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
        /* jshint ignore:end */

        window.dataLayer = window.dataLayer || [];
        function gtag(){ window.dataLayer.push(arguments); }
        window.gtag = window.gtag || gtag;
        bizx.cmp.embedScript("https://www.googletagmanager.com/gtag/js");
        gtag('js', new Date());
        gtag('set', {
            'page_location': 'https://sourceforge.net/p/xsb/src/80/tree/trunk/XSB/docs/userman/library.tex',
        });
    });
</script>










<script>
        function gam(id){
            bizx.cmp.ifConsent({ purposes: 'all' }, function () {
                bizx.cmp.embedScript(`https://pagead2.googlesyndication.com/pagead/js/pcd.js?${id}`,
                    true,  // async
                    'head', // location
                    null, // callback
                    false, // defer
                    {id: `google-pcd-tag-${id}`, 'data-audience-pixel': 'dc_iu=/41014381/DFPAudiencePixel;dc_seg=' + id});
            });
        }

        
            gam("8901705213");gam("8901712041");</script>

<script type="text/javascript">
    /*global ga, gtag */

    
        
        bizx.cmp.ifConsent({ purposes: ['storage', 'measurement'], vendors: 'google-analytics'}, function () {
            gtag('config', 'G-1H226E4E4L', {
                
                send_page_view: false,
                'SF_Page_Type': '', 
                user_properties: {
                    'SF_Logged_in': 'Logged Out', 
                },
                'devicePixelRatio': SF.devicePixelRatio, 
            });
            gtag('event', 'page_view', { send_to: 'G-1H226E4E4L' });
        });
    
    
    
        
</script>

</body>
</html>