[mercury-users] Modular data-abstraction and mostly unique modes.

Henk Vandecasteele Henk.Vandecasteele at cs.kuleuven.ac.be
Wed Jan 7 19:57:43 AEDT 1998


Fergus Henderson wrote:
> 
> On 06-Jan-1998, Henk Vandecasteele <Henk.Vandecasteele at cs.kuleuven.ac.be> wrote:
> >
> > I would like to build a finite domain solver. And given the
> > modules in Mercury I want to build an abstract type.
> >
> > Unfortunately this seems incompatiable with Mostly unique modes.
> 
> It's not really mostly unique modes which are the problem;
> the same problem arises with any use of complicated modes
> for abstract data types.
> ...

> The work-around is to just make the inst concrete, and document that
> it is intended to be abstract.
> 
>         :- module fd_solver.
>         :- interface.
> 
>         :- type fd_store.
>         % :- inst mostly_uniq_fd_store.  % abstract
>         :- mode fd_store_muo :: free -> mostly_uniq_fd_store.
>         :- mode fd_store_mui :: mostly_uniq_fd_store -> mostly_uniq_fd_store.
>         :- mode fd_store_mdi :: mostly_uniq_fd_store -> mostly_dead.
> 
>         /* THIS IS REALLY PART OF THE IMPLEMENTATION, NOT THE INTERFACE */
>         :- import_module array.
>         :- inst mostly_uniq_fd_store = mostly_uniq_array(ground).
> 
>         :- implementation.
>         :- type fd_store == array(global_data).
> 
This solutions works fine, Thanks.
Anyway, maybe I'm missing some points, but I find the mode-system
when doing more complicated things like above difficult to use.
I for instance believe that instantiation information and uniqueness
information is something different. And glueing them together makes 
things unclear. 

> > Which I don't like.
> 
> Yes, it's not the most elegant solution imaginable, I'm afraid.
> But it's just inelegant, not unworkable.  The fact that the type
> is abstract prevents anyone from making use of the implementation details.
Your completely right.


Before I forget, I think there is a typo in the manual.

The section on mostly unique modes says:

...
Mercury also provides "mostly unique" modes. The insts
`mostly_unique' and `mostly_dead' are equivalent to `unique' and `dead',
except that only references which will be encountered during forward
execution are counted - it
is OK for `mostly_unique' or `mostly_dead' values to be needed again on
backtracking. 

Mercury defines some standard modes for manipulating "mostly unique"
values, just as it does for
unique values: 

% mostly unique output
:- mode muo :: free -> unique.

% mostly unique input
:- mode mui :: unique -> unique.

% mostly destructive input
:- mode mdi :: unique -> dead.
...

I think unique and dead should be mostly_unique and mostly_dead.

Henk



More information about the users mailing list