# [mercury-users] ....use of solution/2

Ralph Becket rafe at cs.mu.OZ.AU
Mon Mar 22 08:23:43 AEDT 2004

```Stefan Hinterstoisser, Sunday, 21 March 2004:
>
> Thanx a lot for that... I`m just wondering if (because I looked it up
> and I`m not quite sure about it) I can give the solution/2 predicate
> also a predicate with several inputs (for sure only one output!)...

You can construct closures (or "partial applications") to do this.

For example,

Closure = find_route(Graph, Start, End),
Routes = solutions(Closure),
...

or equivalently just

Routes = solutions(find_route(Graph, Start, End)),
...

where you have find_route defined as

:- pred find_route(graph, vertex, vertex, list(vertex)).
:- mode find_route(in, in, in, out) is nondet.

> so would something like this work??
>
> pred predicat(out, in, in) is nondet.  ...
^^^^ I think you mean `mode' here.

The signature for solutions/1 is

:- func solutions(pred(T)) = list(T).
:- mode solutions(pred(out) is multi) = out(non_empty_list) is det.
:- mode solutions(pred(out) is nondet) = out is det.

so you'd either have to use a lambda to get things right

Closure = ( pred(X::out) is nondet :- predicat(X, A, B) ),
Solutions = solutions(Closure),
...

or a "wrapper" predicate to do the same thing:

Solutions = solutions(reordered_predicat(A, B)),
...

where

:- pred reordered_predicat(..., ..., ...).
:- mode reordered_predicat(in, in, out).

reordered_predicat(A, B, X) :- predicate(X, A, B).

-- Ralph
--------------------------------------------------------------------------
mercury-users mailing list
post:  mercury-users at cs.mu.oz.au