[m-users.] Correct use of solutions.

Mark Brown mark at mercurylang.org
Sat Jul 29 21:09:22 AEST 2023


On Sat, Jul 29, 2023 at 6:27 PM Sean Charles (emacstheviking)
<objitsu at gmail.com> wrote:
>
> I've been trying to produce a simple list of strings to output as the response to a command line argument request to list the supported targets of my transpiler, given I have a type and a predicate to return the printable string for the language I thought solutions/2 was my answer, but not so far! Again, it's a mixture of the terminology to my untutored brain and the lack of any really clear guiding examples, in Prolog this stuff is trivial!

In Prolog this stuff is usually *concise*, but I wouldn't call it
trivial. To verify correctness of bagof, for example, you need to
reason about binding patterns and determinism. In the case of
solutions/2, Mercury is doing a lot of the work for you, as well as
for people reading your code, but like a lot of things in Mercury the
benefits come at the cost of restricting yourself to mode-correct code
and declaring what you are doing.

Whether verifiability is more important than brevity depends on your
project, of course. Personally I find thinking to be more of a
bottleneck than reading or typing, so it's usually a higher priority.
But maybe that is just me!

Cheers,
Mark

>
>
>     % Does -T / --targets.
>     %
> :- type supported_target
>     --->    language_c
>     ;       language_python
>     ;       language_pythont
>     ;       language_js.
>
> :- pred show_targets(io::di, io::uo) is det.
>
> 300:show_targets(!IO) :-
> 301:    io.format("Available target languages:", [], !IO),
> 302:    solutions(
> 303:       (pred(A::out) is nondet :-
> 304:            target_name(_, A)
> 305:        ),
> 306:       Targets
> 307:    ),
> 308:    io.print_line(Targets, !IO).
>
>
>
> :- pred target_name(supported_target, string).
> :- mode target_name(in, out) is det.
>
> target_name(language_c, "Vanilla C").
> target_name(language_python, "Vanilla Python").
> target_name(language_pythont, "Typed Python").
> target_name(language_js, "Vanilla JavaScript").
>
> gives me the follwiong output:
>
> command_line.m:308: In clause for `show_targets(di, uo)':
> command_line.m:308:   mode error in conjunction. The next 3 error messages
> command_line.m:308:   indicate possible causes of this error.
> command_line.m:308:
> command_line.m:303:   In clause for `show_targets(di, uo)':
> command_line.m:303:   mode error in conjunction. The next 2 error messages
> command_line.m:303:   indicate possible causes of this error.
> command_line.m:303:
> command_line.m:304:   In clause for `show_targets(di, uo)':
> command_line.m:304:   in argument 1 of call to predicate
> command_line.m:304:   `command_line.target_name'/2:
> command_line.m:304:   mode error: variable `V_5' has instantiatedness `free',
> command_line.m:304:   expected instantiatedness was `ground'.
> command_line.m:303:
> command_line.m:303:   In clause for `show_targets(di, uo)':
> command_line.m:303:   in argument 1 of clause head:
> command_line.m:303:   mode error in unification of `LambdaHeadVar__1' and `A'.
> command_line.m:303:   Variable `LambdaHeadVar__1' has instantiatedness `free',
> command_line.m:303:   variable `A' has instantiatedness `free'.
> command_line.m:308:
> command_line.m:302:   In clause for `show_targets(di, uo)':
> command_line.m:302:   in call to predicate `solutions.solutions'/2:
> command_line.m:302:   mode error: arguments `V_12, Targets' have the following
> command_line.m:302:   insts:
> command_line.m:302:     free,
> command_line.m:302:     free
> command_line.m:302:   which does not match any of the modes for predicate
> command_line.m:302:   `solutions.solutions'/2.
> command_line.m:302:   The first argument `V_12' has inst `free', which does not
> command_line.m:302:   match any of those modes.
> command_line.m:308:
> command_line.m:308:   In clause for `show_targets(di, uo)':
> command_line.m:308:   in argument 1 of call to predicate `io.print_line'/3:
> command_line.m:308:   mode error: variable `Targets' has instantiatedness
> command_line.m:308:   `free',
> command_line.m:308:   expected instantiatedness was `ground'.
>
>
> I've read the mercury crash course site with it's 'rows()' but so far drawn a blank...just how simple is it to get a list of possible solutions so that I may print a list of strings representing supported languages?
>
> Thanks.
>
> _______________________________________________
> users mailing list
> users at lists.mercurylang.org
> https://lists.mercurylang.org/listinfo/users


More information about the users mailing list