[mercury-users] Parametrizing modes and determinism

Ondrej Bojar obo at cuni.cz
Tue Nov 7 01:33:21 AEDT 2006


Is there a short way of defining a higher order predicate to cover many 
mode and determinism combinations?

Let's say I'm writing a fold predicate for traversing trees:

:- type t(T) ---> t(T, list(t(T))).

:- pred foldt((pred(t(T), A, A)), t(T), A, A).

And I want many modes:

:- mode foldt((pred(in, in, out) is det), in, in, out) is det.
:- mode foldt((pred(in, di, uo) is det), in, di, uo) is det.
:- mode foldt((pred(in, di, uo) is cc_multi), in, di, uo) is cc_multi.

But the foldt implementation calls another folding predicate, e.g. 

foldt(Pred, T at t(_Label, Sons), InAku, OutAku) :-
   Pred(T, InAku, TAku),
          is WHICH_DETERMINISM:-
       foldt(Pred, S, I, O)
     ), Sons, TAku, OutAku).

I have to specify the modes and the determinism for the inner closure 
The only solution I was able to come with, was to create many different 
implementations (copying the routine) and join them under the common 
name foldt/4 by explicitly stating the mode (and promising purity):

foldt(Pred::in(pred(in, in, out)is det), T::in, InAku::in, OutAku::out) :-
   foldt_in(Pred, T, InAku, OutAku).
foldt(Pred::in(pred(in, di, uo)is det), T::in, InAku::di, OutAku::uo) :-
   foldt_di(Pred, T, InAku, OutAku).
foldt(Pred::in(pred(in, di, uo)is cc_multi), T::in, InAku::di, 
OutAku::uo) :-
   foldt_di_cc(Pred, T, InAku, OutAku).

Is there a better way? Especially if I also want to use specific modes 
for hash_tables or similar -- which would again require special foldt/4 

Does anybody have a handy preprocessor for similar situations?

Thanks, Ondrej.

Ondrej Bojar (mailto:obo at cuni.cz)
mercury-users mailing list
Post messages to:       mercury-users at csse.unimelb.edu.au
Administrative Queries: owner-mercury-users at csse.unimelb.edu.au
Subscriptions:          mercury-users-request at csse.unimelb.edu.au

More information about the users mailing list