<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div><span class="elementToProof FluidPluginCopy"><span style="font-family:Calibri, Arial, Helvetica, sans-serif;font-size:12pt;color:rgb(0, 0, 0);background-color:rgb(255, 255, 255)">Thank you everyone -- that has been very helpful.</span><span style="font-family:Calibri, Arial, Helvetica, sans-serif;font-size:12pt;color:rgb(0, 0, 0);background-color:rgb(255, 255, 255)" class="ContentPasted0">
 I admit that I was using an older version of Mercury (20.06.1). On that version, I *was* able to use either `=` or `is` for the mathematical equations. I have now installed the latest release.</span></span></div>
<div class="elementToProof"><span class="elementToProof FluidPluginCopy"><span style="font-family:Calibri, Arial, Helvetica, sans-serif;font-size:12pt;color:rgb(0, 0, 0);background-color:rgb(255, 255, 255)" class="ContentPasted0"><br>
</span></span></div>
<div class="elementToProof"><span class="elementToProof FluidPluginCopy"><span style="font-family:Calibri, Arial, Helvetica, sans-serif;font-size:12pt;color:rgb(0, 0, 0);background-color:rgb(255, 255, 255)" class="ContentPasted0"> I admit that I was using an
 older version of Mercury (20.06.1). On that version, I *was* able to use either `=` or `is` for the mathematical equations. I have now installed the latest release.</span></span></div>
<div><span class="elementToProof FluidPluginCopy"><span style="font-family:Calibri, Arial, Helvetica, sans-serif;font-size:12pt;color:rgb(0, 0, 0);background-color:rgb(255, 255, 255)" class="ContentPasted0"></span></span></div>
<div class="elementToProof FluidPluginCopy"><span style="font-family:Calibri, Arial, Helvetica, sans-serif;font-size:12pt;color:rgb(0, 0, 0);background-color:rgb(255, 255, 255)" class="ContentPasted0"><br>
</span></div>
<div class="elementToProof FluidPluginCopy"><span style="font-family:Calibri, Arial, Helvetica, sans-serif;font-size:12pt;color:rgb(0, 0, 0);background-color:rgb(255, 255, 255)" class="ContentPasted0">Julien: that was the answer that I was hoping for:).</span></div>
<div class="elementToProof FluidPluginCopy"><span style="font-family:Calibri, Arial, Helvetica, sans-serif;font-size:12pt;color:rgb(0, 0, 0);background-color:rgb(255, 255, 255)" class="ContentPasted0"><br>
</span></div>
<div class="elementToProof FluidPluginCopy"><span style="font-family:Calibri, Arial, Helvetica, sans-serif;font-size:12pt;color:rgb(0, 0, 0);background-color:rgb(255, 255, 255)" class="ContentPasted0 ContentPasted1 ContentPasted2">Tomas: your code is elegant.
 I understand that lists or arrays would be quite suitable for the given example -- but my motivating case is for doing bag aggregates on (nondet) relationships (see
<a href="https://rosettacode.org/wiki/Merge_and_aggregate_datasets#Mercury">https://rosettacode.org/wiki/Merge_and_aggregate_datasets#Mercury</a>).
<br>
</span></div>
<div class="_Entity _EType_OWALinkPreview _EId_OWALinkPreview _EReadonly_1">
<div class="LPBorder437744" style="margin-top:16px;margin-bottom:16px;max-width:800px;min-width:424px">
<table style="padding:12px 36px 12px 12px;width:100%;border-width:1px;border-style:solid;border-color:rgb(200, 200, 200);border-radius:2px">
<tbody>
<tr style="border-spacing:0px" valign="top">
<td>
<div style="margin-right:12px;height:160px;overflow:hidden"><a target="_blank" href="https://rosettacode.org/wiki/Merge_and_aggregate_datasets#Mercury"><img alt="" style="display:block" width="112" height="160" src="https://static.miraheze.org/rosettacodewiki/d/d3/RosettaCodeTitle.png"></a></div>
</td>
<td style="width:100%">
<div style="font-size:21px;font-weight:300;margin-right:8px;font-family:"wf_segoe-ui_light", "Segoe UI Light", "Segoe WP Light", "Segoe UI", "Segoe WP", Tahoma, Arial, sans-serif;margin-bottom:12px">
<a target="_blank" href="https://rosettacode.org/wiki/Merge_and_aggregate_datasets#Mercury" data-loopstyle="link">Merge and aggregate datasets - Rosetta Code</a></div>
<div style="font-size:14px;max-height:100px;color:rgb(102, 102, 102);font-family:"wf_segoe-ui_normal", "Segoe UI", "Segoe WP", Tahoma, Arial, sans-serif;margin-bottom:12px;margin-right:8px;overflow:hidden">
Merge and aggregate datasets Task. Merge and aggregate two datasets as provided in .csv files into a new resulting dataset. Use the appropriate methods and data structures depending on the programming language.</div>
<div style="font-size:14px;color:rgb(166, 166, 166);font-family:"wf_segoe-ui_normal", "Segoe UI", "Segoe WP", Tahoma, Arial, sans-serif">
rosettacode.org</div>
</td>
</tr>
</tbody>
</table>
<div class="uHkAz" tabindex="0" title="Remove link preview"><i data-icon-name="Cancel" class="Rm9Q1 root-189"></i></div>
</div>
</div>
<div style="font-family:Calibri, Arial, Helvetica, sans-serif;font-size:12pt;color:rgb(0, 0, 0);background-color:rgb(255, 255, 255)" class="elementToProof FluidPluginCopy">
<span style="background-color:rgb(255, 255, 255)" class="ContentPasted0 ContentPasted1 ContentPasted2 FluidPluginCopy ContentPasted3">With the recent interest in Verse (<a href="https://news.ycombinator.com/item?id=33946933" class="ContentPasted3">https://news.ycombinator.com/item?id=33946933</a>),
 which combines nondeterminism and functional aspects, I hope there will be increased interest in Mercury. </span></div>
<div style="font-family:Calibri, Arial, Helvetica, sans-serif;font-size:12pt;color:rgb(0, 0, 0);background-color:rgb(255, 255, 255)" class="elementToProof FluidPluginCopy">
<br>
</div>
<span style="font-family:Calibri, Arial, Helvetica, sans-serif;font-size:12pt;color:rgb(0, 0, 0);background-color:rgb(255, 255, 255)" class="elementToProof FluidPluginCopy">Sincerely, Mark.</span>
<div class="elementToProof" style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);">
<span style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);"><br>
</span></div>
<div id="appendonsend"></div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> Tomas By <tomas@basun.net><br>
<b>Sent:</b> 22 December 2022 16:13<br>
<b>To:</b> Mark Clements <mark.clements@ki.se><br>
<b>Cc:</b> users@lists.mercurylang.org <users@lists.mercurylang.org><br>
<b>Subject:</b> Re: [m-users.] Returning a predicate from a function</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt;">
<div class="PlainText">[You don't often get email from tomas@basun.net. Learn why this is important at
<a href="https://aka.ms/LearnAboutSenderIdentification">https://aka.ms/LearnAboutSenderIdentification</a> ]<br>
<br>
On Thu, 22 Dec 2022 12:52:52 +0100, Mark Clements wrote:<br>
> main(!IO) :-<br>
>     test1(!IO), % OK<br>
>     test2(!IO). % Does not compile<br>
><br>
> :- pred test1(io::di, io::uo) is det.<br>
> test1(!IO) :-<br>
>     Data = (pred(Y::out) is nondet :- nondet_member(I,range(1,5)), Y = float(I)), % some data<br>
>     LnData = (pred(Y::out) is nondet :- Data(X), Y = math.ln(X)), % a transformation<br>
>     aggregate(LnData, print_line, !IO).<br>
><br>
> :- pred test2(io::di, io::uo) is det.<br>
> test2(!IO) :-<br>
>     Data = (pred(Y::out) is nondet :- nondet_member(I,range(1,5)), Y = float(I)), % some data<br>
>     LnData = f_ln(Data), %% This transformation does not compile:(<br>
>     aggregate(LnData, print_line, !IO).<br>
><br>
> :- func f_ln(pred(float)::(pred(out) is nondet)) = (pred(float)::(pred(out) is nondet)).<br>
> f_ln(Pred) = (pred(Y::out) is nondet :- Pred(X), Y is math.ln(X)).<br>
<br>
<br>
I'm not 100% sure what you mean for this to do. In particular I am not<br>
sure what "aggregate" does (in Python I assume).<br>
<br>
Some general points: maths is not nondet; the basic data structure is<br>
a list. not some abstract generator as in some other languages that I<br>
could mention; you do not always need all these declarations.<br>
<br>
This seems to work:<br>
<br>
<br>
|:- module test.<br>
|<br>
|:- interface.<br>
|:- import_module io.<br>
|:- pred main(io::di, io::uo) is det.<br>
|<br>
|:- implementation.<br>
|:- import_module int, float, list.<br>
|:- use_module math.<br>
|<br>
|main(!IO) :-<br>
|  test1(!IO),<br>
|  test2(!IO).<br>
|<br>
|:- pred test1(io::di, io::uo) is det.<br>
|<br>
|test1(!IO) :-<br>
|  Data = map(float,1..5),<br>
|  LnData = map(math.ln,Data),<br>
|  write_list(LnData,"",print_line,!IO).<br>
|<br>
|:- pred test2(io::di, io::uo) is det.<br>
|<br>
|test2(!IO) :-<br>
|  Data = map(float,1..5),<br>
|  LnData = map(f_ln,Data),<br>
|  write_list(LnData,"",print_line,!IO).<br>
|<br>
|:- func f_ln(float::in) = (float::out) is det.<br>
|<br>
|f_ln(F0) = F :- F = math.ln(F0).<br>
|<br>
|:- end_module test.<br>
<br>
<br>
Is this what you meant?<br>
<br>
/Tomas<br>
</div>
</span></font></div>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<meta http-equiv="Content-Style-Type" content="text/css">
<title></title>
<meta name="Generator" content="Cocoa HTML Writer">
<meta name="CocoaVersion" content="1561.6">
<style type="text/css">
    p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 14.0px; font: 12.0px Times; color: #000000; -webkit-text-stroke: #000000; min-height: 14.0px}
    p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 14.0px; font: 12.0px Times; color: #000000; -webkit-text-stroke: #000000}
    span.s1 {font-kerning: none}
    span.s2 {text-decoration: underline ; font-kerning: none; color: #0000ee; -webkit-text-stroke: 0px #0000ee}
  </style>
<p class="p1"><span class="s1"></span><br>
</p>
<p class="p1"><span class="s1"></span><br>
</p>
<p class="p2"><span class="s1"><i>När du skickar e-post till Karolinska Institutet (KI) innebär detta att KI kommer att behandla dina personuppgifter.
</i><a href="https://ki.se/medarbetare/integritetsskyddspolicy"><span class="s2">Här finns information om hur KI behandlar personuppgifter</span></a>.<span class="Apple-converted-space"> </span></span></p>
<p class="p1"><span class="s1"></span><br>
</p>
<p class="p2"><span class="s1"><i>Sending email to Karolinska Institutet (KI) will result in KI processing your personal data.</i>
<a href="https://ki.se/en/staff/data-protection-policy"><span class="s2">You can read more about KI’s processing of personal data here</span></a>.<span class="Apple-converted-space"> </span></span></p>
</body>
</html>