Files
mercury/compiler/notes/promise_ex.html
Lars Yencken 4adfb9f7c2 Updating the development status of promise ex declarations.
Estimated hours taken: 0.2

compiler/notes/promise_ex.html:
	Updating the development status of promise ex declarations.
2002-02-23 23:36:38 +00:00

130 lines
3.5 KiB
HTML

<html>
<head>
<title>
Promise Ex Declarations
</title>
</head>
<body
bgcolor="#ffffff"
text="#000000"
>
<hr>
<!-------------------------->
<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>
<hr>
<!-------------------------->
<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:
<ol>
<li> Any variable that occurs in more than one disjunct must be
explicitly quantified.
<li> Any variable occuring in only one disjunct is existentially quantified.
This is similarly applicable when an underscore is used in place of a
variable.
</ol>
<p>
<hr>
<!-------------------------->
<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.
<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 (prog_io.m)
</ul>
<li> they may be pretty printed (mercury_to_mercury.m, prog_out.m).
<li> they are error checked, and entered in to 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> go through typechecking as predicates; after typechecking they
are removed from processing as predicates and entered into the
appropriate table in the HLDS
<ul>
<li> post typechecking processing initiated for promise ex
declarations (purity.m)
<li> promise_exlusive 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 declartion 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>