<html><body><div style="color:#000; background-color:#fff; font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;font-size:16px"><div id="yiv1715390481"><div id="yui_3_16_0_1_1439285125942_8670"><div style="color:#000;background-color:#fff;font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;font-size:16px;" id="yui_3_16_0_1_1439285125942_8669"><div id="yiv1715390481yui_3_16_0_1_1439285125942_6635">Hi all,</div><div id="yiv1715390481yui_3_16_0_1_1439285125942_6635">Being new to Mercury, I need help with the following problem:</div><div id="yiv1715390481yui_3_16_0_1_1439285125942_6635"><br></div><div id="yiv1715390481yui_3_16_0_1_1439285125942_6635" dir="ltr">I want to create a simple predicate mult(A, B, C), such that C = A * B, and by substituting any 2 of (A, B, C) with values getting the third as a result. Something like a primitive equation solver. The predicate must fail if result is impossible (division by zero, like A * 0 = 42) or if result can be any number (like A * 0 = 0). So my mult() will be:</div><div id="yiv1715390481yui_3_16_0_1_1439285125942_6635" dir="ltr"><br></div><div id="yiv1715390481yui_3_16_0_1_1439285125942_6635" dir="ltr" class="yiv1715390481">:- pred mult(float, float, float).</div><div id="yiv1715390481yui_3_16_0_1_1439285125942_6635" dir="ltr" class="yiv1715390481">:- mode mult(in, in, out) is det.</div><div id="yiv1715390481yui_3_16_0_1_1439285125942_6635" dir="ltr" class="yiv1715390481">:- mode mult(in, out, in) is semidet.</div><div id="yiv1715390481yui_3_16_0_1_1439285125942_6635" dir="ltr" class="yiv1715390481">:- mode mult(out, in, in) is semidet.</div><div dir="ltr" id="yiv1715390481yui_3_16_0_1_1439285125942_7395" class="yiv1715390481"><br></div><div dir="ltr" id="yiv1715390481yui_3_16_0_1_1439285125942_7395" class="yiv1715390481">The problem is writing the body. There is no way to tell within the body which mode we currently describe, to add the corresponding semantics. Ultimately, the compiler will create a separate C function for each mode, based on a single body that unambiguously describes ALL modes at once.</div><div dir="ltr" id="yiv1715390481yui_3_16_0_1_1439285125942_7395" class="yiv1715390481">Am I correct?</div><div dir="ltr" id="yiv1715390481yui_3_16_0_1_1439285125942_7395" class="yiv1715390481"><br></div><div dir="ltr" id="yiv1715390481yui_3_16_0_1_1439285125942_7395" class="yiv1715390481">As a side note, the same problem for addition would solved easily (compiles and runs as expected, but only for + and ints -- floats would give error):</div><div dir="ltr" id="yiv1715390481yui_3_16_0_1_1439285125942_7395" class="yiv1715390481"><br></div><div dir="ltr" id="yiv1715390481yui_3_16_0_1_1439285125942_7395" class="yiv1715390481"><div dir="ltr" id="yiv1715390481yui_3_16_0_1_1439285125942_7395" class="">:- pred add(int, int, int).</div><div dir="ltr" id="yiv1715390481yui_3_16_0_1_1439285125942_7395" class="">:- mode add(in, in, out) is det.</div><div dir="ltr" id="yiv1715390481yui_3_16_0_1_1439285125942_7395" class="">:- mode add(in, out, in) is det.</div><div dir="ltr" id="yiv1715390481yui_3_16_0_1_1439285125942_7395" class="">:- mode add(out, in, in) is det.</div><div dir="ltr" id="yiv1715390481yui_3_16_0_1_1439285125942_7395" class="">add(A,B,C) :-</div><div dir="ltr" id="yiv1715390481yui_3_16_0_1_1439285125942_7395" class=""><span class="" style="white-space:pre-wrap;" id="yui_3_16_0_1_1439285125942_9382"> </span>C = A + B.</div><div dir="ltr" id="yui_3_16_0_1_1439285125942_9384" class=""><br id="yui_3_16_0_1_1439285125942_9386" class=""></div><div dir="ltr" id="yui_3_16_0_1_1439285125942_9384" class="">Is there any way to achieve the same but for multiplication?</div><div dir="ltr" id="yui_3_16_0_1_1439285125942_9384" class="">How would one approach this problem, without writing separate predicates like mult1, mult2, mult3? I have read the introduction book (pdf from site) and haven't got any hints regarding this.</div><div dir="ltr" id="yui_3_16_0_1_1439285125942_9384" class="">Any help is greatly appreciated.</div><div dir="ltr" id="yui_3_16_0_1_1439285125942_9384" class="">Thank you in advance!</div><div dir="ltr" id="yui_3_16_0_1_1439285125942_9384" class=""><br></div></div></div></div></div></div></body></html>