UNPKG

@ciao-lang/ts-ciao-interface

Version:

Simple Ciao interface for node.

142 lines 125 kB
<!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><meta name="theme-color" content="#273f79"/><link rel="stylesheet" href="lpdoc.css" type="text/css"/><script type="text/javascript" src="lpdoc.js"></script><title>Plug-in points for abstract domains &mdash; The CiaoPP Program Processor v1.5</title></head><body><div class="lpdoc-page fixleftbar"><a href="#" id="sidebar-toggle-button" class="lpdoc-navbutton"><span id="sidebar-button-arrow">&#9776;</span></a><div id="sidebar" class="lpdoc-sidebar"><div style="height: 40px; margin-left: auto; margin-right: auto"><img src="ciao-logo_autofig.png" width=auto height=100%></div><div class="lpdoc-nav"><span class="lpdoc-on-right"><a class="lpdoc-navbutton" href="part_extensions.html">&#x2191;</a><a class="lpdoc-navbutton" href="adding_new_domain.html">&#x2190;</a><a class="lpdoc-navbutton" href="part_internals.html">&#x2192;</a><a class="lpdoc-navbutton" href="ciaopp_ref_mansearch.html">&#x1F50D;</a></span><span><a href="ciaopp_ref_manfulltoc.html">TOC</a></span></div><hr></hr><ul class="lpdoc-itemize-sectpath"><li><a href="ciaopp_ref_man.html">The CiaoPP Program Processor</a> &raquo;<br/> </li><li><a href="part_extensions.html">PART III - Extending CiaoPP</a> &raquo;<br/> </li><li><a href=""><strong>Plug-in points for abstract domains</strong></a></li></ul><hr></hr><em>ON THIS PAGE</em><ul><li><a href="#Variable naming convention for CiaoPP domains">Variable naming convention for CiaoPP domains</a></li><li><a href="#Usage and interface">Usage and interface</a></li><li><a href="#Documentation on exports">Documentation on exports</a></li><li><a href="#Documentation on multifiles">Documentation on multifiles</a></li><li><a href="#Documentation on internals">Documentation on internals</a></li><li><a href="#Documentation on imports">Documentation on imports</a></li></ul></div><div class="lpdoc-main"><div id=""><h1>Plug-in points for abstract domains</h1><a class="lpdoc-idx-anchor" href="ciaopp_ref_mansearch.html#domains"></a> <strong>Author(s):</strong> <a class="lpdoc-idx-anchor" id="Maria Garcia de la Banda" href="ciaopp_ref_mansearch.html#Maria Garcia de la Banda">Maria Garcia de la Banda</a>, <a class="lpdoc-idx-anchor" id="Francisco Bueno" href="ciaopp_ref_mansearch.html#Francisco Bueno">Francisco Bueno</a>, <a class="lpdoc-idx-anchor" id="Jose F. Morales" href="ciaopp_ref_mansearch.html#Jose F. Morales">Jose F. Morales (aidomain package)</a>.<p> This module contains the predicates for selecting the abstract operations that correspond to an analysis domain. The selection depends on the name of the domain given as first argument to all predicates. Whenever a new domain is added to the system, a new clause for each predicate exported here will be needed to call the corresponding domain operation in the domain module. Some local operations used but not exported by this module would have to be defined, too. See the following chapter for an example domain module.<p>Adding an analysis domain to PLAI requires only changes in this module. However, in order for other CiaoPP operations to work, you may need to change other modules. See, for example, module <tt>infer_dom</tt>.<p>In this chapter, arguments referred to as <tt>Sv</tt>, <tt>Hv</tt>, <tt>Fv</tt>, <tt>Qv</tt>, <tt>Vars</tt> are lists of program variables and are supposed to always be sorted. Abstract substitutions are referred to as <tt>ASub</tt>, and are also supposed sorted (except where indicated), although this depends on the domain.<p><div id="Variable naming convention for CiaoPP domains"><h2>Variable naming convention for CiaoPP domains</h2> <p>Both in the PLAI fixpoints and domains, for simplicity, we use the following variable name meanings:<p><ul> <li><span class="lpdoc-var">AbsInt</span> : identifier of the abstract interpreter being used. <li><span class="lpdoc-var">Sg</span> : Subgoal being analysed. <li><span class="lpdoc-var">SgKey</span> : Subgoal key (represented by functor/arity). <li><span class="lpdoc-var">Head</span> : Head of the clause being analysed. <li><span class="lpdoc-var">Sv</span> : Subgoal variables. <li><span class="lpdoc-var">Hv</span> : Head variables. <li><span class="lpdoc-var">Fv</span> : Free variables in the body of the clause being considered. <li><span class="lpdoc-var">Vars</span> : Any possible set of variables. <li><span class="lpdoc-var">Call</span> : Abstract call substitution. <li><span class="lpdoc-var">Proj</span> : <span class="lpdoc-var">Call</span> projected onto <span class="lpdoc-var">Sv</span>. <li><span class="lpdoc-var">Entry</span> : Abstract entry substitution (i.e. the abstract subtitution obtained after the abstract unification of <span class="lpdoc-var">Sg</span> and <span class="lpdoc-var">Head</span> projected onto <span class="lpdoc-var">Hv</span> + <span class="lpdoc-var">Fv</span>). <li><span class="lpdoc-var">Exit</span> : Abstract exit substitution (i.e. the abstract subtitution obtained after the analysis of the clause being considered projected onto <span class="lpdoc-var">Hv</span>). <li><span class="lpdoc-var">Prime</span> : Abstract prime substitution (i.e. the abstract subtitution obtained after the analysis of the clause being considered projected onto <span class="lpdoc-var">Sv</span>). <li><span class="lpdoc-var">Succ</span> : Abstract success substitution (i.e. the abstract subtitution obtained after the analysis of the clause being considered extended to the variables of the clause in which Sg appears). <li><span class="lpdoc-var">ASub</span> : Any possible abstract substitution. <li><span class="lpdoc-var">R_flag</span> : Flag which represents the recursive characteristics of a predicate. It will be ``nr&apos;&apos; in case the predicate be non recursive. Otherwise it will be r (recursive). <li><span class="lpdoc-var">List</span> : (can be represented as <span class="lpdoc-var">OldList</span>,<span class="lpdoc-var">List</span>,<span class="lpdoc-var">AddList</span>,<span class="lpdoc-var">IdList</span>,<span class="lpdoc-var">NewList</span>) current the list of nodes which a given node depends on. <li><span class="lpdoc-var">_s</span> : The suffix <span class="lpdoc-var">_s</span> means that the term to which the variable is bound to has been sorted. By default they are always sorted thus <span class="lpdoc-var">_s</span> is added only when it appears neccessary to say it explicitely. <li><span class="lpdoc-var">_uns</span> : The suffix <span class="lpdoc-var">_uns</span> means that the term to which the variable is bound is not sorted. <li><span class="lpdoc-var">ExtraInfo</span>: Info computed during the <a class="lpdoc-idx-anchor" id="0" href="ciaopp_ref_mansearch.html#call_to_entry"><tt>call_to_entry</tt></a> that can be reused during the <a class="lpdoc-idx-anchor" id="1" href="ciaopp_ref_mansearch.html#exit_to_prime"><tt>exit_to_prime</tt></a> step. </ul> </div><br/><div id="Usage and interface"><h2>Usage and interface</h2><div class="lpdoc-cartouche"><ul><li><strong>Library usage:</strong><br/><tt>:- use_module(ciaopp(plai/domains)).</tt><li><strong>Exports:</strong><br/><ul class="lpdoc-itemize-minus"><li><em>Predicates:</em><br/><a class="lpdoc-idx-anchor" id="2" href="#init_abstract_domain/2"><tt>init_abstract_domain/2</tt></a>, <a class="lpdoc-idx-anchor" id="3" href="#amgu/5"><tt>amgu/5</tt></a>, <a class="lpdoc-idx-anchor" id="4" href="#augment_asub/4"><tt>augment_asub/4</tt></a>, <a class="lpdoc-idx-anchor" id="5" href="#augment_two_asub/4"><tt>augment_two_asub/4</tt></a>, <a class="lpdoc-idx-anchor" id="6" href="#call_to_entry/10"><tt>call_to_entry/10</tt></a>, <a class="lpdoc-idx-anchor" id="7" href="#exit_to_prime/8"><tt>exit_to_prime/8</tt></a>, <a class="lpdoc-idx-anchor" id="8" href="def.html#project/5"><tt>project/5</tt></a>, <a class="lpdoc-idx-anchor" id="9" href="#project/6"><tt>project/6</tt></a>, <a class="lpdoc-idx-anchor" id="10" href="#needs/2"><tt>needs/2</tt></a>, <a class="lpdoc-idx-anchor" id="11" href="#widencall/4"><tt>widencall/4</tt></a>, <a class="lpdoc-idx-anchor" id="12" href="#dual_widencall/4"><tt>dual_widencall/4</tt></a>, <a class="lpdoc-idx-anchor" id="13" href="sharing_clique.html#widen/4"><tt>widen/4</tt></a>, <a class="lpdoc-idx-anchor" id="14" href="#dual_widen/4"><tt>dual_widen/4</tt></a>, <a class="lpdoc-idx-anchor" id="15" href="#normalize_asub/3"><tt>normalize_asub/3</tt></a>, <a class="lpdoc-idx-anchor" id="16" href="#compute_lub/3"><tt>compute_lub/3</tt></a>, <a class="lpdoc-idx-anchor" id="17" href="#compute_glb/3"><tt>compute_glb/3</tt></a>, <a class="lpdoc-idx-anchor" id="18" href="#identical_proj/5"><tt>identical_proj/5</tt></a>, <a class="lpdoc-idx-anchor" id="19" href="#identical_proj_1/7"><tt>identical_proj_1/7</tt></a>, <a class="lpdoc-idx-anchor" id="20" href="#identical_abstract/3"><tt>identical_abstract/3</tt></a>, <a class="lpdoc-idx-anchor" id="21" href="#abs_sort/3"><tt>abs_sort/3</tt></a>, <a class="lpdoc-idx-anchor" id="22" href="#extend/6"><tt>extend/6</tt></a>, <a class="lpdoc-idx-anchor" id="23" href="#less_or_equal_proj/5"><tt>less_or_equal_proj/5</tt></a>, <a class="lpdoc-idx-anchor" id="24" href="#less_or_equal/3"><tt>less_or_equal/3</tt></a>, <a class="lpdoc-idx-anchor" id="25" href="#glb/4"><tt>glb/4</tt></a>, <a class="lpdoc-idx-anchor" id="26" href="#eliminate_equivalent/3"><tt>eliminate_equivalent/3</tt></a>, <a class="lpdoc-idx-anchor" id="27" href="#abs_subset/3"><tt>abs_subset/3</tt></a>, <a class="lpdoc-idx-anchor" id="28" href="#call_to_success_fact/10"><tt>call_to_success_fact/10</tt></a>, <a class="lpdoc-idx-anchor" id="29" href="#special_builtin/6"><tt>special_builtin/6</tt></a>, <a class="lpdoc-idx-anchor" id="30" href="#body_succ_builtin/9"><tt>body_succ_builtin/9</tt></a>, <a class="lpdoc-idx-anchor" id="31" href="#success_builtin/7"><tt>success_builtin/7</tt></a>, <a class="lpdoc-idx-anchor" id="32" href="#obtain_info/5"><tt>obtain_info/5</tt></a>, <a class="lpdoc-idx-anchor" id="33" href="#info_to_asub/7"><tt>info_to_asub/7</tt></a>, <a class="lpdoc-idx-anchor" id="34" href="#full_info_to_asub/5"><tt>full_info_to_asub/5</tt></a>, <a class="lpdoc-idx-anchor" id="35" href="#asub_to_info/5"><tt>asub_to_info/5</tt></a>, <a class="lpdoc-idx-anchor" id="36" href="#asub_to_native/6"><tt>asub_to_native/6</tt></a>, <a class="lpdoc-idx-anchor" id="37" href="#concrete/4"><tt>concrete/4</tt></a>, <a class="lpdoc-idx-anchor" id="38" href="#unknown_call/5"><tt>unknown_call/5</tt></a>, <a class="lpdoc-idx-anchor" id="39" href="#unknown_entry/4"><tt>unknown_entry/4</tt></a>, <a class="lpdoc-idx-anchor" id="40" href="#empty_entry/4"><tt>empty_entry/4</tt></a>, <a class="lpdoc-idx-anchor" id="41" href="#part_conc/5"><tt>part_conc/5</tt></a>, <a class="lpdoc-idx-anchor" id="42" href="#multi_part_conc/4"><tt>multi_part_conc/4</tt></a>, <a class="lpdoc-idx-anchor" id="43" href="#collect_types_in_abs/4"><tt>collect_types_in_abs/4</tt></a>, <a class="lpdoc-idx-anchor" id="44" href="#rename_types_in_abs/4"><tt>rename_types_in_abs/4</tt></a>, <a class="lpdoc-idx-anchor" id="45" href="#dom_statistics/2"><tt>dom_statistics/2</tt></a>, <a class="lpdoc-idx-anchor" id="46" href="#abstract_instance/5"><tt>abstract_instance/5</tt></a>, <a class="lpdoc-idx-anchor" id="47" href="#contains_parameters/2"><tt>contains_parameters/2</tt></a>, <a class="lpdoc-idx-anchor" id="48" href="#absub_eliminate_equivalent/3"><tt>absub_eliminate_equivalent/3</tt></a>, <a class="lpdoc-idx-anchor" id="49" href="#absub_fixpoint_covered/3"><tt>absub_fixpoint_covered/3</tt></a>, <a class="lpdoc-idx-anchor" id="50" href="#body_builtin/9"><tt>body_builtin/9</tt></a>, <a class="lpdoc-idx-anchor" id="51" href="#undef_call_to_success_builtin/2"><tt>undef_call_to_success_builtin/2</tt></a>. <li><em>Multifiles:</em><br/><a class="lpdoc-idx-anchor" id="52" href="auto_interface.html#aidomain/1"><tt>aidomain/1</tt></a>, <a class="lpdoc-idx-anchor" id="53" href="aeq.html#aidom.init_abstract_domain/2"><tt>aidom.init_abstract_domain/2</tt></a>, <a class="lpdoc-idx-anchor" id="54" href="aeq.html#aidom.amgu/5"><tt>aidom.amgu/5</tt></a>, <a class="lpdoc-idx-anchor" id="55" href="aeq.html#aidom.augment_asub/4"><tt>aidom.augment_asub/4</tt></a>, <a class="lpdoc-idx-anchor" id="56" href="aeq.html#aidom.augment_two_asub/4"><tt>aidom.augment_two_asub/4</tt></a>, <a class="lpdoc-idx-anchor" id="57" href="aeq.html#aidom.call_to_entry/10"><tt>aidom.call_to_entry/10</tt></a>, <a class="lpdoc-idx-anchor" id="58" href="aeq.html#aidom.exit_to_prime/8"><tt>aidom.exit_to_prime/8</tt></a>, <a class="lpdoc-idx-anchor" id="59" href="aeq.html#aidom.project/6"><tt>aidom.project/6</tt></a>, <a class="lpdoc-idx-anchor" id="60" href="aeq.html#aidom.widencall/4"><tt>aidom.widencall/4</tt></a>, <a class="lpdoc-idx-anchor" id="61" href="aeq.html#aidom.needs/2"><tt>aidom.needs/2</tt></a>, <a class="lpdoc-idx-anchor" id="62" href="aeq.html#aidom.widen/4"><tt>aidom.widen/4</tt></a>, <a class="lpdoc-idx-anchor" id="63" href="aeq.html#aidom.compute_lub/3"><tt>aidom.compute_lub/3</tt></a>, <a class="lpdoc-idx-anchor" id="64" href="aeq.html#aidom.compute_clauses_lub/4"><tt>aidom.compute_clauses_lub/4</tt></a>, <a class="lpdoc-idx-anchor" id="65" href="aeq.html#aidom.compute_clauses_glb/4"><tt>aidom.compute_clauses_glb/4</tt></a>, <a class="lpdoc-idx-anchor" id="66" href="aeq.html#aidom.fixpoint_covered/3"><tt>aidom.fixpoint_covered/3</tt></a>, <a class="lpdoc-idx-anchor" id="67" href="aeq.html#aidom.fixpoint_covered_gfp/3"><tt>aidom.fixpoint_covered_gfp/3</tt></a>, <a class="lpdoc-idx-anchor" id="68" href="aeq.html#aidom.identical_abstract/3"><tt>aidom.identical_abstract/3</tt></a>, <a class="lpdoc-idx-anchor" id="69" href="aeq.html#aidom.abs_sort/3"><tt>aidom.abs_sort/3</tt></a>, <a class="lpdoc-idx-anchor" id="70" href="aeq.html#aidom.extend/6"><tt>aidom.extend/6</tt></a>, <a class="lpdoc-idx-anchor" id="71" href="aeq.html#aidom.less_or_equal/3"><tt>aidom.less_or_equal/3</tt></a>, <a class="lpdoc-idx-anchor" id="72" href="aeq.html#aidom.glb/4"><tt>aidom.glb/4</tt></a>, <a class="lpdoc-idx-anchor" id="73" href="aeq.html#aidom.eliminate_equivalent/3"><tt>aidom.eliminate_equivalent/3</tt></a>, <a class="lpdoc-idx-anchor" id="74" href="aeq.html#aidom.abs_subset/3"><tt>aidom.abs_subset/3</tt></a>, <a class="lpdoc-idx-anchor" id="75" href="aeq.html#aidom.call_to_success_fact/10"><tt>aidom.call_to_success_fact/10</tt></a>, <a class="lpdoc-idx-anchor" id="76" href="aeq.html#aidom.special_builtin/6"><tt>aidom.special_builtin/6</tt></a>, <a class="lpdoc-idx-anchor" id="77" href="aeq.html#aidom.combined_special_builtin0/3"><tt>aidom.combined_special_builtin0/3</tt></a>, <a class="lpdoc-idx-anchor" id="78" href="aeq.html#aidom.body_succ_builtin/9"><tt>aidom.body_succ_builtin/9</tt></a>, <a class="lpdoc-idx-anchor" id="79" href="aeq.html#aidom.split_combined_domain/4"><tt>aidom.split_combined_domain/4</tt></a>, <a class="lpdoc-idx-anchor" id="80" href="aeq.html#aidom.success_builtin/7"><tt>aidom.success_builtin/7</tt></a>, <a class="lpdoc-idx-anchor" id="81" href="aeq.html#aidom.call_to_success_builtin/7"><tt>aidom.call_to_success_builtin/7</tt></a>, <a class="lpdoc-idx-anchor" id="82" href="aeq.html#aidom.obtain_info/5"><tt>aidom.obtain_info/5</tt></a>, <a class="lpdoc-idx-anchor" id="83" href="aeq.html#aidom.input_interface/5"><tt>aidom.input_interface/5</tt></a>, <a class="lpdoc-idx-anchor" id="84" href="aeq.html#aidom.input_user_interface/6"><tt>aidom.input_user_interface/6</tt></a>, <a class="lpdoc-idx-anchor" id="85" href="aeq.html#aidom.asub_to_native/6"><tt>aidom.asub_to_native/6</tt></a>, <a class="lpdoc-idx-anchor" id="86" href="aeq.html#aidom.concrete/4"><tt>aidom.concrete/4</tt></a>, <a class="lpdoc-idx-anchor" id="87" href="aeq.html#aidom.unknown_call/5"><tt>aidom.unknown_call/5</tt></a>, <a class="lpdoc-idx-anchor" id="88" href="aeq.html#aidom.unknown_entry/4"><tt>aidom.unknown_entry/4</tt></a>, <a class="lpdoc-idx-anchor" id="89" href="aeq.html#aidom.empty_entry/4"><tt>aidom.empty_entry/4</tt></a>, <a class="lpdoc-idx-anchor" id="90" href="aeq.html#aidom.part_conc/5"><tt>aidom.part_conc/5</tt></a>, <a class="lpdoc-idx-anchor" id="91" href="aeq.html#aidom.multi_part_conc/4"><tt>aidom.multi_part_conc/4</tt></a>, <a class="lpdoc-idx-anchor" id="92" href="aeq.html#aidom.collect_auxinfo_asub/4"><tt>aidom.collect_auxinfo_asub/4</tt></a>, <a class="lpdoc-idx-anchor" id="93" href="aeq.html#aidom.rename_auxinfo_asub/4"><tt>aidom.rename_auxinfo_asub/4</tt></a>, <a class="lpdoc-idx-anchor" id="94" href="aeq.html#aidom.dom_statistics/2"><tt>aidom.dom_statistics/2</tt></a>, <a class="lpdoc-idx-anchor" id="95" href="aeq.html#aidom.contains_parameters/2"><tt>aidom.contains_parameters/2</tt></a>. </ul></ul></div></div><div id="Documentation on exports"><h2>Documentation on exports</h2><div><div class="lpdoc-defname"><span class="lpdoc-predtag">PREDICATE</span><a class="lpdoc-idx-anchor" id="init_abstract_domain/2" href="ciaopp_ref_mansearch.html#init_abstract_domain/2">init_abstract_domain/2</a></div><div class="lpdoc-deftext"><span class="lpdoc-usage-decl"><tt>init_abstract_domain(AbsInt,PushedFlags)</tt> </span><p>Initializes abstract domain <span class="lpdoc-var">AbsInt</span>. Tells the list of modified (pushed) PP flags to pop afterwards.</div></div><p> <div><div class="lpdoc-defname"><span class="lpdoc-predtag">PREDICATE</span><a class="lpdoc-idx-anchor" id="amgu/5" href="ciaopp_ref_mansearch.html#amgu/5">amgu/5</a></div><div class="lpdoc-deftext"><p><span class="lpdoc-usage-header">Usage:</span><span class="lpdoc-usage-decl"><tt>amgu(AbsInt,Sg,Head,ASub,AMGU)</tt> </span><p>Perform the abstract unification <span class="lpdoc-var">AMGU</span> between <span class="lpdoc-var">Sg</span> and <span class="lpdoc-var">Head</span> given an initial abstract substitution <span class="lpdoc-var">ASub</span> and abstract domain <span class="lpdoc-var">AbsInt</span>.</p><ul class="lpdoc-itemize-minus"><li><em>The following properties should hold at call time:</em><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="96" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">AbsInt</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="97" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">Sg</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="98" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">Head</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="99" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">ASub</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="100" href="ciaopp_ref_mansearch.html#var/1"><tt>var/1</tt></a>)</span><span><span class="lpdoc-var">AMGU</span> is a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="101" href="basic_props.html#atm/1"><tt>atm/1</tt></a>)</span><span><span class="lpdoc-var">AbsInt</span> is an atom. </span> <li><em>The following properties should hold globally:</em><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="102" href="native_props_nfdet_doc.html#not_fails/1"><tt>not_fails/1</tt></a>)</span><span>All the calls of the form <span class="lpdoc-var">amgu(AbsInt,Sg,Head,ASub,AMGU)</span> do not fail. </span> </ul></div></div><p> <div><div class="lpdoc-defname"><span class="lpdoc-predtag">PREDICATE</span><a class="lpdoc-idx-anchor" id="augment_asub/4" href="ciaopp_ref_mansearch.html#augment_asub/4">augment_asub/4</a></div><div class="lpdoc-deftext"><span class="lpdoc-usage-decl"><tt>augment_asub(AbsInt,ASub,Vars,ASub0)</tt> </span><p>Augment the abstract substitution <span class="lpdoc-var">ASub</span> adding the variables <span class="lpdoc-var">Vars</span> and then resulting the abstract substitution <span class="lpdoc-var">ASub0</span>.</div></div><p> <div><div class="lpdoc-defname"><span class="lpdoc-predtag">PREDICATE</span><a class="lpdoc-idx-anchor" id="augment_two_asub/4" href="ciaopp_ref_mansearch.html#augment_two_asub/4">augment_two_asub/4</a></div><div class="lpdoc-deftext"><span class="lpdoc-usage-decl"><tt>augment_two_asub(AbsInt,ASub0,ASub1,ASub)</tt> </span><p><span class="lpdoc-var">ASub</span> is an abstract substitution resulting of augmenting two abstract substitutions: <span class="lpdoc-var">ASub0</span> and <span class="lpdoc-var">ASub1</span> whose domains are disjoint.</div></div><p> <div><div class="lpdoc-defname"><span class="lpdoc-predtag">PREDICATE</span><a class="lpdoc-idx-anchor" id="call_to_entry/10" href="ciaopp_ref_mansearch.html#call_to_entry/10">call_to_entry/10</a></div><div class="lpdoc-deftext"><p><span class="lpdoc-usage-header">Usage:</span><span class="lpdoc-usage-decl"><tt>call_to_entry(AbsInt,Sv,Sg,Hv,Head,ClauseKey,Fv,Proj,Entry,ExtraInfo)</tt> </span><p>Obtains the abstract substitution <span class="lpdoc-var">Entry</span> which results from adding the abstraction of the unification <span class="lpdoc-var">Sg</span> = <span class="lpdoc-var">Head</span> to abstract substitution <span class="lpdoc-var">Proj</span> (the call substitution for <span class="lpdoc-var">Sg</span> projected on its variables <span class="lpdoc-var">Sv</span>) and then projecting the resulting substitution onto <span class="lpdoc-var">Hv</span> (the variables of <span class="lpdoc-var">Head</span>) plus <span class="lpdoc-var">Fv</span> (the free variables of the relevant clause). <span class="lpdoc-var">ExtraInfo</span> is information which may be reused later in other abstract operations.<p><div class="lpdoc-alert"> <strong>Assumtions</strong>: This predicate assumes that the variables in <span class="lpdoc-var">Sv</span> and <span class="lpdoc-var">Proj</span> are sorted (see sortedness for each domain). </div>.</p><ul class="lpdoc-itemize-minus"><li><em>The following properties should hold at call time:</em><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="103" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">AbsInt</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="104" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">Sv</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="105" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">Sg</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="106" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">Hv</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="107" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">Head</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="108" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">ClauseKey</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="109" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">Fv</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="110" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">Proj</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="111" href="ciaopp_ref_mansearch.html#var/1"><tt>var/1</tt></a>)</span><span><span class="lpdoc-var">Entry</span> is a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="112" href="ciaopp_ref_mansearch.html#var/1"><tt>var/1</tt></a>)</span><span><span class="lpdoc-var">ExtraInfo</span> is a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="113" href="basic_props.html#atm/1"><tt>atm/1</tt></a>)</span><span><span class="lpdoc-var">AbsInt</span> is an atom. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="114" href="basic_props.html#list/1"><tt>list/1</tt></a>)</span><span><span class="lpdoc-var">Sv</span> is a list. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="115" href="basic_props.html#list/1"><tt>list/1</tt></a>)</span><span><span class="lpdoc-var">Hv</span> is a list. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="116" href="basic_props.html#list/1"><tt>list/1</tt></a>)</span><span><span class="lpdoc-var">Fv</span> is a list. </span> <li><em>The following properties should hold globally:</em><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="117" href="native_props_nfdet_doc.html#not_fails/1"><tt>not_fails/1</tt></a>)</span><span>All the calls of the form <span class="lpdoc-var">call_to_entry(AbsInt,Sv,Sg,Hv,Head,ClauseKey,Fv,Proj,Entry,ExtraInfo)</span> do not fail. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="118" href="native_props_nfdet_doc.html#is_det/1"><tt>is_det/1</tt></a>)</span><span>All calls of the form <span class="lpdoc-var">call_to_entry(AbsInt,Sv,Sg,Hv,Head,ClauseKey,Fv,Proj,Entry,ExtraInfo)</span> are deterministic. </span> </ul></div></div><p> <div><div class="lpdoc-defname"><span class="lpdoc-predtag">PREDICATE</span><a class="lpdoc-idx-anchor" id="exit_to_prime/8" href="ciaopp_ref_mansearch.html#exit_to_prime/8">exit_to_prime/8</a></div><div class="lpdoc-deftext"><p><span class="lpdoc-usage-header">Usage:</span><span class="lpdoc-usage-decl"><tt>exit_to_prime(AbsInt,Sg,Hv,Head,Sv,Exit,ExtraInfo,Prime)</tt> </span><p>Computes the abstract substitution <span class="lpdoc-var">Prime</span> which results from adding the abstraction of the unification <span class="lpdoc-var">Sg</span> = <span class="lpdoc-var">Head</span> to abstract substitution <span class="lpdoc-var">Exit</span> (the exit substitution for a clause <span class="lpdoc-var">Head</span> projected over its variables <span class="lpdoc-var">Hv</span>), projecting the resulting substitution onto <span class="lpdoc-var">Sv</span>.</p><ul class="lpdoc-itemize-minus"><li><em>The following properties should hold at call time:</em><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="119" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">AbsInt</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="120" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">Sg</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="121" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">Hv</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="122" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">Head</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="123" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">Sv</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="124" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">Exit</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="125" href="ciaopp_ref_mansearch.html#var/1"><tt>var/1</tt></a>)</span><span><span class="lpdoc-var">Prime</span> is a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="126" href="basic_props.html#atm/1"><tt>atm/1</tt></a>)</span><span><span class="lpdoc-var">AbsInt</span> is an atom. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="127" href="basic_props.html#list/2"><tt>list/2</tt></a>)</span><span><span class="lpdoc-var">Hv</span> is a list of <span class="lpdoc-var">var</span>s. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="128" href="basic_props.html#list/2"><tt>list/2</tt></a>)</span><span><span class="lpdoc-var">Sv</span> is a list of <span class="lpdoc-var">var</span>s. </span> <li><em>The following properties should hold globally:</em><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="129" href="native_props_nfdet_doc.html#not_fails/1"><tt>not_fails/1</tt></a>)</span><span>All the calls of the form <span class="lpdoc-var">exit_to_prime(AbsInt,Sg,Hv,Head,Sv,Exit,ExtraInfo,Prime)</span> do not fail. </span> </ul></div></div><p> <div><div class="lpdoc-defname"><span class="lpdoc-predtag">PREDICATE</span><a class="lpdoc-idx-anchor" id="project/5" href="ciaopp_ref_mansearch.html#project/5">project/5</a></div><div class="lpdoc-deftext"><p><span class="lpdoc-usage-header">Usage:</span><span class="lpdoc-usage-decl"><tt>project(AbsInt,Vars,HvFv_u,ASub,Proj)</tt> </span><p>Projects the abstract substitution <span class="lpdoc-var">ASub</span> onto the variables of list <span class="lpdoc-var">Vars</span> resulting in the projected abstract substitution <span class="lpdoc-var">Proj</span>.</p><ul class="lpdoc-itemize-minus"><li><em>The following properties should hold at call time:</em><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="130" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">AbsInt</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="131" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">Vars</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="132" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">HvFv_u</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="133" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">ASub</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="134" href="ciaopp_ref_mansearch.html#var/1"><tt>var/1</tt></a>)</span><span><span class="lpdoc-var">Proj</span> is a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="135" href="basic_props.html#atm/1"><tt>atm/1</tt></a>)</span><span><span class="lpdoc-var">AbsInt</span> is an atom. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="136" href="basic_props.html#list/1"><tt>list/1</tt></a>)</span><span><span class="lpdoc-var">Vars</span> is a list. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="137" href="basic_props.html#list/1"><tt>list/1</tt></a>)</span><span><span class="lpdoc-var">HvFv_u</span> is a list. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="138" href="basic_props.html#term/1"><tt>term/1</tt></a>)</span><span><span class="lpdoc-var">ASub</span> is any term. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="139" href="basic_props.html#term/1"><tt>term/1</tt></a>)</span><span><span class="lpdoc-var">Proj</span> is any term. </span> <li><em>The following properties should hold globally:</em><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="140" href="native_props_nfdet_doc.html#not_fails/1"><tt>not_fails/1</tt></a>)</span><span>All the calls of the form <span class="lpdoc-var">project(AbsInt,Vars,HvFv_u,ASub,Proj)</span> do not fail. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="141" href="native_props_nfdet_doc.html#is_det/1"><tt>is_det/1</tt></a>)</span><span>All calls of the form <span class="lpdoc-var">project(AbsInt,Vars,HvFv_u,ASub,Proj)</span> are deterministic. </span> </ul></div></div><p> <div><div class="lpdoc-defname"><span class="lpdoc-predtag">PREDICATE</span><a class="lpdoc-idx-anchor" id="project/6" href="ciaopp_ref_mansearch.html#project/6">project/6</a></div><div class="lpdoc-deftext"><p><span class="lpdoc-usage-header">Usage:</span><span class="lpdoc-usage-decl"><tt>project(AbsInt,Sg,Vars,HvFv_u,ASub,Proj)</tt> </span><p>Projects the abstract substitution <span class="lpdoc-var">ASub</span> onto the variables of list <span class="lpdoc-var">Vars</span> resulting in the projected abstract substitution <span class="lpdoc-var">Proj</span>.</p><ul class="lpdoc-itemize-minus"><li><em>The following properties should hold at call time:</em><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="142" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">AbsInt</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="143" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">Sg</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="144" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">Vars</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="145" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">HvFv_u</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="146" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">ASub</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="147" href="ciaopp_ref_mansearch.html#var/1"><tt>var/1</tt></a>)</span><span><span class="lpdoc-var">Proj</span> is a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="148" href="basic_props.html#atm/1"><tt>atm/1</tt></a>)</span><span><span class="lpdoc-var">AbsInt</span> is an atom. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="149" href="basic_props.html#term/1"><tt>term/1</tt></a>)</span><span><span class="lpdoc-var">Sg</span> is any term. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="150" href="basic_props.html#list/1"><tt>list/1</tt></a>)</span><span><span class="lpdoc-var">Vars</span> is a list. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="151" href="basic_props.html#list/1"><tt>list/1</tt></a>)</span><span><span class="lpdoc-var">HvFv_u</span> is a list. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="152" href="basic_props.html#term/1"><tt>term/1</tt></a>)</span><span><span class="lpdoc-var">ASub</span> is any term. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="153" href="basic_props.html#term/1"><tt>term/1</tt></a>)</span><span><span class="lpdoc-var">Proj</span> is any term. </span> <li><em>The following properties should hold globally:</em><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="154" href="native_props_nfdet_doc.html#not_fails/1"><tt>not_fails/1</tt></a>)</span><span>All the calls of the form <span class="lpdoc-var">project(AbsInt,Sg,Vars,HvFv_u,ASub,Proj)</span> do not fail. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="155" href="native_props_nfdet_doc.html#is_det/1"><tt>is_det/1</tt></a>)</span><span>All calls of the form <span class="lpdoc-var">project(AbsInt,Sg,Vars,HvFv_u,ASub,Proj)</span> are deterministic. </span> </ul></div></div><p> <div><div class="lpdoc-defname"><span class="lpdoc-predtag">PREDICATE</span><a class="lpdoc-idx-anchor" id="needs/2" href="ciaopp_ref_mansearch.html#needs/2">needs/2</a></div><div class="lpdoc-deftext"><p><span class="lpdoc-usage-header">Usage:</span><span class="lpdoc-usage-decl"><tt>needs(AbsInt,Op)</tt> </span><p>Succeeds if <span class="lpdoc-var">AbsInt</span> needs operation <span class="lpdoc-var">Op</span> for correctness/termination. It must only be used for checking, not enumerating. The supported operations are: <tt>widen</tt> (whether widening is necessary for termination), <tt>clauses_lub</tt> (whether the lub must be performed over the abstract substitution split by clase), <tt>split_combined_domain</tt> (whether the domain contains information of several domains and it needs to be split), and <tt>aux_info</tt> (whether the information in the abstract substitutions is not complete and an external solver may be needed, currently only used when outputing the analysis in a <tt>.dump</tt> file)</p><ul class="lpdoc-itemize-minus"><li><em>The following properties should hold at call time:</em><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="156" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">AbsInt</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="157" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">Op</span> is currently a term which is not a free variable. </span> <li><em>The following properties should hold globally:</em><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="158" href="native_props_nfdet_doc.html#is_det/1"><tt>is_det/1</tt></a>)</span><span>All calls of the form <span class="lpdoc-var">needs(AbsInt,Op)</span> are deterministic. </span> </ul></div></div><p> <div><div class="lpdoc-defname"><span class="lpdoc-predtag">PREDICATE</span><a class="lpdoc-idx-anchor" id="widencall/4" href="ciaopp_ref_mansearch.html#widencall/4">widencall/4</a></div><div class="lpdoc-deftext"><p><span class="lpdoc-usage-header">Usage:</span><span class="lpdoc-usage-decl"><tt>widencall(AbsInt,ASub0,ASub1,ASub)</tt> </span><p><span class="lpdoc-var">ASub</span> is the result of widening abstract substitution <span class="lpdoc-var">ASub0</span> and <span class="lpdoc-var">ASub1</span>, which are supposed to be consecutive call patterns in a fixpoint computation.<p><div class="lpdoc-alert"> This predicate is allowed to fail and it fails if the domain does not define a widening on calls. </div> </p><ul class="lpdoc-itemize-minus"><li><em>The following properties should hold at call time:</em><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="159" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">AbsInt</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="160" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">ASub0</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="161" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">ASub1</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="162" href="ciaopp_ref_mansearch.html#var/1"><tt>var/1</tt></a>)</span><span><span class="lpdoc-var">ASub</span> is a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="163" href="basic_props.html#atm/1"><tt>atm/1</tt></a>)</span><span><span class="lpdoc-var">AbsInt</span> is an atom. </span> </ul></div></div><p> <div><div class="lpdoc-defname"><span class="lpdoc-predtag">PREDICATE</span><a class="lpdoc-idx-anchor" id="dual_widencall/4" href="ciaopp_ref_mansearch.html#dual_widencall/4">dual_widencall/4</a></div><div class="lpdoc-deftext"><span class="lpdoc-usage-decl"><tt>dual_widencall(AbsInt,ASub0,ASub1,ASub)</tt> </span><p><span class="lpdoc-var">ASub</span> is the result of dual widening abstract substitution <span class="lpdoc-var">ASub0</span> and <span class="lpdoc-var">ASub1</span>, which are supposed to be consecutive call patterns in a fixpoint computation.</div></div><p> <div><div class="lpdoc-defname"><span class="lpdoc-predtag">PREDICATE</span><a class="lpdoc-idx-anchor" id="widen/4" href="ciaopp_ref_mansearch.html#widen/4">widen/4</a></div><div class="lpdoc-deftext"><p><span class="lpdoc-usage-header">Usage:</span><span class="lpdoc-usage-decl"><tt>widen(AbsInt,ASub0,ASub1,ASub)</tt> </span><p><span class="lpdoc-var">ASub</span> is the result of widening abstract substitution <span class="lpdoc-var">ASub0</span> and <span class="lpdoc-var">ASub1</span>, which are supposed to be consecutive approximations to the same abstract value. I.e., <tt>less_or_equal(AbsInt,ASub0,ASub1)</tt> succeeds.</p><ul class="lpdoc-itemize-minus"><li><em>The following properties should hold at call time:</em><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="164" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">AbsInt</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="165" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">ASub0</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="166" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">ASub1</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="167" href="ciaopp_ref_mansearch.html#var/1"><tt>var/1</tt></a>)</span><span><span class="lpdoc-var">ASub</span> is a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="168" href="basic_props.html#atm/1"><tt>atm/1</tt></a>)</span><span><span class="lpdoc-var">AbsInt</span> is an atom. </span> <li><em>The following properties should hold globally:</em><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="169" href="native_props_nfdet_doc.html#not_fails/1"><tt>not_fails/1</tt></a>)</span><span>All the calls of the form <span class="lpdoc-var">widen(AbsInt,ASub0,ASub1,ASub)</span> do not fail. </span> </ul></div></div><p> <div><div class="lpdoc-defname"><span class="lpdoc-predtag">PREDICATE</span><a class="lpdoc-idx-anchor" id="dual_widen/4" href="ciaopp_ref_mansearch.html#dual_widen/4">dual_widen/4</a></div><div class="lpdoc-deftext"><span class="lpdoc-usage-decl"><tt>dual_widen(AbsInt,ASub0,ASub1,ASub)</tt> </span><p><span class="lpdoc-var">ASub</span> is the result of dual widening abstract substitution <span class="lpdoc-var">ASub0</span> and <span class="lpdoc-var">ASub1</span>, which are supposed to be consecutive approximations to the same abstract value.</div></div><p> <div><div class="lpdoc-defname"><span class="lpdoc-predtag">PREDICATE</span><a class="lpdoc-idx-anchor" id="normalize_asub/3" href="ciaopp_ref_mansearch.html#normalize_asub/3">normalize_asub/3</a></div><div class="lpdoc-deftext"><span class="lpdoc-usage-decl"><tt>normalize_asub(AbsInt,ASub0,ASub1)</tt> </span><p><span class="lpdoc-var">ASub1</span> is the result of normalizing abstract substitution <span class="lpdoc-var">ASub0</span>. This is required in some domains, specially to perform the widening.</div></div><p> <div><div class="lpdoc-defname"><span class="lpdoc-predtag">PREDICATE</span><a class="lpdoc-idx-anchor" id="compute_lub/3" href="ciaopp_ref_mansearch.html#compute_lub/3">compute_lub/3</a></div><div class="lpdoc-deftext"><p><span class="lpdoc-usage-header">Usage:</span><span class="lpdoc-usage-decl"><tt>compute_lub(AbsInt,ListASub,LubASub)</tt> </span><p><span class="lpdoc-var">LubASub</span> is the least upper bound of the abstract substitutions in list <span class="lpdoc-var">ListASub</span>.</p><ul class="lpdoc-itemize-minus"><li><em>The following properties should hold at call time:</em><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="170" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">AbsInt</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="171" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">ListASub</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="172" href="ciaopp_ref_mansearch.html#var/1"><tt>var/1</tt></a>)</span><span><span class="lpdoc-var">LubASub</span> is a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="173" href="basic_props.html#atm/1"><tt>atm/1</tt></a>)</span><span><span class="lpdoc-var">AbsInt</span> is an atom. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="174" href="basic_props.html#list/1"><tt>list/1</tt></a>)</span><span><span class="lpdoc-var">ListASub</span> is a list. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="175" href="basic_props.html#term/1"><tt>term/1</tt></a>)</span><span><span class="lpdoc-var">LubASub</span> is any term. </span> <li><em>The following properties should hold globally:</em><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="176" href="native_props_nfdet_doc.html#not_fails/1"><tt>not_fails/1</tt></a>)</span><span>All the calls of the form <span class="lpdoc-var">compute_lub(AbsInt,ListASub,LubASub)</span> do not fail. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="177" href="native_props_nfdet_doc.html#is_det/1"><tt>is_det/1</tt></a>)</span><span>All calls of the form <span class="lpdoc-var">compute_lub(AbsInt,ListASub,LubASub)</span> are deterministic. </span> </ul></div></div><p> <div><div class="lpdoc-defname"><span class="lpdoc-predtag">PREDICATE</span><a class="lpdoc-idx-anchor" id="compute_glb/3" href="ciaopp_ref_mansearch.html#compute_glb/3">compute_glb/3</a></div><div class="lpdoc-deftext"><span class="lpdoc-usage-decl"><tt>compute_glb(AbsInt,ListASub,GlbASub)</tt> </span><p><span class="lpdoc-var">GlbASub</span> is the greatest lower bound of the abstract substitutions in list <span class="lpdoc-var">ListASub</span>.</div></div><p> <div><div class="lpdoc-defname"><span class="lpdoc-predtag">PREDICATE</span><a class="lpdoc-idx-anchor" id="identical_proj/5" href="ciaopp_ref_mansearch.html#identical_proj/5">identical_proj/5</a></div><div class="lpdoc-deftext"><p><span class="lpdoc-usage-header">Usage:</span><span class="lpdoc-usage-decl"><tt>identical_proj(AbsInt,Sg,Proj,Sg1,Proj1)</tt> </span><p>Abstract patterns <span class="lpdoc-var">Sg</span>:<span class="lpdoc-var">Proj</span> and <span class="lpdoc-var">Sg1</span>:<span class="lpdoc-var">Proj1</span> are equivalent in domain <span class="lpdoc-var">AbsInt</span>. Note that <span class="lpdoc-var">Proj</span> is assumed to be already sorted. <div class="lpdoc-alert"> This predicate unifies <span class="lpdoc-var">Sg</span> and <span class="lpdoc-var">Sg1</span>. </div> </p><ul class="lpdoc-itemize-minus"><li><em>The following properties should hold at call time:</em><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="178" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">AbsInt</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="179" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">Sg</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="180" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">Proj</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="181" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">Sg1</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc-on-right"> (<a class="lpdoc-idx-anchor" id="182" href="ciaopp_ref_mansearch.html#nonvar/1"><tt>nonvar/1</tt></a>)</span><span><span class="lpdoc-var">Proj1</span> is currently a term which is not a free variable. </span><br/><span class="lpdoc