[m-dev.] for review: document promise_only_solution/1 in lang ref man

Fergus Henderson fjh at cs.mu.OZ.AU
Fri Feb 18 00:31:41 AEDT 2000


Estimated hours taken: 0.75

doc/reference_manual.texi:
	Replace some old documentation about a planned
	`unique [X]' quantifier with a description of
	the `promise_only_solution' function in the
	standard library.

Workspace: /d-drive/home/hg/fjh/mercury
Index: doc/reference_manual.texi
===================================================================
RCS file: /home/mercury1/repository/mercury/doc/reference_manual.texi,v
retrieving revision 1.174
diff -u -d -r1.174 reference_manual.texi
--- doc/reference_manual.texi	2000/02/16 08:36:08	1.174
+++ doc/reference_manual.texi	2000/02/17 13:27:27
@@ -2370,34 +2370,43 @@
 but no matter which order you remove them,
 the maximum value in the set should be the same.
 
-We may eventually extend Mercury to allow users to write
+If you know that there will only ever be at most one distinct
+solution, then you can use the function
+ at samp{promise_only_solution/1}, which is defined
+as a builtin function in the Mercury standard library.
 
 @example
-unique [X] Goal
+:- func promise_only_solution(pred(T)) = T.
+:- mode promise_only_solution(pred(out) is cc_multi) = out is det.
+:- mode promise_only_solution(pred(out) is cc_nondet) = out is semidet.
 @end example
 
 @noindent
-as a special quantifier, meaning
-``there exists a unique @code{X} for which @samp{Goal} is true''.
-This would allow the implementation
-to prune alternative solutions for @samp{Goal}
-if @samp{X} was the only output variable of @samp{Goal}.  
+A call to that function, e.g. @samp{promise_only_solution(Pred)}, constitutes a
+promise on the part of the caller that the argument @samp{Pred} has at most
+one solution, i.e. that
+
+ at example
+not some [X1, X2] (Pred(X1), Pred(X2), X1 \= X2)
+ at end example
 
+ at noindent
+holds.  @samp{promise_only_solution(Pred)} presumes that this
+assumption is satisfied, and returns the value of @samp{X} for which
+ at samp{Pred(X)} is true, if any.  If the assumption is not
+satisfied, then the behaviour is undefined.
+
 Note that specifying a user-defined equivalence relation
 as the equality predicate for user-defined types (@pxref{Equality preds})
-means that the @samp{unique} quantifier
-could be used to express more general forms of equivalence.
+means that the @samp{promise_only_solution/1} function
+can be used to express more general forms of equivalence.
 For example, if you define a set type which represents sets as unsorted lists,
 you would want to define a user-defined equivalence relation for that type,
 which could sort the lists before comparing them.
-The @samp{unique} quantifier could then be used for sets
+The @samp{promise_only_solution/1} function could then be used for sets
 even though the lists used to represent the sets
 might not be in the same order in every solution.
 
-Currently the language does not support the @samp{unique} quantifier. 
-(However, it is possible to achieve a similar effect by using the C interface
-to type-cast a higher-order predicate term.)
-
 @node Committed choice nondeterminism
 @section Committed choice nondeterminism
 
 

-- 
Fergus Henderson <fjh at cs.mu.oz.au>  |  "I have always known that the pursuit
WWW: <http://www.cs.mu.oz.au/~fjh>  |  of excellence is a lethal habit"
PGP: finger fjh at 128.250.37.3        |     -- the last words of T. S. Garp.
--------------------------------------------------------------------------
mercury-developers mailing list
Post messages to:       mercury-developers at cs.mu.oz.au
Administrative Queries: owner-mercury-developers at cs.mu.oz.au
Subscriptions:          mercury-developers-request at cs.mu.oz.au
--------------------------------------------------------------------------



More information about the developers mailing list