Este ejemplo muestra la implementaci�n de findall/3 en CIAO Prolog. En otros entornos de desarrollo puede ser necesario hacer peque�as modificaciones. Observe como se utilizan los predicados din�micos y el predicado call/1. El concepto de coherencia l�gica tambi�n entra en juego, de otra forma no ser�a posible generar la lista de soluciones.
%% Importacion de los predicados assert/retract en CIAO Prolog :- use_module(library(dynamic)). %% Predicado dinamico que almacena temporalmente %% las soluciones del objetivo dado a findall/3 :- dynamic temp/1. %% findall/3 sigue los siguientes pasos: %% %% 1) En un bucle de fallo genera todas las soluciones %% y las almacena, por orden, en temp/1. %% 2) Las soluciones en temp/1 se recorren recursivamente %% para convertirlas en una lista. %% Las clausulas de temp/1 se eliminan en el proceso. :- export(findall/3). %% Esta declaracion es necesaria si usa CIAO Prolog. :- meta_predicate(findall(_,goal,_)). findall( Termino, Objetivo, Resultado) :- genera_soluciones(Termino,Objetivo), convierte_en_lista(Resultado). % Paso 1: recordar que Termino y Objetivo comparten variables. % cuando se ejecute Objetivo, automaticamente se ligan % las variables de Termino. genera_soluciones(Termino,Objetivo) :- call(Objetivo), assertz(temp(Termino)), fail. genera_soluciones(_,_). % Paso 2: caso general. convierte_en_lista([UnaSolucion|RestoSoluciones]) :- retract(temp(UnaSolucion)), !, convierte_en_lista(RestoSoluciones). % Paso 2: caso basico, no quedan mas soluciones en temp/1. convierte_en_lista([]).
� Copyright 2002
Angel Fern�ndez Pineda.