Artículo
|
Curso avanzado de Prolog |
Ejemplo de metapredicado
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.
Comentarios
Walther Degreiff dice:
SUPER!
22/05/2010, a las 17:04:14
Últimas noticias
Últimos artículos















































