<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div class="elementToProof"><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 elementToProof">Dear Mercury users,<br>
</span></div>
<div class="elementToProof"><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"><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">Is there any way to write a function that takes a predicate and
 returns a transformed predicate without (a) naming a new predicate or (b) using a lambda? In practice, I would like to move the lambda to a function. However, the following code gives an error: "Cannot unify two terms of type `(pred float)'". Can I assume
 that this is outside of Mercury's mode system?</span></div>
<div class="elementToProof"><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"><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">Sincerely, Mark.</span></div>
<div class="elementToProof"><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"><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></div>
<div class="elementToProof"><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"><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">:- module tests.
<div class="FluidPluginCopy"><br class="ContentPasted1">
</div>
<div class="FluidPluginCopy ContentPasted1">:- interface.</div>
<div class="FluidPluginCopy ContentPasted1">:- import_module io.</div>
<div class="FluidPluginCopy ContentPasted1">:- pred main(io::di, io::uo) is det.</div>
<div class="FluidPluginCopy"><br class="ContentPasted1">
</div>
<div class="FluidPluginCopy ContentPasted1">:- implementation.</div>
<div class="FluidPluginCopy ContentPasted1">:- import_module float, ranges, solutions.</div>
<div class="FluidPluginCopy ContentPasted1">:- use_module math.</div>
<div class="FluidPluginCopy"><br class="ContentPasted1">
</div>
<div class="FluidPluginCopy ContentPasted1">main(!IO) :-</div>
<div class="FluidPluginCopy ContentPasted1">    test1(!IO), % OK</div>
<div class="FluidPluginCopy ContentPasted1">    test2(!IO). % Does not compile</div>
<div class="FluidPluginCopy"><br class="ContentPasted1">
</div>
<div class="FluidPluginCopy ContentPasted1">:- pred test1(io::di, io::uo) is det.</div>
<div class="FluidPluginCopy ContentPasted1">test1(!IO) :- </div>
<div class="FluidPluginCopy ContentPasted1">    Data = (pred(Y::out) is nondet :- nondet_member(I,range(1,5)), Y = float(I)), % some data<br>
</div>
<div class="FluidPluginCopy ContentPasted1">    LnData = (pred(Y::out) is nondet :- Data(X), Y = math.ln(X)), % a transformation<br>
</div>
<div class="FluidPluginCopy ContentPasted1">    aggregate(LnData, print_line, !IO).</div>
<div class="FluidPluginCopy"><br class="ContentPasted1">
</div>
<div class="FluidPluginCopy ContentPasted1">:- pred test2(io::di, io::uo) is det.</div>
<div class="FluidPluginCopy ContentPasted1">test2(!IO) :- </div>
<div class="FluidPluginCopy ContentPasted1">    Data = (pred(Y::out) is nondet :- nondet_member(I,range(1,5)), Y = float(I)), % some data<br>
</div>
<div class="FluidPluginCopy ContentPasted1">    LnData = f_ln(Data), %% This transformation does not compile:(<br>
</div>
<div class="FluidPluginCopy ContentPasted1">    aggregate(LnData, print_line, !IO).</div>
<div class="FluidPluginCopy"><br class="ContentPasted1">
</div>
<div class="FluidPluginCopy ContentPasted1">:- func f_ln(pred(float)::(pred(out) is nondet)) = (pred(float)::(pred(out) is nondet)).</div>
<div class="FluidPluginCopy ContentPasted1">f_ln(Pred) = (pred(Y::out) is nondet :- Pred(X), Y is math.ln(X)).</div>
<br>
</span></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>