[mercury-users] single-solution context

Fergus Henderson fjh at cs.mu.OZ.AU
Tue Oct 13 00:33:34 AEST 1998


On 12-Oct-1998, Martin Stein <ms40 at inf.tu-dresden.de> wrote:
> I'm getting a software-error because there's something not implemented but I
> don't know exactly why. This somehow silly example should explain it:
...
> :- pred add(xx,xx,xx).
> :- mode add(in,in,out) is cc_nondet.
> :- mode add(in,in,out) is nondet.
...
> and somewhere in a goal
>         Z1 = promise_only_solution(add(X,Y)),
> 
> this yields:
> 
> Software error: sorry, not implemented: taking address of pred
> `add/2' with multiple modes.
> (use an explicit lambda expression instead)

To elaborate on the parenthetical suggestion above,
in your example the higher-order term `add(X, Y)'
should be replaced with a lambda expression that specifies
which of the two modes you are taking the address of, i.e.
`(pred(Z::out) is cc_nondet :- add(X, Y, Z))'.

This requirement is mentioned in the "Creating higher-order terms"
section of the chapter on "Higher-order" in the Mercury Language
Reference Manual:

 |    If the predicate or function has more than one mode, you must use an
 |    explicit lambda expression to specify which mode you want.

The main reason for this restriction is to make it easier to implement;
that's why the compiler reports "sorry, not implemented: ..."
rather than "error: ...".  However, it would certainly be better
for the compiler to issue a proper error message with line numbers
rather than reporting the problem via error/1.

-- 
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.



More information about the users mailing list