🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: comp.lang.prolog
Article #1068

Re: Prolog Prog. Technique Question

#1068
From: fore057
Date: Mon, 13 Aug 1990 06:06
51 lines
2419 bytes
In article <kalQPim00WB242VkMS@andrew.cmu.edu>, tg1e+@andrew.cmu.edu (Timothy R. Gottschalk) writes:
> I took a course that introduced Prolog syntax, but never touched prog.
> techniques.  Thus, I am feeling my way through.  I am writing code similiar
> to the following structure (in Turbo Prolog V2.0):
> 
>   loop(In):-
>       check_mouse,
>       do_eval(In, Out),
>       loop(Out).
>   loop(_):-
>       do_exit.
> 
> The compiler recognizes that it is tail-recursive, but still allocates memory
> off the heap during each iteration.  As the loop should only be run when
> the mouse button is pressed, the check_mouse succeeds when the button is
> pressed, but fails otherwise.  Commenting out the check_mouse or do_eval
> call does not necessarily stop the heap allocation, although commenting
> out both certainly does (of course).  The easiest solution would be to
> make a predicate fail somewhere, but, then, how would I be able to get a
> return value?  (Using reference vars or internal dbases seems to make the
> program run unacceptably slow).
> 
> Tim G.

If you want both input to and output from a predicate, it must have a arity
greater than one:

                loop(In,Out):-
                      check_mouse,
                      process(In,Out).

It's not clear from your example why you need a recursive structure.  However,
Prolog will eat lots of memory if a non-deterministic predicate is called
within the clause.  To avoid this, ensure that called predicates are
non-deterministic, or use a cut after the non-deterministic call:

                loop(In,In):-
                      condition(satisfied).

                loop(In,Out):-
                      process(In,In2),!,    %"process" is non-deterministic
                      ....
                      loop(In2,Out).

Note that variable "Out" remains unbound until the desired condition is
satisfied.

'Hope this helps,

Euan Mason
University of Canterbury, NZ.
Technical Details
Message-ID: <1990Aug13.173019.8912@canterbury.ac.nz>
Path: arc1-ca.pugleaf.net!utzoo!utgpu!news-server.csri.toronto.edu!clyde.concordia.ca!uunet!comp.vuw.ac.nz!virtue!canterbury.ac.nz!fore057
References: <kalQPim00WB242VkMS@andrew.cmu.edu>

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!utzoo!utgpu!news-server.csri.toronto.edu!clyde.concordia.ca!uunet!comp.vuw.ac.nz!virtue!canterbury.ac.nz!fore057
From: fore057@canterbury.ac.nz
Newsgroups: comp.lang.prolog
Subject: Re: Prolog Prog. Technique Question
Message-ID: <1990Aug13.173019.8912@canterbury.ac.nz>
Date: 13 Aug 90 06:06:50 GMT
References: <kalQPim00WB242VkMS@andrew.cmu.edu>
Organization: University of Canterbury
Lines: 51