Lógica y sistemas basados en conocimiento: encadenamiento hacia delante y hacia atrás, resolución y sistemas expertos
La base de conocimiento, la consecuencia lógica y la comprobación de modelos, las cláusulas de Horn, el encadenamiento hacia delante y hacia atrás, la resolución, Prolog y los sistemas expertos desde MYCIN hasta los grafos de conocimiento, con un pequeño sistema que reconoce un animal.
Serie Fundamentos de IA Parte 24 de 52
- Mapa de la inteligencia artificial: qué es cada cosa y cómo encaja todo
- Breve historia de la inteligencia artificial: de Turing a los modelos de lenguaje
- Datos, modelo, entrenamiento, inferencia: los conceptos básicos en un solo ejemplo
- Cómo leer la notación matemática: símbolos, subíndices, sumatorios y cuantificadores
- Conjuntos y relaciones: las piezas con las que se construyen las definiciones en IA
- Funciones y aplicaciones: por qué todo modelo de IA es una función
- Lógica y demostraciones: las reglas con las que se razona en IA
- Grafos y árboles: la estructura sobre la que se apoyan la búsqueda y las redes neuronales
- Álgebra lineal para aprendizaje automático: vectores, matrices y por qué la IA sobre todo multiplica
- Derivadas, gradiente y regla de la cadena: cómo sabe un modelo en qué dirección aprender
- Descenso de gradiente: cómo aprende un modelo
- Qué es la probabilidad: del lanzamiento de un dado a los axiomas de Kolmogórov
- Probabilidad condicionada y teorema de Bayes: cómo cambiar una estimación cuando te enteras de algo nuevo
- Variable aleatoria y función de distribución: una sola función que lo dice todo sobre la distribución
- Función de densidad y función de probabilidad: por qué una variable continua tiene probabilidad cero en cada punto
- Esperanza, varianza y covarianza: dónde está una distribución, qué anchura tiene y qué se relaciona con qué
- Resumen de las distribuciones de probabilidad: Bernoulli, binomial, Poisson, uniforme, normal y exponencial
- Ley de los grandes números y teorema central del límite: por qué las medias se comportan de forma tan predecible
- Estadística y estimación de parámetros: máxima verosimilitud, MAP e intervalos de confianza
- Teoría de la información: entropía, entropía cruzada y divergencia KL, el origen de las funciones de pérdida
- Búsqueda en el espacio de estados: BFS, DFS, UCS y A* con animaciones
- Juegos y adversarios: minimax, poda alfa-beta y Monte Carlo tree search
- Satisfacción de restricciones: backtracking, propagación de restricciones y AC-3 con un sudoku y un mapa de regiones checas
- Lógica y sistemas basados en conocimiento: encadenamiento hacia delante y hacia atrás, resolución y sistemas expertos
- Planificación: STRIPS, el mundo de bloques, heurísticas a partir de la relajación y la planificación en los agentes de IA
- Búsqueda local y recocido simulado: un viajante por las capitales regionales checas
- Algoritmos genéticos: población, cruce, mutación y selección en una mochila para la excursión
- Estrategias evolutivas y programación genética: de la regla de un quinto a la ley de Kepler
- Optimización por colonia de hormigas: cómo un rastro de feromona encuentra un camino corto
- Optimización por enjambre de partículas: inercia, experiencia propia y experiencia del enjambre
- Neuroevolución: evolución de los pesos y la forma de las redes neuronales, y el algoritmo NEAT
- Conjuntos difusos y funciones de pertenencia: cómo escribir «algo cálido»
- Lógica difusa y probabilidad: por qué «algo cálido» no significa «probablemente cálido»
- Lógica difusa: t-normas, implicaciones y reglas SI–ENTONCES
- Control difuso: Mamdani y Sugeno, del ventilador al péndulo invertido sobre un carro
- Agrupamiento difuso: el algoritmo fuzzy c-means y los puntos entre clusters
- Sistemas neuro-difusos (ANFIS): reglas difusas que aprenden de los datos
- Cadenas de Markov: matriz de transición, distribución estacionaria y PageRank
- Modelos ocultos de Márkov: el algoritmo de Viterbi y el casino deshonesto
- Redes bayesianas: por qué está mojada la hierba y qué significa eso para el aspersor
- El filtro de Kalman: cómo estimar a partir de mediciones imprecisas dónde está un coche y a qué velocidad va
- Tipos de aprendizaje automático: supervisado, no supervisado, semisupervisado y más
- Prompts, contexto y RAG: cómo darle a un modelo la información correcta
- Autocodificadores variacionales (VAE): imágenes nuevas a partir de un espacio latente continuo
- Redes generativas adversarias (GAN): el falsificador contra el detective
- Modelos de difusión: cómo el ruido puro se convierte en una imagen
- Procesos de decisión de Markov: estados, acciones, recompensas y ecuaciones de Bellman
- Q-learning y DQN: aprender el valor de las acciones, de la tabla a la red neuronal
- Gradiente de la política y PPO: aprender directamente la política
- Cómo funciona un agente de IA: un modelo de lenguaje en un bucle con herramientas
- Programación con agentes de IA: encargo, pruebas y revisión
- Evaluación y seguridad de los sistemas de IA: cómo medir y cómo vigilar
Temario completo de la serie 52 de 83 temas publicados
- Qué significa que algo se siga de una base de conocimiento y por qué comprobar todos los mundos posibles es inservible por lento.
- Cómo el encadenamiento hacia delante y hacia atrás sacan conclusiones de reglas «si–entonces» y cuándo usar cada uno.
- Por qué los sistemas expertos triunfaron y chocaron con sus límites, y dónde sigue vivo hoy el conocimiento escrito a mano.
Conviene conocer antes: Lógica y demostraciones: las reglas con las que se razona en IA
Antes de que las máquinas empezaran a aprender de los datos, se intentó enseñar a mano a la inteligencia artificial: escribir lo que sabe un experto como reglas «si–entonces» y dejar que el ordenador sacara conclusiones de ellas. Así nacieron los sistemas expertos de los años setenta y ochenta, que diagnosticaban infecciones o configuraban ordenadores por encargo. Luego chocaron con sus límites y llegó un invierno de la inteligencia artificial. Pero sus ideas no desaparecieron: viven en Prolog, en las bases de conocimiento detrás de los buscadores y en la comprobación de lo que afirman los modelos de lenguaje.
Continúa la parte Lógica y demostraciones, donde encontrarás las conectivas, la implicación y el modus ponens.
1. La base de conocimiento y el motor de inferencia
Definición — base de conocimiento
Una base de conocimiento KB es un conjunto de oraciones de un lenguaje formal (aquí la lógica proposicional) que el sistema da por verdaderas. El sistema sabe hacer dos operaciones con ella: decir — añadir a KB una oración nueva — y preguntar — averiguar si de KB se sigue una oración α.
Una base de conocimiento es un cuaderno donde apuntas lo que es cierto: «todo animal con pelo es un mamífero», «este animal tiene pelo». El motor de inferencia es quien hojea el cuaderno y responde preguntas, aunque la respuesta no esté escrita en él directamente.
Este enfoque se llama declarativo. No se programa el procedimiento para llegar a la respuesta: solo se escribe qué es cierto, y el procedimiento es siempre el mismo motor de inferencia. ¿Quieres enseñar algo nuevo al sistema? Añades una oración; no reescribes nada.
A lo largo de toda la parte nos acompañará un pequeño sistema experto inspirado en el ZOOKEEPER de manual de Patrick Winston: doce reglas con las que se reconoce un animal por sus propiedades observadas. Hemos observado un animal que tiene pelo, colmillos y garras, es leonado y tiene rayas negras. ¿Qué es?
2. Consecuencia lógica y modelos
Definición — modelo y consecuencia lógica
Un modelo de una oración es una asignación de valores de verdad a los símbolos proposicionales en la que la oración es verdadera. El conjunto de modelos de una oración α se escribe M(α).
De KB se sigue α (es su consecuencia lógica), y se escribe KB ⊨ α, si y solo si M(KB) ⊆ M(α): en todo modelo de la base de conocimiento también se cumple α.
Un modelo es un «mundo posible»: una combinación de lo que es verdad y lo que no. Que algo se siga significa: sea como sea el mundo, si en él se cumple todo lo del cuaderno, también se cumple α. No se trata de lo que es probable, sino de lo que es inevitable.
KB ⊨ α ⇔ M(KB) ⊆ M(α)
- KB ⊨ α
- lo que preguntamos: ¿se sigue α de la base? El símbolo ⊨ habla de verdad en mundos, no de si sabemos deducir algo
- M(KB)
- los mundos que la base admite: asignaciones en las que se cumplen todas sus oraciones a la vez (la base es su conjunción); los demás mundos no nos interesan, de ellos la base afirma que no ocurrieron
- ⊆
- inclusión: en ningún mundo admitido puede faltar α; bastaría un solo contraejemplo para que α no se siguiera
- M(α)
- los mundos en los que se cumple α; puede haber muchos más: α puede cumplirse también donde la base no se cumple
La forma más directa de comprobar la consecuencia lógica es la comprobación de modelos: recorrer todas las asignaciones, quedarse con aquellas en las que se cumple toda la base y ver si en ellas también se cumple la pregunta. Nuestra base tiene 24 símbolos proposicionales («tiene pelo», «mamífero», «tigre»…), así que hay 224 = 16 777 216 asignaciones. De ellas, 13 440 son modelos de la base, y en todos se cumple «tigre». La respuesta es sí, pero al precio de dieciséis millones de filas de una tabla de verdad. Con cada símbolo más, el número se duplica; con una base de cientos de símbolos no terminaría nunca.
Ejemplo — comprobación de modelos con tres símbolos
Base KB = {llueve ⇒ mojado, mojado ⇒ resbala, llueve}, pregunta α = resbala. Tres símbolos dan 23 = 8 asignaciones (1 = verdadero, 0 = falso); la implicación p ⇒ q solo es falsa para p = 1, q = 0.
| llueve | mojado | resbala | llueve ⇒ mojado | mojado ⇒ resbala | KB |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 1 | 1 | 0 |
| 0 | 0 | 1 | 1 | 1 | 0 |
| 0 | 1 | 0 | 1 | 0 | 0 |
| 0 | 1 | 1 | 1 | 1 | 0 |
| 1 | 0 | 0 | 0 | 1 | 0 |
| 1 | 0 | 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | 1 | 0 | 0 |
| 1 | 1 | 1 | 1 | 1 | 1 |
Toda la base se cumple solo en la última fila, así que |M(KB)| = 1. En esa fila también se cumple «resbala»: M(KB) ⊆ M(resbala), y por tanto KB ⊨ resbala. El algoritmo recorrió 8 filas y en cada una evaluó las 3 oraciones de la base; en general, la comprobación de modelos cuesta O(2n · |KB|).
Ejemplo — de dónde salen los 13 440 modelos
En todo modelo de la base se cumplen los cinco hechos observados, y las reglas R1, R6 y R9 obligan entonces a «mamífero», «carnívoro» y «tigre». Esos 8 símbolos son verdaderos de forma fija. Los 16 restantes se dividen en grupos que no están relacionados entre sí por ninguna regla, y los números de sus asignaciones se multiplican:
- «da leche» (R2 se cumple, mamífero es verdadero) y «come carne» (R5 se cumple, carnívoro es verdadero): libres, 2 · 2 = 4;
- «tiene manchas oscuras», «guepardo» con la regla R8: tres asignaciones; no puede haber manchas sin guepardo;
- «tiene pezuñas», «ungulado», «tiene cuello largo», «jirafa», «cebra» con R7, R10, R11: si ungulado es falso, también deben ser falsas las pezuñas y los otros tres símbolos son libres (8 posibilidades); si es verdadero, debe cumplirse cebra, las pezuñas son libres y cuello con jirafa tienen 3 posibilidades (2 · 3 = 6); en total 14;
- el grupo de las aves «tiene plumas», «vuela», «pone huevos», «ave», «no vuela», «nada», «pingüino» con R3, R4, R12: sin ave no pueden cumplirse las plumas ni a la vez vuela y huevos (3 posibilidades) y los tres últimos símbolos son libres (8): 24; con ave, las plumas son libres (2), vuela y huevos libres (4) y de las ocho asignaciones de «no vuela, nada, pingüino» solo está prohibida 1, 1, 0 (7): 56; en total 80.
En conjunto 4 · 3 · 14 · 80 = 13 440, exactamente los que contó la comprobación de modelos. Y en cada uno de ellos se cumple tigre, porque está entre los símbolos verdaderos de forma fija.
3. Inferencia: correcta y completa
En lugar de recorrer mundos se puede manipular oraciones: a partir de las que tenemos, fabricar otras nuevas según reglas de inferencia como el modus ponens. Así lo hace también una persona.
Definición — inferencia, corrección, completitud
Escribimos KB ⊢ α cuando α puede obtenerse de KB mediante un número finito de aplicaciones de reglas de inferencia.
Un procedimiento de inferencia es correcto si de KB ⊢ α se sigue KB ⊨ α: solo deduce lo que realmente se sigue.
Es completo si de KB ⊨ α se sigue KB ⊢ α: deduce todo lo que se sigue.
El símbolo ⊨ significa «así es», el símbolo ⊢ «sé deducirlo». Un motor correcto nunca se inventa una falsedad. Un motor completo no pasa nada por alto. Queremos ambas cosas, y para la lógica general eso es caro, mientras que para una forma más sencilla de reglas es barato.
Definición — cláusula de Horn
Una cláusula de Horn es una disyunción de literales de los que como mucho uno es positivo. Una cláusula con exactamente un literal positivo es definida y puede escribirse como regla
p1 ∧ p2 ∧ … ∧ pk ⇒ q,
donde p1, …, pk son las premisas y q la conclusión. Para k = 0 es un hecho q.
Una cláusula de Horn es una regla «si se cumple esto y esto y esto, entonces se cumple aquello». Ningún «o» en la conclusión, ningún «no» en las premisas. Parece una gran limitación, pero la mayoría de las reglas de los expertos tienen justo esa forma, y la inferencia a partir de ellas es rápida.
¿Por qué «una disyunción con como mucho un literal positivo» es lo mismo que una regla? La implicación A ⇒ q equivale a ¬A ∨ q, y por la ley de De Morgan ¬(p1 ∧ … ∧ pk) es lo mismo que ¬p1 ∨ … ∨ ¬pk:
¬p1 ∨ … ∨ ¬pk ∨ q ≡ (p1 ∧ … ∧ pk) ⇒ q
- ¬p1 ∨ … ∨ ¬pk
- los literales negativos de la cláusula; juntos dicen «alguna premisa no se cumple», y eso es exactamente la negación de la conjunción de las premisas
- (p1 ∧ … ∧ pk)
- las premisas de la regla: la disyunción de literales negativos se convirtió en condición gracias a De Morgan; ninguna puede ser negativa, si no la regla diría «si no se cumple …»
- q
- el único literal positivo, la conclusión; si hubiera dos positivos, tendríamos «entonces q o r» y el motor de inferencia no sabría cuál de los dos añadir
- ⇒
- la cláusula es verdadera cuando alguna premisa no se cumple o se cumple la conclusión: es la definición de la implicación; la forma de regla solo lee de otra manera la misma disyunción
4. Encadenamiento hacia delante
Algoritmo — encadenamiento hacia delante
- Cada regla recuerda cuántas de sus premisas aún no se conocen. Pon todos los hechos en la agenda.
- Toma un símbolo de la agenda. Si ya se procesó, sigue con el siguiente.
- A cada regla que lo tenga entre sus premisas, réstale 1 al contador. Si llega a 0, la regla se dispara: añade su conclusión a la agenda.
- Repite hasta que la agenda esté vacía.
Teorema. Para una base de cláusulas de Horn definidas, el encadenamiento hacia delante es correcto y completo para los símbolos proposicionales: deduce exactamente los que se siguen de KB. Se ejecuta en tiempo lineal respecto al tamaño de la base.
Parte de lo que sabe y mira qué regla ha quedado «desbloqueada». Cada conclusión nueva puede desbloquear otra regla, como un dominó. Termina cuando ya no cae nada nuevo. Esto se llama inferencia dirigida por los datos.
La primera observación, «tiene pelo», desbloquea ya la regla R1, que añade «mamífero» al final de la agenda. Las otras cuatro observaciones de momento no disparan nada, pero van bajando los contadores. Cuando le toca el turno a mamífero, desbloquea R6 (colmillos y garras ya los conocemos) y surge «carnívoro». Carnívoro desbloquea R9 y tenemos un tigre. En ocho pasos, sin millones de filas. La regla R5 («un mamífero que come carne es carnívoro») no se disparó nunca: no sabemos si el animal come carne, y no necesitamos saberlo.
def dopredne(fakta, pravidla):
chybi = {r.id: len(r.kdyz) for r in pravidla}
zname, agenda = set(), list(fakta)
while agenda:
p = agenda.pop(0)
if p in zname:
continue
zname.add(p)
for r in pravidla:
if p in r.kdyz:
chybi[r.id] -= 1
if chybi[r.id] == 0: # conocemos todas las premisas
agenda.append(r.pak)
return zname
El corazón del algoritmo es el contador de cada regla r con premisas P(r):
faltan(r) = |P(r)| − |P(r) ∩ Conocidos|
- faltan(r)
- cuántas premisas aún no conocemos; con faltan(r) = 0 la regla se dispara; gracias al número, el motor lo detecta sin recorrer la lista de premisas
- |P(r)|
- el valor inicial: al principio no sabemos nada, faltan todas las premisas
- |P(r) ∩ Conocidos|
- las premisas ya procesadas; cada símbolo procesado baja en 1 el contador de cada regla en la que aparece, y se procesa una sola vez, por eso nada se cuenta dos veces
Cómo bajan los contadores durante nuestra ejecución (tras procesar el símbolo de cada fila; en negrita el cero, es decir, el disparo):
| paso | símbolo procesado | R1 | R5 | R6 | R9 | R8 |
|---|---|---|---|---|---|---|
| 0 | — | 1 | 2 | 3 | 3 | 3 |
| 1 | tiene pelo | 0 | 2 | 3 | 3 | 3 |
| 2 | tiene colmillos | 0 | 2 | 2 | 3 | 3 |
| 3 | tiene garras | 0 | 2 | 1 | 3 | 3 |
| 4 | es leonado | 0 | 2 | 1 | 2 | 2 |
| 5 | tiene rayas negras | 0 | 2 | 1 | 1 | 2 |
| 6 | mamífero | 0 | 1 | 0 | 1 | 2 |
| 7 | carnívoro | 0 | 1 | 0 | 0 | 1 |
| 8 | tigre | 0 | 1 | 0 | 0 | 1 |
R5 se queda en uno (falta «come carne») y R8, la del guepardo, también (falta «tiene manchas oscuras»). Las demás reglas no están en la tabla; sus premisas no aparecieron en la ejecución o solo aparecieron en parte.
Teorema — el encadenamiento hacia delante es correcto y completo (demostración)
Corrección. Cada símbolo deducido surgió del disparo de una regla cuyas premisas ya eran todas conocidas. En todo modelo de la base se cumplen los hechos y (por inducción sobre el orden de deducción) también los símbolos deducidos antes, así que por la regla se cumple también la nueva conclusión: es el modus ponens.
Completitud. Al terminar, tomemos la asignación m: verdadero para los símbolos deducidos (y los hechos), falso para todos los demás. Es un modelo de la base: si alguna regla p1 ∧ … ∧ pk ⇒ q no se cumpliera en m, todas las pi estarían deducidas y q no; pero entonces el contador de la regla habría llegado a cero y q se habría deducido. Por tanto, si q se sigue de la base, se cumple en el modelo m, y por tanto fue deducido. ∎
El modelo m es el «más modesto»: solo cree lo que debe. En nuestra base es la asignación en la que se cumplen exactamente las 5 observaciones, mamífero, carnívoro y tigre.
5. Encadenamiento hacia atrás
Algoritmo — encadenamiento hacia atrás
Demuestra el objetivo q:
- si q es un hecho conocido, está demostrado;
- si no, para cada regla p1 ∧ … ∧ pk ⇒ q intenta demostrar una a una todas las pi; si lo consigues con alguna regla, q está demostrado;
- si ninguna regla tiene éxito, la demostración ha fallado.
Para cláusulas de Horn definidas, el encadenamiento hacia atrás es correcto y completo y solo examina los símbolos relacionados con el objetivo.
Empieza con la pregunta «¿es un tigre?» y se pregunta qué lo confirmaría: un tigre es un carnívoro leonado con rayas negras. ¿Es carnívoro? Un carnívoro es un mamífero que come carne, o un mamífero con colmillos y garras. ¿Es un mamífero? … Hasta llegar a lo que sabe. Esto se llama inferencia dirigida por el objetivo.
def zpetne(cil, fakta, pravidla, cesta=()):
if cil in fakta:
return True # lo sabemos directamente
if cil in cesta:
return False # ciclo: el objetivo se demuestra a sí mismo
for r in pravidla:
if r.pak == cil: # O: basta una regla
if all(zpetne(p, fakta, pravidla, cesta + (cil,))
for p in r.kdyz): # Y: deben salir todas las premisas
return True
return False # no sabemos cómo demostrarlo
La función all se detiene en la primera premisa que no sale; por eso, en R5, tras el
fracaso con «come carne» ya no se examina nada más. La lista cesta (camino) vigila que
reglas como «a ⇒ b, b ⇒ a» no entren en un bucle.
El algoritmo examinó 11 objetivos. Primero intentó demostrar carnívoro con la regla R5: demostró mamífero, pero chocó con «come carne»; eso no lo sabemos, así que abandonó R5 y probó R6, que salió. Aquí es donde el encadenamiento hacia atrás es fuerte: sabe lo que le falta. En un momento así, un sistema experto pregunta al usuario: «¿Come carne el animal?». Toda la conversación con un sistema experto es, en realidad, encadenamiento hacia atrás en voz alta.
¿Cuándo usar cuál? El encadenamiento hacia delante conviene cuando llegan datos y quieres saber qué se sigue de ellos, por ejemplo al supervisar una producción. Hacia atrás, cuando tienes una pregunta concreta: un diagnóstico, una consulta a una base de datos. Si preguntáramos «¿es una cebra?», el encadenamiento hacia atrás lo refutaría tras examinar solo 5 objetivos: una cebra es un ungulado y nuestro animal no tiene pezuñas.
6. Resolución: inferencia para toda la lógica
Las cláusulas de Horn no bastan para todo. La oración «el animal es un mamífero o un ave» tiene una «o» en la conclusión, y no se puede escribir como regla. Para proposiciones arbitrarias existe una única regla que basta para todo.
Definición — resolución
Las oraciones se convierten a forma normal conjuntiva: una conjunción de cláusulas, cada una de las cuales es una disyunción de literales. Regla de resolución: de las cláusulas (A ∨ ℓ) y (B ∨ ¬ℓ) deduce (A ∨ B).
Demostración por reducción al absurdo: KB ⊨ α si y solo si KB ∧ ¬α es insatisfacible. La resolución deduce nuevas cláusulas de KB ∧ ¬α; si deduce la cláusula vacía, se ha encontrado una contradicción. Este procedimiento es correcto y completo (Robinson, 1965).
Si se cumple «llueve o está seco» y a la vez «no está seco o sopla viento», entonces «llueve o sopla viento»: lo seco se anula. La resolución demuestra por reducción al absurdo: supone lo contrario de lo que quiere demostrar y va recortando cláusulas hasta que queda una vacía, una contradicción. Así que lo contrario no se cumple.
( A ∨ ℓ ), ( B ∨ ¬ℓ ) ⊢ ( A ∨ B )
- ℓ, ¬ℓ
- literales complementarios: en cada mundo es verdadero exactamente uno de ellos, así que no satisface una de las cláusulas; esa debe satisfacerse con su resto. Por eso ℓ falta en el resultado
- A
- el resto de la primera cláusula: se cumple siempre que ℓ es falso (entonces la primera cláusula solo la sostiene A)
- B
- el resto de la segunda cláusula: se cumple siempre que ℓ es verdadero (entonces ¬ℓ no se cumple y la segunda cláusula la sostiene B)
Algoritmo — conversión a forma normal conjuntiva
- Elimina las equivalencias: sustituye α ⇔ β por (α ⇒ β) ∧ (β ⇒ α).
- Elimina las implicaciones: sustituye α ⇒ β por ¬α ∨ β.
- Lleva las negaciones hasta los símbolos: ¬¬α ≡ α, ¬(α ∧ β) ≡ ¬α ∨ ¬β, ¬(α ∨ β) ≡ ¬α ∧ ¬β (De Morgan).
- Distribuye ∨ sobre ∧: α ∨ (β ∧ γ) ≡ (α ∨ β) ∧ (α ∨ γ).
Ejemplo: (llueve ∨ nieva) ⇒ mojado
paso 2: ¬(llueve ∨ nieva) ∨ mojado
paso 3: (¬llueve ∧ ¬nieva) ∨ mojado
paso 4: (¬llueve ∨ mojado) ∧ (¬nieva ∨ mojado): dos cláusulas, ambas incluso de Horn.
La distribución del paso 4 puede alargar la fórmula exponencialmente; por eso, en la práctica, los solucionadores usan la transformación de Tseitin con símbolos auxiliares, que da un resultado solo linealmente más largo (satisfacible si y solo si lo es la fórmula original).
Ejemplo: la base {llueve ⇒ mojado, mojado ⇒ resbala, llueve}, pregunta «resbala». En forma normal y con la negación de la pregunta añadida:
(¬llueve ∨ mojado), (¬mojado ∨ resbala), (llueve), (¬resbala)
(llueve) y (¬llueve ∨ mojado) dan (mojado); (mojado) y (¬mojado ∨ resbala) dan (resbala); (resbala) y (¬resbala) dan la cláusula vacía. Contradicción: «resbala» se sigue de la base.
La resolución es universal, pero en general cara: para la lógica proposicional, el problema de satisfacibilidad (SAT) es NP-completo. Aun así, los solucionadores SAT modernos manejan millones de variables; hablamos de ellos en la parte sobre satisfacción de restricciones.
7. Reglas con variables y Prolog
La lógica proposicional tiene un defecto: «Rex es un mamífero» y «Micka es un mamífero» son para ella dos símbolos sin relación. Una regla sobre todos los mamíferos tendría que copiarse para cada animal por separado. La lógica de predicados de la parte sobre lógica y demostraciones lo resuelve con variables: ∀x : tiene_pelo(x) ⇒ mamífero(x).
Definición — unificación
Un unificador de dos expresiones es una sustitución de las variables tras la cual ambas expresiones son idénticas. Por ejemplo, rodič(jan, Y) y rodič(X, petr) (rodič = progenitor) se unifican con la sustitución {X / jan, Y / petr}. El algoritmo de unificación encuentra el unificador más general, si existe.
Unificar es «encontrar qué sustituir para que encaje». Cuando una regla habla de algún x y tú preguntas por Rex, la unificación sustituye x = Rex y la regla puede aplicarse. El encadenamiento funciona entonces igual que en la lógica proposicional, solo que con sustituciones.
def unifikuj(a, b, s): # s: sustitución hallada hasta ahora (diccionario)
if s is None:
return None # ya falló antes
a, b = dosad(a, s), dosad(b, s) # aplica lo que ya sabemos
if a == b:
return s
if je_promenna(a):
return None if vyskytuje_se(a, b) else {**s, a: b}
if je_promenna(b):
return None if vyskytuje_se(b, a) else {**s, b: a}
if slozeny(a) and slozeny(b) and a.jmeno == b.jmeno and len(a.args) == len(b.args):
for x, y in zip(a.args, b.args): # argumentos uno tras otro
s = unifikuj(x, y, s)
return s
return None # constantes o predicados distintos
En el ejemplo rodič(jan, Y) y rodič(X, petr): los predicados coinciden, así
que se comparan los argumentos. jan y X dan {X / jan}; Y y petr
añaden Y / petr. En cambio, rodič(jan, Y) y rodič(petr, eva) no se unifican:
jan y petr son constantes distintas. La comprobación vyskytuje_se (occurs check)
impide una sustitución como X / f(X), que llevaría a una expresión infinita.
(Prolog la omite por defecto para ganar velocidad).
Sobre el encadenamiento hacia atrás con unificación se apoya Prolog (Alain Colmerauer, Marsella, 1972), un lenguaje en el que el programa es una base de conocimiento y ejecutar el programa es una consulta (rodic = progenitor, prarodic = abuelo o abuela, kdo = quién):
rodic(jan, petr).
rodic(petr, eva).
prarodic(X, Z) :- rodic(X, Y), rodic(Y, Z).
?- prarodic(jan, Kdo).
Kdo = eva.
Prolog llega al objetivo prarodic(jan, Kdo) exactamente como nuestro árbol del tigre: encuentra la regla, unifica X = jan, demuestra rodic(jan, Y), encuentra Y = petr y luego rodic(petr, Z) con el resultado eva.
8. Sistemas expertos
Un sistema experto es una base de conocimiento redactada junto con un experto más un motor de inferencia, normalmente con encadenamiento hacia atrás y con la posibilidad de explicar por qué llegó a una conclusión: basta con leer el árbol que dibujamos más arriba. Los más conocidos fueron tres:
- DENDRAL (Stanford, desde 1965) determinaba la estructura de moléculas a partir de datos de un espectrómetro de masas: el primer sistema que hacía el trabajo de los científicos según sus propias reglas.
- MYCIN (Stanford, años setenta) diagnosticaba infecciones bacterianas de la sangre y recomendaba antibióticos. Tenía unas seiscientas reglas y, en una evaluación de 1979, sus propuestas salieron tan bien paradas como las de los especialistas de Stanford, o mejor. Aun así, nunca se usó en un hospital.
- XCON (la empresa DEC, desde 1980) montaba configuraciones de ordenadores VAX según el pedido. Tenía miles de reglas y, según la empresa, ahorraba decenas de millones de dólares al año.
Pero la medicina rara vez conoce la certeza. Por eso MYCIN añadía a cada regla un número que decía cuánto confiaba en ella el experto:
Definición — factor de certeza
El factor de certeza CF ∈ [−1, 1] expresa el grado de confianza en una conclusión: 1 se cumple con seguridad, −1 con seguridad no se cumple, 0 no lo sabemos. Si dos reglas con factores positivos CF1 y CF2 apoyan la misma conclusión, el factor resultante es
CF = CF1 + CF2 · (1 − CF1).
Una pista te convence en 0,6 y otra, independiente, en 0,5. Juntas, 0,6 + 0,5 · 0,4 = 0,8: la segunda pista quita la mitad de la incertidumbre que quedaba. Los factores de certeza no son probabilidades ni cumplen el teorema de Bayes; más tarde los sustituyeron las redes bayesianas, que tienen su propia parte en el temario.
CF = CF1 + CF2 · (1 − CF1)
- CF1
- la confianza que da la primera regla; la segunda regla no puede reducirla, solo añadir
- CF2
- qué parte de la incertidumbre restante elimina la segunda regla; si simplemente se sumara, dos pistas de 0,6 darían un absurdo 1,2
- 1 − CF1
- la incertidumbre que quedó tras la primera regla; solo de ella se puede seguir quitando, y por eso el resultado nunca supera 1
Ejemplo — tres pistas y una regla con premisas inciertas
Tres pistas 0,6, 0,5 y 0,5: primero 0,6 + 0,5 · (1 − 0,6) = 0,8, luego 0,8 + 0,5 · (1 − 0,8) = 0,9. Comprobación mediante las incertidumbres: 1 − 0,4 · 0,5 · 0,5 = 0,9.
Premisas inciertas. En MYCIN (Shortliffe y Buchanan, 1975), una conjunción de premisas recibe el factor de su eslabón más débil, y la conclusión de una regla recibe el factor de la regla multiplicado por ese factor mínimo (la regla solo se aplica si el mínimo supera 0,2): CF(conclusión) = CF(regla) · mini CF(pi). Una regla con factor 0,7 cuyas premisas tienen factores 0,9 y 0,6 aporta así a la conclusión 0,7 · min(0,9; 0,6) = 0,42.
A finales de los años ochenta se hicieron visibles los límites. La adquisición del conocimiento era el cuello de botella: el experto a menudo no sabe expresar su saber hacer como reglas, y cada regla costaba horas de entrevistas. Los sistemas eran frágiles: un paso fuera de su dominio no sabían nada, y ni siquiera sabían que no sabían nada. Y miles de reglas eran difíciles de mantener: una regla nueva podía contradecir en silencio a una antigua. El mercado de los sistemas expertos se hundió y llegó el segundo invierno de la inteligencia artificial. La respuesta que vino después es la contraria: no redactar el conocimiento, sino aprenderlo de los datos.
9. El conocimiento en la inteligencia artificial actual
- Grafos de conocimiento. Desde 2012, Google responde muchas consultas desde su grafo de conocimiento, una red de hechos del tipo (Praga, capital, Chequia). Wikidata, de libre acceso, tiene más de cien millones de elementos. Es una base de conocimiento, solo que en lugar de reglas predominan los hechos.
- Reglas allí donde todo tiene que poder comprobarse. Los cálculos fiscales, las condiciones de los seguros, la aprobación de créditos o las políticas de seguridad se siguen escribiendo hoy como reglas: cada decisión puede explicarse y defenderse.
- Modelos de lenguaje y conocimiento. Un modelo de lenguaje contiene una enorme cantidad de conocimiento, pero repartido por los pesos de la red: no puede leerse ni corregirse pieza a pieza, y el modelo a veces se inventa cosas con total seguridad. Por eso se le conecta la búsqueda en una base de conocimiento (RAG) o herramientas y motores de inferencia que verifican el resultado.
- La IA neurosimbólica une ambas cosas: la red reconoce lo que ve y la lógica deduce de ello lo que se sigue. Un ejemplo son los sistemas que buscan demostraciones matemáticas: el modelo propone un paso y una herramienta formal lo comprueba mecánicamente.
10. Resumen
- Una base de conocimiento es un conjunto de oraciones; KB ⊨ α significa que α se cumple en todos los modelos de la base. La comprobación de modelos lo verifica, pero al precio de 2n asignaciones.
- La inferencia (⊢) trabaja con oraciones en lugar de mundos. Queremos que sea correcta (no se inventa nada) y completa (no pasa nada por alto).
- Para las cláusulas de Horn basta el encadenamiento hacia delante (desde los hechos, dirigido por los datos) o hacia atrás (desde el objetivo, dirigido por la pregunta); hacia delante se ejecuta en tiempo lineal, hacia atrás solo examina lo relacionado con el objetivo.
- Para toda la lógica proposicional están la resolución y la reducción al absurdo; para las reglas con variables, la unificación y Prolog.
- Los sistemas expertos mostraron la fuerza y los límites del conocimiento escrito a mano, y prepararon el terreno para el aprendizaje a partir de datos.
¿Quieres probarlo? Pide a un agente de IA que escriba un sistema experto con encadenamiento hacia atrás que pregunte por los hechos que faltan, e inventa tus propias reglas para algo que conozcas bien.
¿Lo ves de otra manera? Escribe a support@coden-app.com.