[m-users.] IO argument clobbering

Zoltan Somogyi zoltan.somogyi at runbox.com
Tue Jul 18 02:09:12 AEST 2023


On 2023-07-17 17:43 +02:00 CEST, "Volker Wysk" <post at volker-wysk.de> wrote:
> Am Montag, dem 17.07.2023 um 17:39 +0200 schrieb Volker Wysk:
>> But the "in(callback)" inst isn't ground. It's a higher order inst. Only
>> the "in" with zero arguments is an abbreviation for "in(ground)". 
> 
> Hmmm... Looks like I was confused about what "ground" means. 

In different contexts, "ground" means several related and similar
but nevertheless slightly different things. Which meaning of "ground" people
mean when they write that term is *usually* clear from the context, but not always.

The standard meaning in logic programming theory is simply "a term that
contains no variables", and all uses of "ground" include this meaning. But Mercury
goes beyond standard logic programming theory by having types,
including higher order types. When you write "ground" in a Mercury program,
that occurrence of "ground" describes a term that contains
no variables AND whose type is either not a higher order type,
or is a higher order function type with the standard function mode
(which is: all arguments are input, the return value is output).
It cannot be a higher order predicate type, or a higher order function
type with a nonstandard mode, because for those, you need to tell
the compiler the modes of their arguments. If you don't give the compiler
this info, you get the error message that started this thread.

There is a similar issue with respect to uniqueness. The inst "ground"
describes a reference to a term that contains no variables, and is not
the only reference to that term. If you want to describe a reference
to a term that contains no variables but it IS the only reference
to that term, what you write is "unique".

Internally in the Mercury compiler, the representation of ground
insts is parameterised by the absence/presence of both uniqueness
and higher order inst information. The "ground" inst in Mercury programs
corrresponds to the absence of both of these kinds of information.
And yet the compiler's name even for insts with one or both
of these kinds of information is still "ground". So you see, even
the Mercury language and the Mercury compiler disagree on
which variant meaning should be called "ground" :-)

Zoltan.


More information about the users mailing list