From ok@atlas.otago.ac.nz  Tue Nov 14 23:10:42 2000
Received: from atlas.otago.ac.nz (atlas.otago.ac.nz [139.80.32.250])
	by swi.psy.uva.nl (8.9.3/8.9.3) with ESMTP id XAA04838
	for <prolog@swi.psy.uva.nl>; Tue, 14 Nov 2000 23:10:41 +0100 (MET)
Received: (from ok@localhost)
	by atlas.otago.ac.nz (8.9.3/8.9.3) id LAA10547;
	Wed, 15 Nov 2000 11:10:25 +1300 (NZDT)
Date: Wed, 15 Nov 2000 11:10:25 +1300 (NZDT)
From: "Richard A. O'Keefe" <ok@atlas.otago.ac.nz>
Message-Id: <200011142210.LAA10547@atlas.otago.ac.nz>
To: ekovach@franuniv.edu, prolog@swi.psy.uva.nl
Subject: Re:  problems with asserta.

	
	fib(1,1).
	fib(2,1).
	fib(N,F) :-
	     N > 2,
	     N1 is N - 1, fib(N1, F1),
	     N2 is N - 2, fib(N2, F2),
	     F is F1 + F2,
	     asserta(fib(N,F)).
	
	
	ERROR: No permission to modify static_procedure 'fib/2'
	^ Exception: (14) asserta(fib(3,2)) ?
	
	What am I doing wrong?  Thanks for your help!
	
You are modifying a static procedure.
Good taste, efficiency, and a whole lot of other reasons dictate
a clean separation between static and dynamic code.

A good way to write this would be

	:- dynamic fib_table/2.

	fib(N, FN) :-
	    (   N < 3 -> FN = 1
	    ;   fib_table(N, F) -> FN = F
	    ;   N2 is N - 2, fib(N2, F2),
		N1 is N - 1, fib(N1, F1),
		F is F1 + F2,
		asserta(fib_table(N, F)),
		FN = F
	    ).

