En este fichero se incluye el grueso de las funciones correspondientes a la aplicación. A continuación se explica el cometido de las principales funciones, detallando para ello los pseudocódigos correspondientes.
ESCRIBE PETICION DE ORDEN LEE ORDEN (USANDO PARSER Y SCANNER) SI LA ORDEN ES LIST : LISTAR(BC). SAVE(EXP) : SAVE_AUX(EXP) DROP(EXP) : BC=DROP_AUX(EXP,BC) EMPTY : BC=[] IN : IN_AUX(EXP) SALIR : SALIR PROOF : ENCADENAMIENTO_BACK(EXP),ESCRIBIR SUS RESULTADOS
Función que dada una expresón determina si existe en la base de conocimiento.
MIENTRAS HAYA SENTENCIAS EN BC SEA EXP1=HEAD(BC) SI EXP1 ES ATOMO T=UNIFICAR(EXP,EXP1) SI EXISTE T ESCRIBIR T
Función que dada una expresón la elimina, si procede, de la base de conocimiento.
SI BLOCAL=[] ENTONCES ERROR SINO SEA EXP1=HEAD(BLOCAL) Y R=TAIL(BLOCAL) SI EXP=EXP1 ENTONCES R SINO (EXP1 :: DROP_AUX(EXP,R))
Función que dada una expresón, la introduce (en caso de que no exista ya) en la base de conocimiento.
SI EXP ES ATOMO ENCADENAMIENTO_FORWARD(EXP) ESCRIBIR EL NUMERO DE NUEVAS CLAUSULAS SINO SI EXP ESTA EN BC ESCRIBIR MENSAJE OPORTUNO SINO BC=EXP::BC
Esta función ha sido construida basándonos en el algoritmo propuesto por Russell en el libro:
Russell S., Norvig P. Artificial Intelligence: A Modern Approach ,Editorial Prentice-Hall, 1995.
SI EXP NO ESTA EN BC ENTONCES BC = (EXP :: BC) (EXP::ENC_AUX (EXP,BC,BC))
Función auxiliar que determina si la nueva expresion (EXP) puede inferir nuevos hechos, a partir de implicaciones ya existentes en la base de conocimiento. Devuelve la base de conocimientos modificada (si es que se infieren hechos, en caso contrario la deja inalterada)
SI BLOCAL=[] ENTONCES [] SINO SEA EXP1=HEAD(BLOCAL) Y R=TAIL(BLOCAL) SI EXP1 ES UNA IMPLICACION SEAN X1, X2, ...., XN SUS ATOMOS ANTECEDENTES e Yi SU CONSECUENTE PARA CADA Xi TAL QUE T=UNIFICAR(Xi,EXP) Ki=FIND_AND_INFER(BASE,[X1,...,Xi-1,Xi+1,..,XN],Yi,T) J=UNION Ki J UNION enc_aux(EXP,BASE,R)
Función que implementa la función del mismo nombre propuesta por Russell.
SI LISTANT=[] SEA X=(CONS SUST) SI X NO ESTA EN BASE ENCADENAMIENTO_FORWARD(X) SINO RECORRE (BASE) SI T=UNIFICAR(HEAD(LISTANT),HEAD(BASE)) UNION (find-and-infer(BASE,RESTO(LISTANT),CONS,COMPOSICION(T,SUST)) (RECORRE TAIL(BASE)) SINO (RECORRE TAIL(BASE))
Reflejo del algoritmo de Russell.
BACK_CHAIN_LIST(BASE,[EXP],[])
Reflejo del algoritmo de Russell.
ANSWERS=[] SI LISTAOBJ=[] SUST SINO SEA H=HEAD(LISTAOBJ) Y K=TAIL(LISTAOBJ) PARA CADA SENTENCIA ATOMICA EN BASE QUE UNIFICA CON H, MEDIANTE S SI COMPOSICION (S,SUST) NO ESTA EN ANSWERS METER LA COMPOSICION EN ANSWERS PARA CADA IMPLICACION EN BASE CUYO OBJETIVO UNIFICA CON H, MEDIANTE S2 UNIR A ANSWERS BACK_CHAIN_LIST(BASE,H ANTECEDENTES,COMPOSICION(S2,SUST)) UNION (BACK_CHAIN_LIST(BASE,K,Si) PARA CADA Si de ANSWERS
Función que determina, dadas dos expresiones, si puede haber una sustitución que las haga iguales. Una de las dos expresiones, de la forma que funciona la aplicación, es atómica.
SEAN V=VARIABLES(EXP1) Y W=VARIABLES(EXP2) SI V INTERSECCION W NO ES VACIO RENOMBRAR EN EXP2 LAS VARIABLES COMUNES SI UNA NO ES ATOMO ENTONCES NO UNIFICAN SINO SI TIENEN EL MISMO NOMBRE DE PREDICADO Y EL MISMO NUMERO DE TERMINOS UNIFICAN SI UNIFICAN TODOS SUS TERMINOS (función trivial) SINO NO UNIFICAN