miércoles, 17 de julio de 2013

Aplicaciones del Lenguaje PROLOG

Aplicaciones actuales del Lenguaje PROLOG
  • Prolog se puede utilizar para resolver, básicamente, cualquier tipo de problema.
  • Principalmente es útil en la gestión de Juegos, en Inteligencia Artificial y Sistemas Expertos, como lenguaje especialmente pensado para construir bases de conocimientos basados en la lógica que forman parte importante de cualquier agente inteligente, en la construcción de Compiladores e Intérpretes, en el Reconocimiento del Lenguaje Natural, etc.
RFuzzy para reconocer las emociones humanas

Investigadores de la Facultad de Informática de la Universidad Politécnica de Madrid han desarrollado una aplicación que permite reconocer las emociones humanas a través del estudio automatizado de la voz.
La aplicación analiza las medidas sonoras de una conversación, que se obtienen con otro programa específico, y en base a las reglas descritas en la nueva aplicación, es capaz de distinguir las emociones escondidas en una oración, pudiendo determinar si una persona está triste, asustada, alegre o nerviosa. La aplicación puede precisar, incluso si la emoción no está clara, el porcentaje de adecuación del hablante a cada emoción.

La aplicación se basa en una nueva herramienta conocida como RFuzzy, implementada sobre el lenguaje de programación Prolog, que es capaz de representar y trabajar con la así llamada lógica difusa. Prolog se usa principalmente en aplicaciones de Inteligencia Artificial y Sistemas Expertos.
RFuzzy es un soporte de programación que se diferencia de otros por su facilidad de uso para cualquier programador y porque es muy expresivo. Permite representar, manejar y razonar con conceptos subjetivos como “alto”, “bajo”, “rápido”, “lento”, etc.

RFuzzy se ha utilizado para potenciar la inteligencia de los robots. Por ejemplo: RFuzzy se ha aplicado para la programación de robots participantes en la ligamundial de fútbol de robots (RoboCupSoccer), que se viene desarrollando desde1996 con la finalidad de desarrollar la robótica y la Inteligencia Artificial.

Inteligencia de los robots

Además de aplicarse para detectar emociones en las conversaciones humanas, RFuzzy se ha utilizado asimismo para potenciar la inteligencia de los robots. En este caso concreto, RFuzzy se ha aplicado para la programación de robots participantes en la liga mundial de fútbol de robots (RoboCupSoccer), que se viene desarrollando desde 1996 con la finalidad de desarrollar la robótica y la Inteligencia Artificial. La experiencia está recogida en el libro Robot Soccer, Inteh, Croatia, 2010, editado por Vladan Papic.

Problema de Torres De Hanoi

El problema de las torres de Hanoi consiste en mover un conjunto de discos de un palo a otro palo utilizando un palo auxiliar situado en medio. Las reglas para mover los discos son las siguientes:
  • No se puede mover más de un disco en cada ocasión.
  • No puede quedar un disco de menor radio debajo de un disco de mayor radio.
  • Mover el conjunto de discos se puede ver como: mover N-1 discos del palo izquierdo al palo del medio, mover el disco sobrante del palo izquierdo al palo derecho y mover N-1 discos del palo del medio al palo derecho.
Pseudocódigo:

  1. hanoi(N)<-mover(N,izquierda,medio,derecha).
  2. mover(1,A,_,C)<-Pasar disco de A a C.
  3. mover(N,A,B,C)<-mover(N-1,A,C,B), mover(1,A,C), mover(N-1,B,A,C).


Problema del Laberinto

  • Necesitamos que nuestro comecocos salga de un laberinto.
  • El comecocos es capaz de moverse a derecha, izquierda, arriba y abajo.
  • Implementar en Prolog un programa que permita a nuestro comecocos buscar la salida de un laberinto cualquiera.



Laberinto:
El significado del laberinto que debemos codificar es el de adyacencia deposiciones y el de accesibilidad o no de las posiciones.
Ejemplo: una matriz de caracteres
Comecocos:
La información relevante del comecocos a lo largo de la resolución del problema es su posición en el laberinto.

Estados:
El estado inicial será la entrada al laberinto.
El estado final será la salida.

Transición de estados: (transiciones posibles, operadores)
Si los estados son las posiciones, una transición de estados consiste en pasar de una posición a otra. Las posibles acciones que podemos efectuar para pasar de un estado a otro son los movimientos del comecocos: moverse arriba, moverse abajo, moverse a la derecha, moverse a la izquierda
.
arriba(X1,Y1) = X1,Y2 tal que Y2 es Y1-1
abajo(X1,Y1) = X1,Y2 tal que Y2 es Y1+1
derecha(X1,Y1) = X2,Y1 tal que X2 es X1+1
izquierda(X1,Y1) = X2,Y1 tal que X2 es X1-1

Transición de estados: (restricciones)
Las restricciones nos marcan qué estados son válidos y qué estados no lo son.
En nuestro problema, las restricciones vienen impuestas por el laberinto: no se pueden exceder las dimensiones del laberinto y nuestro comecocos sólo puede estar en posiciones que sean pasillo.
Por tanto, serán válidos los estados que verifiquen:


  • valido(X,Y) sii
  •  0 <= X < columnas,
  •  0 <= Y < filas,
  •  laberinto( X,Y ) = ‘pasillo’.

Consideraciones:
Atención con las restricciones que hemos impuesto a la transición de estados


Implementación en Prolog:

Representación:
% laberintos de ejemplo
% sintaxis:
% laberinto( Num, Lab )
% Num --> número de laberinto
% Lab --> matriz bidimensional de caracteres que representa al laberinto
% entrada( Num, X, Y )
% Num --> número de laberinto
% X --> coordenada x de la entrada al laberinto Num
% Y --> coordenada y de la entrada al laberinto Num
% salida( Num, X, Y )
%Num --> número de laberinto
% X --> coordenada x de la salida del laberinto Num
% Y --> coordenada y de la salida del laberinto Num

Implementación en Prolog:

Representación:
% Nota:
%laberinto(1,[
"####### ######",
"#####   #######",
"# ###  #### ###",
"# ### # ###",
"# ###### ###",
]).
entrada(1,7,0).
salida(1,1,6).
un espacio en blanco (caracter 32) representa pasillo
un carácter distinto del blanco representa pared

Implementación en Prolog:

Transición de estados: (transiciones posibles, operadores)
% Operadores de búsqueda
% sintaxis:
% mover( Mov, X1, Y1, X2, Y2 )
% Mov = {arr|aba|izq|der} --> nombre del movimiento
% X1 --> coordenada X actual
% Y1 --> coordenada Y actual
% X2 --> coordenada X de la posición a la que se llega con el movimiento seleccionado
% Y2 --> coordenada Y de la posición a la que se llega con el movimiento seleccionado
% Nota:
% X1,Y1 = estado actual
% {arr|aba|izq|der} = operadores
% X2,Y2 = estado siguiente
mover( arr, X1, Y1, X1, Y2 ):- Y2 is Y1 - 1.
mover( izq, X1, Y1, X2, Y1 ):- X2 is X1 - 1.
mover( aba, X1, Y1, X1, Y2 ):- Y2 is Y1 + 1.
mover( der, X1, Y1, X2, Y1 ):- X2 is X1 + 1.






No hay comentarios: