[comp.lang.prolog] blam

bimbart@kulcs.uucp (Bart Demoen) (04/10/89)

In response to <674@tuvie> <678@tuvie> ulrich@vip.UUCP (Ulrich Neumerkel) :

We changed blam/2 to:

blam(0,[]).
blam(N,f(L,L)) :- N > 0, M is N - 1, blam(M,L).

(the list was changed to a functor with arity 2)

In BIMprolog
	?- blam(32,_l) , assert(little_fact(_l)) .
doesn't work but
	?- blam(32,_l) , record(key,_l) .
does, since our record predicates preserve the sharing of structures (not yet
of lists) and likewise recorded(key,_l) produces a structure on the heap
with all the original sharing.
( record/2 stores its second argument with the first argument as key
  recorded/2 retrieves the structure associated with the first argument
)

In response to <1717@etive.ed.ac.uk> jha@lfcs.ed.ac.uk (Jamie Andrews) :

>      I think most Prolog implementations would do this sensibly,
> representing this as 32 cons cells with both pointers pointing
> ...

On the heap ok, but in code - eg WAM code - that's another matter: even the most
sensible Prolog implementations might not search for common substructures;
taking sharing into account, the WAM code for little_fact/1 could be something
like:

	GET_LIST A1
	UNIFY_XVAR A1
	UNIFY_XVAL A1
	GET_LIST A1
	UNIFY_XVAR A1
	UNIFY_XVAL A1
	...		(in total 32 GET_LISTs)
	UNIFY_NIL
	UNIFY_NIL


bimbart@kulcs   bimandre@kulcs