Curso avanzado de Prolog

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.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR

SIGUIENTE ARTÍCULO