[mercury-users] Pred defns

Fergus Henderson fjh at cs.mu.OZ.AU
Tue Apr 7 02:04:04 AEST 1998


On 06-Apr-1998, Ralph Becket <rwab1 at cam.sri.com> wrote:
> Fergus Henderson wrote on 5 Apr:
> > My answer is to say that ensuring "Clean Denotational Semantics of
> > Source Code" is one of the foremost goals of Mercury.
[...]
> > One of the key features of Mercury is
> > that it takes the ideal of PROgramming in LOGic and makes it a
> > reality -- your program is indeed a set of statements in logic
[...]
> Yes, I can't argue with the intention, but I'm not totally sure it's
> realizable - and you do use DCGs in quite a bit of Mercury code!

True. 

However, DCGs *can* be interpreted as just statements in logic,
so long as you use `phrase/3' (currently we *don't*, which is
probably something that we should fix) to invoke them from non-DCG code.
If you do that, then the semantics of DCGs can be defined as follows:

	phrase(H, S0, S) :-
		H --> B,
		phrase(B, S0, S).
	phrase({G}, S, S) :-
		G.
	phrase((A, B), S0, S) :-
		phrase(A, S0, S1),
		phrase(B, S1, S).
	phrase((if A then B else C), S0, S) :-
		(if phrase(A, S0, S1) then
			phrase(B, S1, S)
		else
			phrase(C, S0, S)
		).
	% plus a few other clauses for `not', `;', etc.

According to this viewpoint, when we write DCGs, we're just
writing clauses for '-->'/2.  Everything we write is therefore
just statements in logic.

Saying that we're still programming in logic is perhaps misleading,
because actually we're programming in DCGs, and phrase/3 is
an interpreter for DCGs.  But that's just a different way of viewing
what is happening, and both viewpoints are correct.

Now, you can of course argue about the utility of the 
programming-directly-in-logic viewpoint, because in practice
the alternative viewpoint (programming-in-DCGs, which can be
easily *translated* into logic) tends to be much more useful.
However, the former viewpoint does have a nice conceptual elegance.
And past experience suggests that preserving nice theoretical
properties often leads to later practical advantages.
So I'm reluctant to ditch it.

> This whole debate is about how to help programmers by abbreviating a
> common idiom (accumulator threading) in as clean a way as possible and
> nobody's yet suggested anything that satisfies the Program as (just)
> Logic criterion.

My first modified version of your original proposal (with lower-case
names for accumulators, with `#:-' instead of `:-', and with `#{...}'
having an analgous role to that of phrase/3) satisfied this definition
in the same way that DCGs do.  However, the interpreter in this case is
considerably more complex -- ~120 lines of code as compared to ~20 for
DCGs.

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