# [mercury-users] Rewriting if-then-else as (CondGoal, ThenGoal; not(CondGoal), ElseGoal)

Mark Brown mark at csse.unimelb.edu.au
Mon Sep 5 13:39:42 AEST 2011

```Hi Daniel,

On 04-Sep-2011, Daniel Patterson <lists.mercury at dbp.mm.st> wrote:
> Hi,
>
> sorry if this is a really beginner question,

Beginner questions are more than welcome.  :-)

...

> What am I not understanding? I read the section on determinism and on goals
> (that talks about if-then-else having different semantics) in the reference
> manual, but I'm having a hard time figuring out how it is applying here, and
> how to fix the code!

What Peter said is correct.  The relevant part of the language reference
is sec 6.2, "Determinism checking and inference", specifically the definition
of switch:

A disjunction is a switch if each disjunct has near its start a
unification that tests the same bound variable against a different
function symbol.

Not everything that is logically a switch can be detected as such.  You can
find a related post from Zoltan here:

<http://www.mercury.csse.unimelb.edu.au/mailing-lists/mercury-users/mercury-users.201108/0016.html>

> :- pred euler1(int::in,int::out) is det.
>
> euler1(N,P) :-
>   Np = N mod 3, Nq = N mod 5,
>   ( if
>       N =< 0
>     then
>       P = 0
>     else
>         (
>           if (Np = 0; Nq = 0)
>           then euler1(N-1,Ps), P = N + Ps
>           else euler1(N-1,P)
>         )
>   ).

Note that this can also be written without the brackets around the
if-then-else in the else branch.  E.g.:

euler1(N, P) :-
Np = N mod 3,
Nq = N mod 5,
( if N =< 0 then
P = 0
else if (Np = 0; Nq = 0) then
euler1(N - 1, Ps),
P = N + Ps
else
euler1(N - 1, P)
).

Cheers,
Mark.

--------------------------------------------------------------------------
mercury-users mailing list
Post messages to:       mercury-users at csse.unimelb.edu.au