En [1] puede encontrarse la documentación y código fuente de un sistema de representación del conocimiento e inferencia. El lenguaje de representación del conocimiento es una versión restringida de la lógica de predicados, conteniendo sólo sentencias atómicas y cláusulas de Horn de la forma donde cada uno de los antecedentes y el consecuente son sentencias atómicas. Se supone que todas la variables están cuantificadas universalmente. Por simplicidad este lenguaje no permite símbolos de funciones ni igualdad. Obsérvese también que se necesita una distinción sintáctica entre variables y constantes.
A continuación describimos las líneas maestras para la construcción de un sistema de este tipo.
donde
Por ejemplo:
Si no se puede encontrar tal sustitución la rutina debe devolver un fallo. Obsérvese por tanto que será necesario distinguir entre una substitución vacía y el resultado fallido de una unificación.
En la rutina de unificación que se propone en [2] se supone una implementación de las expresiones lógicas de tipo OPERADOR/ARGUMENTOS. De ahí se deduce el comportamiento de las funciones COMPOUND?, LIST?, OP?, ARGS?, FIRST?, REST?.
Se supone también que se renombran las variables del segundo argumento en caso de conflicto de nombres.
En principio
UNIFY(Conoce(Pepe,x), Conoce( x,Pepa)) devuelve fallo pero es irrelevante que en la Base de Conocimiento tuviésemos Conoce(x, Pepa) ó Conoce(z, Pepa), con lo que renombrando las variables del segundo argumento
Obsérvese también que la parte occur-check del seudocódigo propuesto es necesaria porque no se puede unificar una expresión que contiene una variable dada con esa misma variable. Si queremos unificar P(x) y P(F(x)) y sustituimos x/F(x) nos quedará P(F(x)) y P(F(F(x))), y realizando de nuevo la misma sustitución nunca llegaríamos a eliminar x.
Téngase en cuenta que la rutina de unificación nos permitirá inferir con Modus Ponens Generalizado:
Para las sentencias atómicas ; si hay una substitución
tal que
, entonces
Así por ejemplo si en nuestra base de conocimiento tuviésemos
Conoce(Pepe, Pepa)
y ya que podemos inferir
Se supone que al añadir una nueva sentencia atómica a la base de conocimiento se dispara el proceso de inferencia y se añaden a la base de conocimiento todas las sentencias que pueden inferirse. Si las premisas se pueden igualar de varias formas se inferirá cada conclusión correspondiente. Por otra parte si la sentencia ya estaba en la base de conocimiento el algoritmo no hace nada. Para esto último el algoritmo utiliza el concepto de renaming: una sentencia es idéntica a otra excepto en el nombre de las variables. Por ejemplo Conoce(x, Pepe) y Conoce(y, Pepe) son idénticas excepto en el nombre de las variables ya que sólo se diferencias en la elección de x ó y.
El seudocódigo propuesto utiliza también la idea de composición de sustituciones:
es la sustitución tal que
Por ejemplo: si
El algoritmo propuesto está diseñado para responder a preguntas propuestas a la base de conocimiento. Primero se chequea si la respuesta puede encontrarse directamente en la base de conocimiento. Luego se buscan todas las implicaciones cuyo consecuente se puede unificar con la pregunta y se validan las premisas de esas implicaciones también con encadenamiento hacia atrás. Si la premisa es una conjunción de elementos el algoritmo los procesa uno a uno construyendo el unificador global para toda la premisa. En el algoritmo propuesto debe prestarse especial atención a la forma en la que se responde a la pregunta.