Re: pldoc: how to specify predicates with arguments unbound.

Kuniaki Mukai <[email protected]> Tue, 16 Sep 2014 19:48:33 +0900
Newsgroups gmane.comp.ai.prolog.swi
Message-ID <[email protected]>
On Sep 16, 2014, at 19:19, Paulo Moura <[email protected]> wrote:

> 
> On 16/09/2014, at 10:42, Kuniaki Mukai <[email protected]> wrote:
> 
>> 
>> On Sep 16, 2014, at 16:30, Jan Wielemaker <[email protected]> wrote:
>> 
>>> Hi Kuniaki,
>>> 
>>> On 09/16/2014 07:57 AM, Kuniaki Mukai wrote:
>>>> 
>>>> Hi,
>>>> 
>>>> Using pldoc, how do we specify a predicate such as follows:
>>>> 
>>>> 	foo(X, Y) :-  (random(3) =:= 2, X==Y;  true).
>>>> 
>>>> foo is designed so that it returns information on the current state
>>>> on unification (constraint)   X==Y or X\==Y.  So X, and Y are always unbound
>>>> (var(X), var(Y) are always true).  I often wrote such predicates.
>>>> 
>>>> Reading pldoc document, the following seems only possible form for foo/2.
>>>> 
>>>> % foo(-X, -Y)  is det.
>>>> 
>>>> Is it right ?  Or, is there any other neat form of specification
>>>> to tell such intention of programmer of foo above.
>>> 
>>> Seems close to me. The predicate is `multi` though: it succeeds one or
>>> two times (a rarely used qualifier). At some point, I think we need a
>>> more advanced mode system, which I think should be:
>>> 
>>> --X	X *must* be unbound on input (e.g. the stream argument of open/3).
>>>      Typically used for output arguments that cannot be predicted by
>>> 	the caller and thus providing an instantiated argument will always
>>> 	cause failure.
>>> -X   X is output.  It's binding has no impact on the semantics and the
>>>      predicate behaves as p(NewVar), NewVar = X.  I.e., it is steadfast
>>>      wrt this argument.  Notably, it does *not* mean X must be unbound.
>>> @X   X is examined, but not altered in any way (e.g., type checks).
>>> ?X	Either -X or +X.  Can be used as a shorthand for listing 2**N
>>>      modes (where N is the number of ?X args).  E.g., we do not want
>>>      to list 8 modes for append/3.  atom_concat(?,?,?) however is
>>>      wrong because at least two of the arguments must be +.
>>> +X   X is input.  It must have a value that is *compatible* with the
>>>      type.  I.e., X is a generalization of at least one instance of the
>>> 	type.  As far as I'm concerned, this would also mean that
>>> 	if the type is `any`, a variable satisfies.
>>> ++X   X is input and bound to an instance of the type.  I.e.,
>>> 	sort(++List, -Result) because sort cannot sort partial lists.
>> 
>> It looks symmetric, nice, and easy to memorise.  Description 
>> is clear.
>> 
>> However, I have a basic question  about mode declaration.  
>> As you know, Prolog is a relational language, and input and output of prolog process 
>> are constraints. From that established point of view on Prolog, what is the 
>> mode declaration  for ?  So, I supposed that it is only for Prolog compiler not 
>> for human, to produce efficient and safe codes.  In fact, I never have custom 
>> to see mode declarations, which, of course, I never recommended to others.
>> 
>>> 
>>> If there sufficient consensus to add ++ and -- to PlDoc and add this to
>>> the documentation? Then we only need a volunteer to go through the
>>> manuals ...
>>> 
>>> I'm afraid this is still not really a good answer to foo/2. --X demands
>>> the right instantiation,
>> 
>> Any current mode declaration to my foo above seems not appropriate. 
>> So, giving up mode declaration, I should describe f(X, Y) as 
>> 
>> 	X and Y are unified if such and such condition hold,
>> 
>> which is according to the Prolog principle as constraint language.
>> 
>> For curious, I wanted know what mode declaration  did you give 
>> to =/2. But edit(=) fails.
> 
> The standard specifies it as:
> 
> 8.2.1.2 Template and modes
> 
> '='(?term, ?term?)
> 
> which can be seen as the most general template and modes for a predicate.


Thank you for your kindness.  

I wish someone will introduce powerful "mode inference" system 
to SWI-Prolog in the near future. 

Regards

Kuniaki

> 
> Cheers,
> 
> Paulo
> 
>>> but the arguments are never altered, while --X
>>> args are typically instantiated by the predicate. That would suggest @X,
>>> but this allows for nonvar. @X:var could be used, but most LP people
>>> claim that var is not a type.
>> 
>> I have no idea of such discussions. My favourite interpretation of 
>> the var type could be based on the standard model of first-order unification 
>> (Colmerauer's style,  for  instance) that the var type 
>> is its current equivalent class of terms including variables wrt unification
>> I think most LP people agrees on this, though such var semantics 
>> is a kind of  "meta type". So interpreted, as you say
>> var is a type.  I can not say any more on this.
>> 
>> Thank you for your reply. I will start to use  pldoc
>> with more easy-going mind as for mode declaration. 
>> 
>> 
>> Kuniaki 
>> 
>> 
>> 
>>> 
>>> 	Cheers --- Jan
>>> _______________________________________________
>>> SWI-Prolog mailing list
>>> [email protected]
>>> https://lists.iai.uni-bonn.de/mailman/listinfo.cgi/swi-prolog
>> 
>> -------------- next part --------------
>> A non-text attachment was scrubbed...
>> Name: signature.asc
>> Type: application/pgp-signature
>> Size: 496 bytes
>> Desc: Message signed with OpenPGP using GPGMail
>> URL: <https://lists.iai.uni-bonn.de/pipermail/swi-prolog/attachments/20140916/5cba5c2e/signature.asc>
>> _______________________________________________
>> SWI-Prolog mailing list
>> [email protected]
>> https://lists.iai.uni-bonn.de/mailman/listinfo.cgi/swi-prolog
> 
> -----------------------------------------------------------------
> Paulo Moura
> Logtalk developer
> 
> Email: <mailto:[email protected]>
> Web:   <http://logtalk.org/>
> -----------------------------------------------------------------
> 
> 
> 
> 

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 496 bytes
Desc: Message signed with OpenPGP using GPGMail
URL: <https://lists.iai.uni-bonn.de/pipermail/swi-prolog/attachments/20140916/84c81b8a/signature.asc>