# Inteligencia artificial para videojuegos/Representación lógica

La lógica proposicional es un lenguaje demasiado endeble para representar de forma precisa el conocimiento de entornos complejos. La lógica de primer orden o lógica de predicados es un lenguaje que nos permite representar buena parte de nuestro conocimiento de sentido común. La lógica de predicados también subsume, o forma la base para, muchos otros lenguajes de representación y ha sido estudiada intensamente durante varias décadas.

## Características

La lógica de primer orden toma ciertos aspectos de representación del lenguaje natural, pero evita sus inconvenientes. La lógica proposicional asume que hay hechos que suceden o no el mundo; la lógica de primer orden va más allá: el mundo se compone de objetos con ciertas relaciones entre sí que pueden o no suceder:
* Objetos: los nombres y sentencias nominales del lenguaje natural.
* Relaciones: los verbos y sentencias verbales del lenguaje natural; distinguimos relaciones unitarias o propiedades (relación de un objeto consigo mismo) y n-arias (relación de unos objeto con otros).
* Funciones: relaciones en las que dada una entrada se obtiene un solo valor de salida.
Por ejemplo, en la frase “Uno sumado a dos es igual a tres” identificamos como objetos “uno”, “dos”, “uno sumando a dos” y “tres”; como relaciones “es igual a”; y como funciones “sumado a”. En lógica de primer orden, el dominio de un modelo es el conjunto de objetos que contiene.

### Comparación con otros lenguajes
#### Lógica Proposicional

La lógica proposicional cumple con tres características bastante deseables en cualquier lenguaje de representación del conocimiento. Es un lenguaje es expresivo, que se puede permitir manejar información incompleta. Los lenguajes de programación (como C++, o Java, o Lisp) son, de lejos, la clase más amplia de lenguajes formales de uso común. Los programas pueden almacenar un valor único para cada variable, y algunos sistemas permiten el valor «desconocido», pero carecen de la expresividad que se necesita para manejar información incompleta. La lógica proposicional es un lenguaje declarativo, ya que su semántica se basa en la relación de verdad entre sentencias y mundos posibles. Por último, la lógica proposicional es un lenguaje composicional, el significado de una sentencia es una función del significado de sus partes. Por ejemplo, «M ∧ N» está relacionada con los significados de «M» y «N». La no composicionalidad repercute en que al sistema de razonamiento le sea mucho más difícil subsistir.

#### Lenguaje Natural

La lógica proposicional carece del poder expresivo para describir de forma precisa un entorno con muchos objetos. De alguna manera, la sintaxis y la semántica del lenguaje natural nos hace posible describir el entorno de forma precisa. De hecho, los lenguajes naturales (como el inglés o el castellano) son muy expresivos, y se podrían ver como un lenguaje de representación del conocimiento declarativo y composicional, e intentar definir su semántica formal. Sin embargo, el punto de vista actual sobre el lenguaje natural es que sirve más como un medio de comunicación que como una representación, puesto que su semántica es dependiente del contexto y puedo conducir a la ambigüedad.

## Sintaxis

Las relaciones entre los elementos del dominio son un conjunto de tuplas de objetos relacionados; si la relación se da entre exactamente dos elementos estamos hablando de una función unitaria. La sintaxis de la lógica de primer orden agrupa sus símbolos en símbolos de constante (para los objetos), símbolos de predicado (para las relaciones) y símbolos de función (para las funciones).

## Semántica

La semántica de la lógica de primer orden debe relacionar las sentencias con los modelos para determinar su valor de verdad. Para que esto ocurra, necesitamos de una interpretación que especifique exactamente qué objetos, relaciones y funciones son referenciados mediante símbolos de constante, de predicados y de función, respectivamente.
Un término es una expresión lógica que se refiere a un objeto. Considerando un término f(t$_1$ … t$_n$), el símbolo de función f se refiere a alguna función del modelo (llamémosla F); los términos argumento se refieren a objetos del dominio (llamémoslos d$_1$ … d$_n$); y el término en su globalidad se refiere al objeto que es el valor obtenido de aplicar la función F a los objetos d$_1$ … d$_n$. Una sentencia atómica es verdadera en un modelo dado, y bajo una interpretación dada, si la relación referenciada por el símbolo de predicado sucede entre los objetos referenciados por los argumentos.

### Conectivas

Al igual que en lógica proposicional, podemos utilizar conectivas para elabora sentencias compuestas. Podemos utilizar el símbolo de igualdad (=) para construir enunciados describiendo que dos términos se refieren al mismo objeto. Los cuantificadores nos permiten expresar las propiedades de colecciones enteras de objetos. El cuantificador universal (∀) indica que para todos los posibles valores de una variable se cumple cierta sentencia, que implique o no a esa variable. El cuantificador existencial (∃) indica que existe al menos un valor de la variable que verifica una sentencia, que implique o no a esa variable.

#### Ejemplos

PiernaIzquierda(Juan); La pierna izquierda de Juan
Hermano(Ricardo, Juan); Ricardo es hermano de Juan
¬Rey(Ricardo) ⇒ Rey(Juan); Si Ricardo no es rey, entonces Juan es rey
Juan = Rey Juan; Juan es el Rey Juan
∀x Rey(x) ⇒ Persona(x); Para todo x se cumple que, si x es rey, entonces x es persona
∃x SobreCabeza(x, Juan); Para algún x se cumple que x está sobre la cabeza de Juan

## Base de Conocimiento con Lógica de Primer Orden

Cuando trabajamos con una base de conocimiento, a veces utilizamos una semántica alternativa que se caracteriza por asumir nombres únicos (dos objetos con nombre distinto son siempre distintos), mundos cerrados (una sentencia desconocida se toma por falsa) y cierre de dominio (existen tantos objetos como símbolos de constante). Las sentencias que se dicen a la base de conocimiento se denominan ASSERTIONS, y pueden ser axiomas (nuevas definiciones) o teoremas (contenidos en los axiomas); las sentencias que se preguntan reciben el nombre de QUERIES.
La construcción de bases de conocimiento es toda una disciplina de la inteligencia artificial. Algunas son de propósito general (WordNet, Cyc, EDR…) pero lo habitual es que tengan un propósito específico. Una base de conocimiento debe reunir las siguientes características:
* Identificar la tarea que debe hacer el agente
* Adquirir el conocimiento necesario
* Decidir el vocabulario de símbolos (ontología)
* Codificar conocimiento general del dominio
* Codificar conocimiento específico del problema
* Realizar consultas y conseguir respuestas
* Depurar la base y repetir el paso anterior

### Prolog

Prolog (o PROLOG), proveniente del francés PROgrammation en LOGique,​ es un lenguaje de programación lógico e interpretado usado habitualmente en el campo de la Inteligencia artificial. Se trata de un lenguaje de programación ideado a principios de los años 70 en la Universidad de Aix-Marseille I (Marsella, Francia) por los estudiantes Alain Colmerauer y Philippe Roussel. Nació de un proyecto que no tenía como objetivo la traducción de un lenguaje de programación, sino la clasificación algorítmica de lenguajes naturales. Inicialmente se trataba de un lenguaje totalmente interpretado hasta que, en 1983, David H.D. Warren desarrolló un compilador capaz de traducir Prolog en un conjunto de instrucciones de una máquina abstracta denominada Warren Abstract Machine, o abreviadamente, WAM. Desde entonces Prolog es un lenguaje semi-interpretado. Prolog se enmarca en el paradigma de los lenguajes lógicos y declarativos, lo que lo diferencia enormemente de otros lenguajes más populares tales como Fortran, Pascal, C o Java.
Los programas en Prolog se componen de cláusulas de Horn que constituyen reglas del tipo "modus ponendo ponens", es decir, "Si es verdad el antecedente, entonces es verdad el consecuente". No obstante, la forma de escribir las cláusulas de Horn es al contrario de lo habitual. Primero se escribe el consecuente y luego el antecedente. El antecedente puede ser una conjunción de condiciones que se denomina secuencia de objetivos. Cada objetivo se separa con una coma y puede considerarse similar a una instrucción o llamada a procedimiento de los lenguajes imperativos.
Prolog, además de un lenguaje extremadamente elgante para codificar ciertos algoritmos, cumple todos los requisitos para ser el lenguaje de referencia en las bases de conocimiento de los agentes basados en conocimiento.