🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: comp.lang.prolog
Article #617

Why does my Turbo Prolog program waste heap space??

#617
From: Ron Castelletto
Date: Thu, 29 Mar 1990 21:54
71 lines
2870 bytes
Can someone out there please help me with a Prolog question??

I am using Turbo Prolog on an IBM-compatible 286 machine and I'm having 
problems understanding why certain functions do NOT return heap space
when the function returns.

For example, I am using the following two function: findPos and ndel,

when I call findPos, all heap storage is returned at the end of the call,
BUT when I call ndel, I lose a few bytes of memory (heap storage) on every 
call.  I suspect it has something to do with non-deterministic functions and/or
tail-recusive functions but I can't figure out what the conditions are for a 
functions to return its storage.


I will try to explain the 2 functions now.

% ------------------------------ findPos

findPos : does NOT lose heap memory
   parameter 1: a integer, known at time of call
             2: a list of nodes as follows (  [n(1,2), n(3,4)...n(5,2) ] ) also
                known at time of call.
             3: the second value of the node having a first value of Pos, note
                only one node will match Pos. (i.e. first value of a node in 
		the list is unique).

Ex:  findPos( 3, [ n(1,2), n(4,3), n(3,6), n(12,5)], X )
     will return X = 6.  		      (2nd clause)
     if no node matches, the call will fail.  (1st clause)

findPos(_, [], 0) :-
   fail.
findPos(Pos, [n(Pos,Cnt)|Rest], Cnt) :-
   !.
findPos(Pos, [n(Pos2,Cnt2)|Rest], Cnt) :-
   findPos(Pos, Rest, Cnt).


% ------------------------- delnode

ndel : LOSES heap memory on every call

   parameter 1: a integer, known at time of call
             2: a list of nodes as follows (  [n(1,2), n(3,4)...n(5,2) ] ) also
                known at time of call.
             3: a list which is the the result of removing the node having Pos
		as the first value.

Note: the list is guaranteed to contain a node (exactly one) that should 
      be removed.

Ex:  ndel( 3, [ n(1,2), n(4,3), n(3,6), n(12,5)], X )
     will return X = [ (n(1,2), n(4,3), n(12,5)].


ndel(Posn, [n(Posn, _)|Tail], Tail ) :-
   !.
ndel(Posn, [Node|Tail], [Node|NewList] ) :-
   ndel(Posn, Tail, NewList ).

Since, both functions use tail-recursion and cuts at appropriate places, I
do not understand why one function LOSES heap storage and the other doesn't.
Does anybody know what conditions cause a function to waste heap storage??

Please reply through e-mail.

Thanks,

Ron Castelletto
rcastelletto@lion.waterloo.edu
Technical Details
Message-ID: <22676@watdragon.waterloo.edu>
Path: arc1-ca.pugleaf.net!utzoo!utgpu!watserv1!watdragon!lion!rcastelletto

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!utzoo!utgpu!watserv1!watdragon!lion!rcastelletto
From: rcastelletto@lion.waterloo.edu (Ron Castelletto)
Newsgroups: comp.lang.prolog
Subject: Why does my Turbo Prolog program waste heap space??
Keywords: Turbo Prolog Heap Storage
Message-ID: <22676@watdragon.waterloo.edu>
Date: 29 Mar 90 21:54:40 GMT
Sender: daemon@watdragon.waterloo.edu
Distribution: comp
Lines: 71