Sunteți pe pagina 1din 3

4 Prctica: construccin de un motor de inferencia

Se trata de construir un motor de inferencia (M.I.) en C, C++, Java, o Pascal en su defecto, que soporte nicamente el encadenamiento hacia atrs.

Consulta las reglas generales de entrega de prcticas.

Texto de la prctica
1. El motor de inferencia se basar en lgica proposicional, debiendo soportar clusulas de Horn: es decir, las reglas slo tienen un consecuente y todos los precedentes estn relacionados por el juntor y. El programa debe tener un men principal con las siguientes opciones:
Insertar <H>echo Insertar <R>egla <L>istado de la base de conocimiento <E>ncadenamiento hacia atrs Opcin:

El formato y opciones del men son libres, pero esas opciones deben estar. La entrada de hechos y reglas es libre. Los hechos no tienen ningn formato especial. En cuanto a las reglas, se pueden pedir en el formato que se prefiera (incluso consecuentes y hechos por separado). La opcin de listado debe producir la salida de los hechos tal cul estn almacenados, y las reglas con el formato:
consecuente :- precedente1,precedente2,precedente3,...,precedenteN

La opcin de encadenamiento hacia atrs debe pedir un hecho objetivo,. y mostrar por pantalla, al final de la inferencia, si ese hecho es cierto o falso. Por ejemplo, supongamos:
Insertar <H>echo Insertar <R>egla <L>istado de la base de conocimiento <E>ncadenamiento hacia atrs Opcin: L Reglas: a :- b,c,d Hechos: b c d

Insertar <H>echo Insertar <R>egla <L>istado de la base de conocimiento <E>ncadenamiento hacia atrs Opcin: E Introduzca Objetivo: a El objetivo es cierto. Insertar <H>echo Insertar <R>egla <L>istado de la base de conocimiento <E>ncadenamiento hacia atrs Opcin: L Reglas: a :- b,c,d Hechos: b c d a

En cuanto al diseo de la prctica, se aconseja que se disee una estructura llamada hecho. Una regla no es ms que un hecho actuando como consecuente, ms un conjunto indeterminado de hechos actuando como precedentes. Puede utilizarse, por ejemplo, un vector con un tope de 20 precedentes para implementar esto, aunque, por supuesto, lo ms correcto sera un vector dinmico de precedentes. Para guardar los hechos y las reglas, es posible utilizar un vector dinmico separado para cada una de estas dos tipos de datos. En cuanto al algoritmo de encadenamiento hacia atrs, slo debe ocuparse de confirmar o no una regla segn sus precedentes existan en la base de reglas o no.
atras(objetivo:hecho):boolean dev <- true if (not(existe_hecho_en_BC(objetivo))) regla_obj <busca_regla_por_consecuente(lista_reglas,objetivo) while (dev = true and num_reglas_disponibles_consecuente(lista_reglas,objetivo)<>0) if (regla_encontrada(regla_obj))

n <- 0 precs <- 0 while (n < num_precedentes(regla_obj)) if (atras(precedente(regla_obj,n)) precs <- precs + 1 n <- n + 1; end if (precs<>num_precedentes(regla_obj)) dev <- false else aade_hecho_BC(objetivo) end else dev <- false; regla_obj <- busca_sig_regla_por_consecuente(lista_reglas, objetivo); end end end return dev end

La implementacin del algoritmo es libre, si bien el anterior puede servir de gua.

2. Introduce la siguiente regla: a :- a if (a) then a. y encadena hacia atrs con tu MI utilizando como objetivo a. Que sucede ? Intenta resolverlo.

Entregad las respuestas a las preguntas, y el cdigo fuente, como prctica.