Saltar al contenido
coden

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.

15 minutos Matěj Žalmánek 2026-10-15

Serie Fundamentos de IA Parte 24 de 52
  1. Mapa de la inteligencia artificial: qué es cada cosa y cómo encaja todo
  2. Breve historia de la inteligencia artificial: de Turing a los modelos de lenguaje
  3. Datos, modelo, entrenamiento, inferencia: los conceptos básicos en un solo ejemplo
  4. Cómo leer la notación matemática: símbolos, subíndices, sumatorios y cuantificadores
  5. Conjuntos y relaciones: las piezas con las que se construyen las definiciones en IA
  6. Funciones y aplicaciones: por qué todo modelo de IA es una función
  7. Lógica y demostraciones: las reglas con las que se razona en IA
  8. Grafos y árboles: la estructura sobre la que se apoyan la búsqueda y las redes neuronales
  9. Álgebra lineal para aprendizaje automático: vectores, matrices y por qué la IA sobre todo multiplica
  10. Derivadas, gradiente y regla de la cadena: cómo sabe un modelo en qué dirección aprender
  11. Descenso de gradiente: cómo aprende un modelo
  12. Qué es la probabilidad: del lanzamiento de un dado a los axiomas de Kolmogórov
  13. Probabilidad condicionada y teorema de Bayes: cómo cambiar una estimación cuando te enteras de algo nuevo
  14. Variable aleatoria y función de distribución: una sola función que lo dice todo sobre la distribución
  15. Función de densidad y función de probabilidad: por qué una variable continua tiene probabilidad cero en cada punto
  16. Esperanza, varianza y covarianza: dónde está una distribución, qué anchura tiene y qué se relaciona con qué
  17. Resumen de las distribuciones de probabilidad: Bernoulli, binomial, Poisson, uniforme, normal y exponencial
  18. Ley de los grandes números y teorema central del límite: por qué las medias se comportan de forma tan predecible
  19. Estadística y estimación de parámetros: máxima verosimilitud, MAP e intervalos de confianza
  20. Teoría de la información: entropía, entropía cruzada y divergencia KL, el origen de las funciones de pérdida
  21. Búsqueda en el espacio de estados: BFS, DFS, UCS y A* con animaciones
  22. Juegos y adversarios: minimax, poda alfa-beta y Monte Carlo tree search
  23. Satisfacción de restricciones: backtracking, propagación de restricciones y AC-3 con un sudoku y un mapa de regiones checas
  24. Lógica y sistemas basados en conocimiento: encadenamiento hacia delante y hacia atrás, resolución y sistemas expertos
  25. Planificación: STRIPS, el mundo de bloques, heurísticas a partir de la relajación y la planificación en los agentes de IA
  26. Búsqueda local y recocido simulado: un viajante por las capitales regionales checas
  27. Algoritmos genéticos: población, cruce, mutación y selección en una mochila para la excursión
  28. Estrategias evolutivas y programación genética: de la regla de un quinto a la ley de Kepler
  29. Optimización por colonia de hormigas: cómo un rastro de feromona encuentra un camino corto
  30. Optimización por enjambre de partículas: inercia, experiencia propia y experiencia del enjambre
  31. Neuroevolución: evolución de los pesos y la forma de las redes neuronales, y el algoritmo NEAT
  32. Conjuntos difusos y funciones de pertenencia: cómo escribir «algo cálido»
  33. Lógica difusa y probabilidad: por qué «algo cálido» no significa «probablemente cálido»
  34. Lógica difusa: t-normas, implicaciones y reglas SI–ENTONCES
  35. Control difuso: Mamdani y Sugeno, del ventilador al péndulo invertido sobre un carro
  36. Agrupamiento difuso: el algoritmo fuzzy c-means y los puntos entre clusters
  37. Sistemas neuro-difusos (ANFIS): reglas difusas que aprenden de los datos
  38. Cadenas de Markov: matriz de transición, distribución estacionaria y PageRank
  39. Modelos ocultos de Márkov: el algoritmo de Viterbi y el casino deshonesto
  40. Redes bayesianas: por qué está mojada la hierba y qué significa eso para el aspersor
  41. El filtro de Kalman: cómo estimar a partir de mediciones imprecisas dónde está un coche y a qué velocidad va
  42. Tipos de aprendizaje automático: supervisado, no supervisado, semisupervisado y más
  43. Prompts, contexto y RAG: cómo darle a un modelo la información correcta
  44. Autocodificadores variacionales (VAE): imágenes nuevas a partir de un espacio latente continuo
  45. Redes generativas adversarias (GAN): el falsificador contra el detective
  46. Modelos de difusión: cómo el ruido puro se convierte en una imagen
  47. Procesos de decisión de Markov: estados, acciones, recompensas y ecuaciones de Bellman
  48. Q-learning y DQN: aprender el valor de las acciones, de la tabla a la red neuronal
  49. Gradiente de la política y PPO: aprender directamente la política
  50. Cómo funciona un agente de IA: un modelo de lenguaje en un bucle con herramientas
  51. Programación con agentes de IA: encargo, pruebas y revisión
  52. 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é te llevarás
  • 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 α.

Dicho de forma sencilla

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 α.

Dicho de forma sencilla

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
Cuanto más sabe la base, menos mundos admite y más cosas se siguen de ella. Una base vacía admite todos los mundos, así que de ella solo se siguen tautologías.

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.

lluevemojadoresbalallueve ⇒ mojadomojado ⇒ resbalaKB
000110
001110
010100
011110
100010
101010
110100
111111

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.

Dicho de forma sencilla

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.

Dicho de forma sencilla

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
Por ejemplo, R6, mamífero ∧ tiene colmillos ∧ tiene garras ⇒ carnívoro, es la cláusula ¬mamífero ∨ ¬tiene colmillos ∨ ¬tiene garras ∨ carnívoro.

4. Encadenamiento hacia delante

Algoritmo — encadenamiento hacia delante
  1. Cada regla recuerda cuántas de sus premisas aún no se conocen. Pon todos los hechos en la agenda.
  2. Toma un símbolo de la agenda. Si ya se procesó, sigue con el siguiente.
  3. 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.
  4. 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.

Dicho de forma sencilla

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.

hechos reglas 1. tiene pelo 2. tiene colmillos 3. tiene garras 4. es leonado 5. tiene rayas negras 6. mamífero 7. carnívoro 8. tigre R1 tiene pelo ⇒ mamífero R2 da leche ⇒ mamífero R3 tiene plumas ⇒ ave R4 vuela ∧ pone huevos ⇒ ave R5 mamífero ∧ come carne ⇒ carnívoro R6 mamífero ∧ tiene colmillos ∧ tiene garras ⇒ carnívoro R7 mamífero ∧ tiene pezuñas ⇒ ungulado R8 carnívoro ∧ es leonado ∧ tiene manchas oscuras ⇒ guepardo R9 carnívoro ∧ es leonado ∧ tiene rayas negras ⇒ tigre R10 ungulado ∧ tiene cuello largo ⇒ jirafa R11 ungulado ∧ tiene rayas negras ⇒ cebra R12 ave ∧ no vuela ∧ nada ⇒ pingüino
Encadenamiento hacia delante: hechos en orden de procesamiento, los deducidos en verde pasos: 8

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
Cada símbolo se procesa como mucho una vez y cada aparición de una premisa baja un contador como mucho una vez; de ahí el tiempo lineal: el número de pasos es proporcional a la suma de las longitudes de las reglas.

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):

pasosímbolo procesadoR1R5R6R9R8
0—12333
1tiene pelo02333
2tiene colmillos02233
3tiene garras02133
4es leonado02122
5tiene rayas negras02112
6mamífero01012
7carnívoro01001
8tigre01001

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.

Dicho de forma sencilla

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.

R9 R5 ✗ R1 R6 R1 tigre carnívoro mamífero tiene pelo come carne ? mamífero tiene pelo tiene colmillos tiene garras es leonado tiene rayas negras
Encadenamiento hacia atrás para el objetivo «tigre»: bajo los nodos, las reglas

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).

Dicho de forma sencilla

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)
Sea ℓ como sea, uno de los restos tiene que cumplirse: esa es toda la demostración de que la resolución es correcta. De (ℓ) y (¬ℓ) surge la cláusula vacía, que nada satisface: una contradicción.
Algoritmo — conversión a forma normal conjuntiva
  1. Elimina las equivalencias: sustituye α ⇔ β por (α ⇒ β) ∧ (β ⇒ α).
  2. Elimina las implicaciones: sustituye α ⇒ β por ¬α ∨ β.
  3. Lleva las negaciones hasta los símbolos: ¬¬α ≡ α, ¬(α ∧ β) ≡ ¬α ∨ ¬β, ¬(α ∨ β) ≡ ¬α ∧ ¬β (De Morgan).
  4. 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.

Dicho de forma sencilla

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).

Dicho de forma sencilla

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
De forma equivalente, 1 − CF = (1 − CF1) · (1 − CF2): las incertidumbres restantes se multiplican. Por eso el orden de las reglas no importa.
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.

Un Agente en tu ordenador, controlado desde el móvil