Categorías destacadas
programacion php    
Artículo
13
¡votar!

 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.

 
Publicado por:
manuel delgado
Recomendar
a un amigo
Compartir
en redes
 
Comentarios
Walther Degreiff dice:

SUPER!

22/05/2010, a las 17:04:14
 
BBDD
Entornos de desarrollo
Entretenimiento
Herramientas
Internet
Lenguajes de script
Lenguajes imperativos
Lenguajes orientados a objeto
Otros lenguajes
Plataformas
Teoría
Varios
Copyright © 1998-2011 Programación en Castellano. Todos los derechos reservados
Datos legales | Politica de privacidad | Contacte con nosotros | Publicidad

Diseño web y desarrollo web. Un proyecto de los hermanos Carrero.

Red internet:
Juegos gratis | Servidores dedicados
Más internet: Password | Directorio de weblogs | Favicon