[m-users.] A predicate taking a lists of predicates as input?

Sean Charles (emacstheviking) objitsu at gmail.com
Mon Sep 22 06:10:41 AEST 2025


Hi Volker,

I just scanned Chapter 8, Higher Order... what is the meaning of the question marks here? I could find no reference.

> 

> :- pred ?(list(ta_rule(TKNS)), TKNS, TKNS).

> :- mode ?(in(list(ta_rule)),   in,   out).


Thanks,
Sean


> On 21 Sep 2025, at 17:51, Volker Wysk <post at volker-wysk.de> wrote:
> 
> Hi, Anders
> 
> You have two errors:
> 
> 1. You don't need and can't have the TNKS argument to your ta_rule inst,
> since it isn't used on the right side.
> 
> 2. You need to specify a higher order inst matching your higher order type,
> for both predicates.
> 
> Do it like this:
> 
> :- type ta_rule(TKNS) ==  pred(TKNS, TKNS). % 'ta' abbreviates 'type alias'
> :- inst ta_rule       == (pred(in,   out) is semidet).
> 
> :- pred ?(list(ta_rule(TKNS)), TKNS, TKNS).
> :- mode ?(in(list(ta_rule)),   in,   out).
> 
> :- pred apply_rules(list(ta_rule(TKNS)), TKNS, TKNS).
> :- mode apply_rules(in(list(ta_rule)),   in,   out) is semidet.
> 
> Cheers,
> Volker
> 
> Am Sonntag, dem 21.09.2025 um 18:28 +0200 schrieb Anders Lundstedt:
>> Dear all,
>> 
>> 
>> For the purpose of a parser I am writing, I want to have a DCG rule ?
>> taking a list of DCG rules as input and that then tries to apply all
>> rules in the list.
>> 
>> 
>> GitHub Gist of the following:
>> 
>> https://gist.github.com/anderslundstedt/1f5b1d8ad6b4d2404dae4a602d3d920d
>> 
>> 
>> My attempt:
>> 
>> :- type ta_rule(TKNS) ==  pred(TKNS, TKNS). % 'ta' abbreviates 'type
>> alias'
>> :- inst ta_rule(TKNS) == (pred(in,   out) is semidet).
>> 
>> :- pred ?(list(ta_rule(TKNS)), TKNS, TKNS).
>> :- mode ?(in,                  in,   out).
>> ?(RULES) --> (
>>   apply_rules(RULES) -> {true};
>>                         {true}
>> ).
>> 
>> :- pred apply_rules(list(ta_rule(TKNS)), TKNS, TKNS).
>> :- mode apply_rules(in,                  in,   out) is semidet.
>> apply_rules([])     --> {true}.
>> apply_rules([R|RS]) --> R, apply_rules(RS).
>> 
>> 
>> Compilation error:
>> 
>> In clause for `apply_rules(in, in, out)':
>>   in argument 1 (i.e. the predicate term) of higher-order predicate
>>   call:
>>   mode error: variable `R' has instantiatedness `ground',
>>   expecting higher-order pred inst of arity 2.
>> 
>> 
>> Any advice would be greatly appreciated!
>> 
>> 
>> 
>> Best,
>> 
>> Anders Lundstedt
>> _______________________________________________
>> users mailing list
>> users at lists.mercurylang.org
>> https://lists.mercurylang.org/listinfo/users
> _______________________________________________
> users mailing list
> users at lists.mercurylang.org
> https://lists.mercurylang.org/listinfo/users

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mercurylang.org/archives/users/attachments/20250921/82896481/attachment.html>


More information about the users mailing list