# Inteligencia artificial para videojuegos/Razonamiento como inferencia lógica
## Introducción

El razonamiento es la facultad que permite resolver problemas, extraer conclusiones y aprender a realizar conexiones entre las causas y las consecuencias de las acciones. El razonamiento entendido como inferencia lógica en concreto permite, a partir de unos juicios, afirmar o no la validez de un enunciado. En Inteligencia Artificial se utiliza a menudo un razonador automático conocido como Prolog, el más famoso, también existen otros como Mercury, Gödel, Elf, Fish, Flang..., aunque una inmensa mayoría son extensiones de Prolog, además por supuesto está la posibilidad de programar nosotros uno propio.

## Prolog

Los lenguajes lógicos nacen, como el resto de lenguajes de programación, por la necesidad de facilitar y agilizar un proceso tedioso, en este caso, referido a la lógica. Prolog fue creado por Alain Colmerauer y Philippe Roussel en los 70, en la Universidad de Marsella, Francia. Un programa escrito en Prolog se compone principalmente de hechos y reglas, extrayendo la información mediante consultas. Se puede descargar en el ordenador o utilizar desde el navegador https://swish.swi-prolog.org/

### Definición

Lenguaje declarativo (lo contrario a procedimental) basado en reglas de la lógica. Sus siglas significan “Programming in Logic” y los programas consisten en un conjunto de hechos y de reglas que afirman “El hecho A es cierto si son ciertos los hechos B1, B2 … y Bn”. Las reglas servirán para deducir nuevos hechos a partir de otros.

## Cómo funciona

¿Qué hay detrás de un razonador automático? A lo largo de los años se probaron distintos métodos para realizar inferencia sobre enunciados, pero daban un coste muy elevado y en ocasiones, bucles infinitos, estas fueron las distintas etapas:

### Inferencia proposicional

Como su nombre indica, pretende hacer de toda regla y enunciado una proposición. Pero tenía poblemas: Los símbolos de función hacen que haya infinitos términos base para sustituir variables, como por ejemplo, en las relaciones de parentesco, el tatarabuelo equivaldría al padre del padre del padre... y con los casos extremos se podía solucionar limitando el número de niveles a acceder.
AMPLIAR MUCHO AQUÍ

### Modus Ponens generalizado

En los 60 cambia la tendencia de proposicionarlo todo.
Hacer una sustitución hace idénticas varias sentencias atómicas a las sentencias del lado izquierdo de una implicación, por lo que el problema se simplifica. Si sustituimos en el lado derecho y después inferimos, se obtiene un rendimiento mucho mayor.
Para hacer esto debemos ser capaces de hallar sustituciones que hagan idénticas sentencias lógicas distintas. Para ello se estandarizan las variables, se comprueba su ocurrencia y se unifica de la manera más general posible.
La base almacena enunciados en una lista y obtiene sustituciones que unifican la consulta con alguno de los enunciados. Para no tener que probar cada enunciado, se utilizan índices y distintas técnicas de optimización en la búsqueda.

### Inferencia por resolución

Guarda muchas similitudes con la inferencia proposicional:
* Si se usa refutación, es una inferencia completa.
* Las sentencias deben cumplir cierta norma.
Pero lo que la diferencia es que combina resolución binaria con factorización (eliminación sentencias redundantes). Para optimizar su funcionamiento existen diferentes estrategias siempre y cuando la base cumpla la condición de las Cláusulas Horn:

#### Encadenamiento hacia delante

Aplica el Modus Ponens a las sentencias atómicas de la base y crea nuevas hasta que todos los enunciados posibles están cubiertos y no existen redundancias. No tener símbolos de función en la base de conocimiento ayuda a simplificar la inferencia.

#### Encadenamiento hacia atrás

Es el más popular y el que utiliza Prolog. Genera una solución posible y busca más de una. Utiliza una búsqueda de primero en profundidad.

## Sintaxis

En Prolog tenemos que definir las reglas de nuestro sistema de lógica, es decir, el dominio, describir qué implican y cómo se construyen las relaciones lógicas y por último, exponer los hechos. Las variables se escriben en mayúsculas. Las constantes en minúsculas. Las afirmaciones terminan con un punto. No se aceptan nombres con espacios, en su lugar se utiliza un guión bajo (_).

### Proposiciones

Lo más simple de construir:
La urraca es un pájaro.
pajaro(urraca).

### Relaciones

"Juan es el padre de Miguel".
padre(juan, miguel).

### Reglas

- Condicionales "Si Pedro roba, entonces es un ladrón".
robar(pedro) :- ladron(pedro).
- Conjunciones AND: se utiliza la coma (,).
tia(X,Y) :-hermana(X,Z), padre(Z,Y).
- Disyunciones OR, se utiliza el punto y coma (;).
hijo(X,Y):-padre(Y,X); madre(Y,X).

## Consultas

No es necesario programar nada. Imaginemos que tenemos lo siguiente:
pajaro(urraca)
pajaro(gorrion)
pajaro(colibri)
Si consultamos con el siguiente comando (?-):
?-pajaro(gorrion) Prolog devolverá True
?-pajaro(hipopotamo) False