mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-22 21:03:53 +00:00
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.
140 lines
3.6 KiB
HTML
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>
|