From ok@atlas.otago.ac.nz Tue May  8 03:19:54 2001
Received: from atlas.otago.ac.nz (atlas.otago.ac.nz [139.80.32.250])
	by swi.psy.uva.nl (8.11.2/8.11.2) with ESMTP id f481Jr317145
	for <prolog@swi.psy.uva.nl>; Tue, 8 May 2001 03:19:53 +0200 (MET DST)
Received: (from ok@localhost)
	by atlas.otago.ac.nz (8.9.3/8.9.3) id NAA245430;
	Tue, 8 May 2001 13:19:41 +1200 (NZST)
Date: Tue, 8 May 2001 13:19:41 +1200 (NZST)
From: "Richard A. O'Keefe" <ok@atlas.otago.ac.nz>
Message-Id: <200105080119.NAA245430@atlas.otago.ac.nz>
To: dmiles@teknowledge.com, prolog@swi.psy.uva.nl
Subject: Re:  [SWIPL] Memoization

"Douglas R. Miles" <dmiles@teknowledge.com> wrote:
	I would like to see how to impliment a meta interpretor in SWI
	that can [handle a left-recursive rule].
	
See "The Craft of Prolog" where I describe how to do iterative deepening.

The example

	|?- path(1,5,X).
	
	path(X,Y) :- path(X,Z), edge(Z,Y).
	path(X,Y) :- edge(X,Y).
	
can't work even then because there is no path/3 predicate.


id(Goal) :-
    length(Bound, _),
    id(Goal, Bound, _).

id(Goal, Bound, Bound) :-
    fact(Goal).
id(Goal, [_|Bound0], Bound) :-
    rule(Goal, Body),
    id_body(Body, Bound0, Bound).

id_body([], Bound, Bound).
id_body([Goal|Goals], Bound0, Bound) :-
    id(Goal, Bound0, Bound1),
    id_body(Goals, Bound1, Bound).

fact(edge(1,2)).
fact(edge(2,2)).
fact(edge(2,4)).
fact(edge(2,3)).
fact(edge(3,5)).

rule(path(X,Y), [path(X,Z),edge(Z,Y)]).
rule(path(X,Y), [edge(X,Y)]).


With this code, the query id(path(1,5)) succeeds (at depth 3) in
SWI Prolog and Quintus Prolog.

