Files
mercury/compiler/notes/promise_ex.html
Zoltan Somogyi f1fc2f6cb3 Clean up the assert ecosystem a bit.
compiler/accumulator.m:
    Give some predicates more meaningful names.

    Fix the copyright attribution.

compiler/assertion.m:
    Put related predicates next to each other.

    Give some predicates more meaningful names.

    Keep private the predicates that do not need to be exported.

compiler/hlds_promise.m:
    Merge the three separate interface sections into one; this module
    is not big enough to benefit from having them separate.

    Stop using pred_ids as keys in exclusive_tables.

compiler/check_promise.m:
    Conform to the change in hlds_promise.m.

    Add some comments.

compiler/notes/promise_ex.html:
    Fix some bit rot, and note some other bit rot.
2024-06-10 22:25:58 +10:00

140 lines
3.6 KiB
HTML

<!--
vim: ts=4 sw=4 expandtab ft=html
-->
<html>
<head>
<title>Promise Ex Declarations</title>
</head>
<body>
<h1>Promise Ex Declarations</h1>
This document is a description of promise ex declarations,
which are currently unfinished and as such are undocumented
in the reference manual.
<p>
<h2>Syntax</h2>
There are currently three promise ex declarations:
promise_exclusive, promise_exhaustive, and promise_exclusive_exhaustive.
They are used to denote determinism properties of a disjunction,
and denote either exclusivity, exhaustiveness, or both.
The examples of each, given below,
also show the different ways that existential quantification can be handled.
<ul>
<li>
Mutual exclusivity:
<pre>
:- all [X, Y] promise_exclusive
some [Z] (
p(X, Y, Z)
;
q(X, Y, Z)
).
</pre>
<li>
Exhaustiveness:
<pre>
:- all [X] promise_exhaustive
(
p(X, _)
;
q(X, _)
).
</pre>
<li>
Both together:
<pre>
:- all [X] promise_exclusive_exhaustive
some [Y] (
p(X, Y)
;
q(X, Y, Z)
).
</pre>
</ul>
All three declarations are restricted in the following ways:
<ul>
<li>
Any variable that occurs in more than one disjunct
must be explicitly quantified.
<li>
Any variable occurring in only one disjunct is existentially quantified.
This is similarly applicable when an underscore is used in place of a variable.
</ul>
<p>
<h2>Development</h2>
This tracks the use of promise ex declarations through the compiler,
and may be useful as a quick summary of the current state of development.
Items marked with an asterisk (*) are not yet implemented.
Places where data structures etc. have been defined are in italics.
(The module names listed have suffered bit rot.)
<ol>
<li>
The declarations enter the parse tree.
<ul>
<li>
<i>The operators are defined</i> (library/ops.m).
<li>
<i>The structure for promise ex declarations in the parse tree
is defined</i> (prog_data.m).
<li>
They are parsed and entered into the parse tree (parse_item.m).
</ul>
<li>
They may be pretty printed (mercury_to_mercury.m, parse_tree_out.m).
<li>
They are error checked, and entered into the HLDS as dummy predicates.
<ul>
<li>
Error checking (make_hlds.m).
<li>
Entering of declarations into the HLDS as dummy predicates (make_hlds.m).
</ul>
<li>
They go through typechecking as predicates.
After the typecheck, post-typecheck and purity passes of the front-end,
they are removed from processing as predicates
and entered into the appropriate table in the HLDS (by check_promises.m).
<ul>
<li>
Post typechecking processing initiated for promise ex declarations
(purity.m).
<li>
promise_exclusive and promise_exhaustive declarations
are indexed by the predicate calls made in them
in the exclusive table (post_typecheck.m).
<li>
<i>Definition of exclusive table as part of HLDS,
and operations on the table</i> (hlds_module.m).
<li>
(*) Where a promise_exhaustive declaration
is paired with a promise_exclusive declaration,
they are merged into a promise_exclusive_exhaustive declaration;
otherwise the promise_exhaustive declaration
is entered in the exhaustive table of the HLDS (post_typecheck.m).
<li>
(*) <i>Definition of exhaustive table as part of HLDS, and
operations on the table</i> (hlds_module.m).
</ul>
<li>
(*) Exclusivity information is used during switch detection,
and where it leads to a full switch being made,
applicable exhaustiveness information is also used (switch_detection.m).
<li>
(*) Exhaustiveness information is used
during determinism analysis (det_analysis.m)
or as an add-on to switch detection (switch_detection.m).
</ol>
</body>
</html>