[mercury-users] A suggestion for a tutorial
    Nicolas Pelletier 
    nicolas.pelletier3 at free.fr
       
    Mon Jul  3 23:13:35 AEST 2006
    
    
  
Hello again,
as a newbie to Mercury (and not  much experienced in logic programming
either), I  find myself making  the following error  more often than I
would like ;-)
While writing predicates such as this one:
:- pred square_list(int :: in, int :: in, list(int) :: out) is nondet.
square_list(N, M, L) :-
    N > 0 -> member(X, 1 .. M), square_list(N - 1, M, L0), L = [X | L0]
    ; L = [].
I often feel the  impulse to "over-factorize" the  code and write this
erroneous code instead:
:- pred square_list(int :: in, int :: in, list(int) :: out) is nondet.
square_list(0, _, []).
square_list(N, M, L) :-
    member(X, 1 .. M), square_list(N - 1, M, L0), L = [X | L0].
The compiler does not see anything wrong about it (and  I do not blame
it), and I am left puzzled contemplating a run-time error such as:
PC at signal: 135025514 (80c536a)
This may have been caused by a stack overflow, due to unbounded recursion.
The root cause  of   my writing such code    seems to be my   lack  of
understanding of the  nondet mode, but I  guess I am not  alone having
some trouble with modes. So I thought I might  show this error so that
people writing tutorials  or cookbooks could consider  warning newbies
against such misunderstandings.
If there are links I should read instead, please point me to them.
Regards,
-- 
Nicolas
--------------------------------------------------------------------------
mercury-users mailing list
post:  mercury-users at cs.mu.oz.au
administrative address: owner-mercury-users at cs.mu.oz.au
unsubscribe: Address: mercury-users-request at cs.mu.oz.au Message: unsubscribe
subscribe:   Address: mercury-users-request at cs.mu.oz.au Message: subscribe
--------------------------------------------------------------------------
    
    
More information about the users
mailing list