[mercury-users] Is DCG really appropriate, even for the things it does well?

Fergus Henderson fjh at cs.mu.OZ.AU
Wed Apr 3 20:43:21 AEST 2002

On 03-Apr-2002, Peter Driscoll <peter_driscoll at bigpond.com> wrote:
> With stronger compiler support for list appending could we do without DCG?

Perhaps, but this would require significant extensions to determinism

> Note: "Mercury using concatenation" below won't compile under mercury
> because
> 	mode list_append(in, in) = out.

Actually the list__append/3 predicate has several modes.
The function versions of list__append in the standard library don't --
I'm not sure why, exactly.  But you can easily write your own function
version which does, e.g. using "+" or "`app`":

	:- func list(T) + list(T) = list(T).
	:- mode in + in = out is det.
	:- mode out + out = in is multi.
	X + Y = Z :- list__append(X, Y, Z).

However, the problem that you run into for code like you suggest,

	term(Factor + ['*'] + Term) = times_term(factor(Factor), term(Term)).
	term(Factor + ['/'] + Term) = divide_term(factor(Factor), term(Term)).
	term(Factor) = simple_term(factor(Factor)).

is that the compiler's determinism analysis can't tell that there
won't be more than one result; the different clauses might not be
mutually exclusive, and the calls to the `out + out = in' mode of `+'
might succeed more than once.

In this case, the determinism analysis required would have to be
a non-local analysis, since whether or not this grammar is ambiguous
depends on the definition of `factor'.

Maybe the best solution for cases like this would be to have a simple
mechanism for telling the compiler to check the determinism at run-time
rather than at compile-time.

Fergus Henderson <fjh at cs.mu.oz.au>  |  "I have always known that the pursuit
The University of Melbourne         |  of excellence is a lethal habit"
WWW: <http://www.cs.mu.oz.au/~fjh>  |     -- the last words of T. S. Garp.
mercury-users mailing list
post:  mercury-users at cs.mu.oz.au
administrative address: owner-mercury-users at cs.mu.oz.au
unsubscribe: Address: mercury-users-request at cs.mu.oz.au Message: unsubscribe
subscribe:   Address: mercury-users-request at cs.mu.oz.au Message: subscribe

More information about the users mailing list