[m-dev.] documenting typed insts

Julien Fischer jfischer at opturion.com
Tue Jan 7 21:35:21 AEDT 2020


On Tue, 7 Jan 2020, Zoltan Somogyi wrote:

> 2020-01-07 20:39 GMT+11:00 Julien Fischer<jfischer at opturion.com>:
>>     :- type tm ---> walking ; cycling ; car.
>>     :- type fruit ---> lemon ; orange ;  apple.
>>     :- inst citrus for fruit/0 ---> lemon ; walking.
>>
>> I get an error about the inst defintion.
>>
>>    foo.m:010: Error: inst `citrus'/0 is declared to be for type `foo.fruit'/0, but
>>    foo.m:010:   its top level function symbol `walking'/0 is not a function symbol
>>    foo.m:010:   of that type.
>>
>> Or is the commit message referring to something else?
>
> It is referring to something else.
>
> If you have
>
> :- type t1 ---> f1(...) ; f2.
> :- type t2 ---> f1(...) ; f2. % in a different module, of course
> :- inst i1 for t1/0 ---> f1(ground, ..., ground).
>
> the inst i1 is valid, so you don't get the above error message. That's good.
> What is not good is that you *also* don't get an error message if one
> of your predicates has an argument of type t2 which is declared to have
> a mode such as "in(i1)". In this case, the programmer has declared
> that i1 is for use on values of type t1, but it is being used on a value
> of type t2. The code to detect this kind of problem has not been
> written yet, mostly because it requires the mode checker to handle
> a sixth task along with its current five, and the interactions can be
> very complex. (For example, one would want to detect this error
> even when it occurs in a subterm of an argument of a higher order
> value.)

Ok, I see.

> However, specifying what type an inst is *meant* for is useful
> documentation even without its implicit assertion (that it is not used
> on values of any other type) being enforced, which is why it can be
> documented now anyway.

Yes.

Julien.


More information about the developers mailing list