Está en la página 1de 13

1. https://dialnet.unirioja.es/servlet/articulo?

codigo=6485413
2. http://www.redalyc.org/articulo.oa?id=92521310
Conciencia Tecnológica No. 33, Enero-Junio 2007

Ruby: Lenguaje de Programación para Sistemas Distribuidos Nota de Divulgación

Lic. Héctor de Jesús Carlos Pérez (1), C.L.I. José Alfredo Alonso Esquivel (2) (1) Miembro del Cuerpo Académico de Sistemas
Distribuidos del Instituto Tecnológico de Aguascalientes (2) Alumno de la Carrera de Licenciatura en Informática del
Instituto Tecnológico de Aguascalientes Departamento de Sistemas y Computación del Instituto Tecnológico de
Aguascalientes, Av. A. Lopez Mateos 1801, Fracc. Bona Gens, Aguascalientes, Ags., C.P. 20256 Tel. (449) 9105002, Fax
(449)9700423 hicarlos(Qhotmail.com, chokmah19 (hotmail.com

Resumen

El desarrollo de los lenguajes de programación se está orientando a la generación de código distribuido. Mediante este tipo
de código se puede hacer uso de programas, recursos, objetos y sistemas que no se tienen en el equipo local, pero que para
el usuario final pareciera como si realmente estuvieran en su equipo.

Gran parte de los sistemas distribuidos requieren que los usuarios adquieran los respectivos permisos y licencias.

En este trabajo se describen las características y ventajas de Ruby, un lenguaje que permite generar este tipo de sistemas
distribuidos de manera relativamente sencilla, y además presenta la ventaja de ser un lenguaje de código abierto y libre de
distribución y mejoras por parte del usuario- programador.

Palabras clave Sistema distribuido, Ruby, Código abierto. Abstract

The development of programming languages is addressing to the generation of distributed code. Through this type of code
it is possible to use programs, resources, objects and systems that not exist in local equipment, but they seems as if really
they were in the equipment of local station.

Most of distributed systems need users acquire the permissions and licenses.

This work describes characteristics and advantages of Ruby, which is a language that allows to generate this type of
distributed systems in a relatively simple way. Additionaly has the advantage of being a free language and open source of
distribution and improvements for the programmer and users.

Key words

Distributed system, Ruby, Opened source.

Introducción

De acuerdo a Wikipedia Ruby “es un lenguaje de programación reflexivo y orientado a objetos creado por el programador
¡japonés Yukihiro "Matz" Matsumoto en 1993. Combina una sintaxis inspirada en Perl con características de programación
orientada a objetos similares a Smalltalk. Comparte también funcionalidad con otros lenguajes de programación como
Python, Lisp, Dylan y CLU. Ruby es un lenguaje de programación interpretado y su implementación oficial es distribuida
bajo una licencia de software libre”.

La popularidad de este lenguaje radica en que reúne las características de los mejores lenguajes (Java, C, Python, entre
otros) dentro de un relativamente sencillo lenguaje de programación. Dichas características son:

e Es poderoso: combina el poderío de los lenguajes orientados a objetos con la conveniencia de los lenguajes basados en
scripts, como Perl. Los programas en Ruby son compactos, pero aún así muy mantenibles.

e Simple: La sintaxis y la semántica son intuitivas y muy limpias. No hay ningún “caso especial” por tomar en cuenta. Por
ejemplo, variables como integer, string, inclusive NULL son todas objetos.

e Transparente: Ruby libera de las limitaciones de espacio. No requiere compilar cada código para cada mejora o agregado
de un nuevo módulo.
e Posee alta disponibilidad: con Ruby se pueden generar aplicaciones y correrlas sin ningún problema bajo Unix, Linux,
Windows o sistemas especializados como lo es el BeOS, entre otros.

Características

e Posibilidad de realizar directamente llamadas al sisterna operativo.

• Potentes operaciones sobre cadenas de caracteres y expresiones regulares.

81

RUBY: LENGUAJE DE PROGRAMACIÓN PARA SISTEMAS DISTRIBUIDOS Lic. Héctor de Jesús Carlos Pérez y C.L.1. José Alfredo
Alonso Esquivel

Ls

e Retroalimentación inmediata durante el proceso de desarrollo.

Las variables son de tipo dinámico.

La gestión de la memoria es automática. Modelo de procesamiento de excepciones. Carga dinámica.

Hilos.

Clases, herencia y métodos innatos.

Iteradores y cierres.

Ruby distribuido

Se pueden crear objetos independientes para poder llamarse después, (por ejemplo .dll). Si a estas características le
agregamos que se pueden transmitir estos objetos a diferentes procesos, todó esto en conjunto con las tecnologías de
comunicaciones, permite obtener los sistemas distribuidos.

Utilizando las características de Distributed Ruby Library, este puede ser usado como servidor, como host o inclusive como
ambos. Actuando como servidor es un origen para los objetos; actuando como cliente pareciera que los objetos se obtienen
localmente, pero realmente el código se está ejecutanto en alguna otra parte del sistema distribuido.

El servidor comienza un servicio o demonio asociando un objeto con un puerto determinado. Los hilos se crean dentro del
servidor para manejar requisiciones que provengan de dicho puerto.

Ruby y la Web

Con este lenguaje se pueden crear gran cantidad de tecnologías. Algunas de ellas son:

e Servidor SMTP.

e Demonios FTP.

e Servidores Web.

Inclusive se puede usar para trabajos más específicos, como programar CGlIs o como reemplazo para PHP. Los CGI's son
simplemente páginas Web, pero estas son resueltas por el servidor; el usuario final no se da cuenta de todos los procesos
(accesos a bases de datos, manejo de formularios, etc.) que se generan en el servidor; el usuario final sólo recibe los
resultados, en comparación con las páginas ASP, PHP en las cuales se puede tener acceso a ciertas partes del código que se
utiliza para crear las páginas; un ejemplo de esto es simplemente dar clic derecho en la página y seleccionar “ver código
fuente”.
Como se menciono anteriormente, Ruby se puede usar para generar CGI's. Para escribir scripts en CGI

con Ruby, simplemente se necesita mandar un encabezado al inicio de la programación, como el siguiente:

H/usr/bin/env ruby

Print “HTTP/1.0 200 OKirn”;

Print “Content-type: text/html Innirn”;

Print “

Hello World!

”;

Con esto basta para comenzar a generar CGPs. También de una manera muy sencilla e intuitiva, para aquellos
familiarizados con los lenguajes mencionados al principio de este artículo, se pueden crear cualquier tipo de elementos
Web (para el caso de los CGP's) como son:

e Formularios

e Cookies

e Sesiones

Con Ruby, se pueden observar todos los objetos vivos dentro del bloque de código que se tiene en cierto momento. Para
ejemplificar esto, tomemos el siguiente segmento de código:

a=102.7 b=95.] ObjectSpace.each_object(Numeric)

(xl px) Nos muestra en pantalla:

95.1

102.7 2.718281828 3.141592654

Una nota curiosa acerca de este lenguaje es que originalmente era el nombre de un tipo de letra británico de 5,5 puntos
usado para anotaciones en documentos impresos. En japonés, el significado de la palabra cambió para referirse a los
caracteres furigana.
Conclusiones

El lenguaje Ruby viene a reemplazar muchos otros lenguajes, siendo éste capaz de cumplir con todas las características de
estos, e inclusive llegando hasta donde los demás lenguajes no pueden.

En México no hay gran aceptación por los sistemas de código abierto, situacion que debe de cambiar, ya que éste ofrece
grandes ventajas por sobre los otros sistemas: amplia disponibilidad, bajo costo si no es que nulo, robustez, capacidad de
crecimiento, soporte por bastantes grupos de programadores en todo el mundo, más seguridad que los demás sistemas
operativos,

82 Conciencia Tecnológica No. 33, Enero-Junio 2007 RUBY: LENGUAJE DE PROGRAMACIÓN PARA SISTEMAS DISTRIBUIDOS
Lic. Héctor de Jesús Carlos Pérez y C.L.I. José Alfredo Alonso Esquivel

capacidades de sistemas operativos distribuidos, en fin, el uso de estas herramientas beneficia tanto a las empresas que
deseen implementer tecnología de punta así como a programadores, usuarios finales y administradores. Ruby, aunque
requiere cierto nivel de experiencia en programación, es una excelente herramienta para comenzar la migración de otros
sistemas operativos hacia los de código abierto.

Referencias

[1] http://www. groovie. org/articles/2005/10/31/ the-wacky-world-of-ruby

(2] http: //www.rubycentral. com/articles /index.htm

[3] http://es.wikipedia. org/wiki /Lenguaje_de programacióóC3%B3n_Rubyl

Agradecimientos

Queremos agradecer al Cuerpo Académico de Sistemas Distribuidos del Instituto Tecnológico de Aguascalientes, así como a
todos los colaboradores que brindaron su apoyo, los servicios y recursos necesarios para llevar a cabo la publicación de.este
trabajo.

Artículo recibido: 5 de octubre de 2006

Aceptado para publicación: 18 abril de 2007

Conciencia Tecnológica No. 33, Enero-Junio 2007 83


Inteligencia Artificial. Revista Iberoamericana
de Inteligencia Artificial

ISSN: 1137-3601

revista@aepia.org

Asociación Española para la Inteligencia


Artificial

España

Zunino, Alejandro; Berdún, Luis; Amandi, Analía


JavaLog: un Lenguaje para la Programación de Agentes

Inteligencia Artificial. Revista Iberoamericana de Inteligencia Artificial, vol. 5, núm. 13, 2001, pp. 94-99
Asociación Española para la Inteligencia Artificial

Valencia, España

Disponible en: http://www.redalyc.org/articulo.oa?id=92521310

Cómo citar el artículo


Número completo
Sistema de Información Científica
Más información del artículo Red de Revistas Científicas de América Latina, el Caribe, España y Portugal
Página de la revista en redalyc.org
Proyecto académico sin fines de lucro, desarrollado bajo la iniciativa de acceso abierto
JavaLog: un Lenguaje para la Programación de Agentes

Alejandro Zunino, Luis Berdún, Analía Amandi

ISISTAN Research Institute, Facultad de Ciencias Exactas,


Universidad Nacional del Centro de la Pcia. de Buenos Aires
Campus Paraje Arroyo Seco - (B7001BBO) Tandil - Bs. As., Argentina
email: {azunino,lberdun,amandi }@exa.unicen.edu.ar

Resumen

La programación de sistemas multi-agentes ha sido generalmente soportada por lenguajes orientados a objetos o
lenguajes lógicos. Ambos paradigmas muestran poseer características para soportar parcialmente el desarrollo
de agentes. Sin embargo, si ambos paradigmas son integrados, una solución a la programación de agentes aparece
en forma evidente. En este artículo, un lenguaje multi-paradigma para la programación de agentes denominado
JavaLog es presentado. Este lenguaje integra el lenguaje orientado a objetos Java y el lenguaje lógico Prolog. Esta
combinación permite que agentes sean construidos como objetos manipulando un estado mental definido a través
de cláusulas lógicas que son encapsuladas en módulos lógicos. Estos módulos lógicos permiten combinar
dinámicamente actitudes mentales para adaptar el comportamiento de agentes considerando diferentes contextos o
circunstancias.

Palabras clave: Agentes, Programación Orientada a Agentes.

1. Introducción Entre las propuestas existentes, sólo aquellas ubicadas


en el contexto de utilizar cláusulas lógicas para
La programación de agentes involucra tanto el representar conocimiento interno de objetos hemos
encapsulamiento de sus comportamientos como el de utilizado, intentando resolver los inconvenientes
su estado mental. Estas características nos han llevado encontrados en la programación de agentes y sistemas
a utilizar lenguajes orientados a objetos para multi-agentes. En esta línea de trabajo, se propone
programar sistemas multi-agentes. JavaLog, un lenguaje multi- paradigma que permite
construir agentes a partir de objetos Java capaces de
Los lenguajes orientados a objetos han mostrado manipular conocimiento en formato de cláusulas
poseer varias de las características necesarias para lógicas Prolog o extensiones de este lenguaje lógico.
codificar funciones clásicas de agentes. Sin embargo,
cuando estados mentales complejos deben ser La integración de programación orientada a objetos y
administrados, la programación lógica ha mostrado ser programación lógica alcanzada en JavaLog ha sido
una mejor alternativa para la implementación de basada en el concepto de módulo lógico. Un módulo
actitudes mentales. lógico es la encapsulación de una secuencia de
cláusulas lógicas. Estos módulos pueden ser ubicados
En consecuencia, viejas ideas con relación a lenguajes tanto en métodos Java como en variables, para luego
multi-paradigmas (Ishikawa, 1986) (Fukunaga, 1986) ser combinados de diversas maneras.
(Mello, 1987) aparecen como una posible solución a
la programación de agentes. En este artículo se presenta el lenguaje JavaLog
mostrando ejemplos en su utilización para manipular
temporalmente a la base de conocimiento cuando estos
estados mentales de agentes de interfaz. métodos sean invocados y mientras estén siendo
ejecutados.
Por claridad, el artículo se organiza de la siguiente
manera. La sección 2 presenta los componentes más
relevantes del lenguaje. La sección 3 presenta un 3. Módulos lógicos
ejemplo de manipulación de módulos lógicos. La
sección 4 presenta algunos aspectos sobre integración Como hemos mencionado, el lenguaje JavaLog
de paradigmas. La sección 5 describe algunos trabajos permite definir módulos lógicos dentro de métodos y
relacionados. En la sección 6 se presentan variables. De esta manera, un agente puede ser
experiencias en el uso de JavaLog. Finalmente, las definido como un objeto con conocimiento
conclusiones son expuestas. representado como cláusulas lógicas, de manera tal de
aprovechar mejor las características de la
programación orientada a objetos y la programación
2. JavaLog lógica para construir agentes. La presente sección
describe a través de un ejemplo, las diversas formas de
JavaLog es un lenguaje de programación que combina utilización de módulos lógicos aprovechando las
los paradigmas de orientación a objetos y lógicos a características de integración con Java.
través de la utilización de Java y Prolog. En el proceso
de integrar estos lenguajes para facilitar la Con el fin de ejemplificar las diversas formas de
programación de agentes se ha desarrollado un utilizar módulos lógicos se describirá un agente
interprete Prolog en el lenguaje Java con el fin de
asistente personal. Dicho agente tiene la función de
posibilitar extensiones del mismo a través de sub- organizar los horarios de un usuario teniendo en
clasificación.
cuenta sus preferencias, tales como tipos de
actividades, horarios, lugares, amistades, etc.
Programar agentes con JavaLog es programar un
agente como un objeto Java, el cual es instancia de una
En las siguientes secciones se asume que los objetos
clase que representa ese tipo de agente. La
en los cuales se utiliza la integración Prolog-Java
funcionalidad del agente es implementada en métodos
poseen una variable de instancia brain, la cual
codificados básicamente en Java.
referencia una instancia del intérprete JavaLog,
encargado de almacenar y manipular los estados
Módulos lógicos compuestos por una secuencia de mentales de los agentes. Se denominará objeto- agente
cláusulas lógicas Prolog son también utilizados en la a un objeto con las propiedades antes mencionadas, es
programación de los agentes. Conocimiento privado a decir, capaz de representar y manipular estados
un agente es ubicado en módulos lógicos referenciados mentales.
por variables de instancia de los agentes.
Conocimiento común a los agentes de una clase es
En las siguientes sub-secciones se analizan partes del
ubicado en módulos lógicos que pueden localizarse en
agente asistente, exponiendo los principales aspectos
los propios métodos de la clase o referenciados por
de integración de paradigmas lógico y de orientación
variables accesibles por todos los objetos de la clase.
a objetos.
Las clases que definan algún tipo de agente se
3.1 Módulos lógicos en variables y métodos Java
asociarán a una clase denominada Brain que permite
que cada instancia de esas clases genere una instancia
La utilización de módulos lógicos en JavaLog puede
de este Brain que representa una instancia del
realizarse tanto en métodos como en variables. Para
intérprete Prolog. En otras palabras, cada objeto-
clarificar la utilización de módulos lógicos por
agente tendrá asociado un objeto Brain que le
variables, la Figura 1 muestra el diagrama de un agente
permitirá manipular cláusulas lógicas.
representado por un objeto-agente de la clase
AsistentePersonal. Dicha clase posee tres variables de
La base de conocimiento de una instancia del instancia contexto1, contexto2 y contexto3,
intérprete Prolog de un agente cualquiera estará referenciando cada una de ellas un módulo lógico con
inicialmente vacía. Los módulos lógicos definidos en diversas preferencias de un usuario sobre eventos
variables o métodos de la clase no están ubicados en sociales, de negocios, deportes, etc. Por ejemplo, la
esta base de conocimiento. Los módulos lógicos variable contexto1 define para un usuario que la
referenciados por variables tienen que ser realización de un evento de negocios en el cual
explícitamente agregados o retirados en la base de participe su jefe tiene una preferencia con valor 10 y
conocimiento. Los módulos lógicos localizados entre que un evento de golf tiene una preferencia valorada
el código Java de métodos serán trasladados en 9.
Es importante destacar que aunque un objeto-agente
En la misma figura 2, un segundo módulo lógico entre
defina varios módulos lógicos, esto no significa que llaves es definido. Éste contiene sólo una consulta que
utilice todos en un instante determinado. El lenguaje
es realizada en el momento que se ejecute el método
permite a un objeto-agente decidir qué módulos
que la contiene. El resultado de la consulta queda
lógicos utilizar. Es decir que cuando se realiza una referenciado por el variable local X, la cual es
consulta sobre los estados mentales de un agente, sólo
accesible por el sector de código Java de ese método.
se utilizan los módulos lógicos activos en ese
momento para resolver dicha consulta, mientras que
los módulos lógicos inactivos son ignorados.

contexto1 = {{ preferencia(A,10):-evento(A, negocios, P,


Fecha, Hora, Lugar), member(X,P), jefe(P).
En este punto es posible obtener
preferencia(A,10):- evento(A,golf,_,_,_,_,_).}} el valor de la variable Prolog X

contexto2 = {{preferencia(A,10):- evento(A, social, P


Fecha, _, _), noLaborable(Fecha),
member(X,P), amigo(X).
unAsistentePersonal

Figura 2. Módulos lógicos en métodos Java


contexto3 = {{ preferencia(A,1):- evento(A, negocios, _,

Fecha, _, _), noLaborable(Fecha)


preferencia(A,10):- evento(A,golf,_,Fecha,_,_,_), Las reglas de ámbito del lenguaje establecen que, en
noLaborable(Fecha).}}
un punto en donde se efectúa una consulta se utilizan
Figura 1. Módulos lógicos en variables de todos los módulos lógicos definidos hasta el momento
instancia (mediante llaves dobles) según las reglas de ámbito
de Java y los módulos activados explícitamente. Así,
por ejemplo, en la consulta de la Figura 2 se utiliza el
módulo contexto1 y el módulo entre llaves.
Este mecanismo es utilizado por el programador en
forma directa, es decir, indicando qué módulos son Luego de efectuada la consulta, los módulos lógicos
utilizados en un determinado punto de la ejecución del utilizados en ese momento pueden ser desactivados.
agente. Esto es realizado colocando el siguiente Por defecto, una vez que un método terminó su
código Java: contexto1.enable(). ejecución los módulos activados por éste son
eliminados de la base de conocimiento del objeto-
De esta manera, uno o más módulos lógicos pueden agente receptor del mensaje.
ser habilitados u activados. La habilitación de módulos
implica que estos módulos son ubicados en la base de La deshabilitación explícita de módulos lógicos es
conocimiento del intérprete Prolog del agente que los permitida si estos están referenciados por variables.
habilita, considerando estrictamente el orden de las Así, el código contexto1.disable() elimina el módulo
cláusulas según el orden de activación. Así, cuando un lógico contexto1 de la base de conocimiento del agente
agente realiza una consulta, por ejemplo a través del que ejecuta este código.
código
- preferencia(X,9), se utilizan sólo las cláusulas de los Los mecanismos de integración ejemplificados
módulos lógicos habilitados en la base de muestran algunas de las posibilidades del lenguaje
conocimiento del agente que realiza la consulta. para manipular estados mentales representados como
cláusulas lógicas por parte de un objeto- agente. A
Módulos lógicos también pueden ser definidos en continuación se describen las operaciones para
métodos, expresando así conocimiento común de los combinar módulos lógicos.
agentes de la clase. La figura 2 expone un ejemplo en
el cual el módulo lógico referenciado por la variable 3.2. Operando con módulos lógicos
contexto1 es habilitado y seguidamente otro módulo
sería habilitado. Este segundo módulo está JavaLog permite combinar módulos lógicos según las
explícitamente definido en el método Java mediante operaciones definidas en (O'Keefe, 1985). El lenguaje
cláusulas Prolog colocadas entre llaves. En este define las siguientes operaciones:
módulo lógico se define que un evento tiene una
preferencia 10 si éste es relativo a negocios en el  redefinición: la operación “a rewrite b”, siendo
exterior. Este último módulo es activado, a y b módulos lógicos, denota un módulo lógico
localizándose en la base de conocimiento del objeto- que contiene todas las cláusulas definidas en b
agente receptor del mensaje, cuando es invocado el añadidas a las de a cuyo nombre de cabeza no es
método que lo contiene. el mismo que para alguna
cláusula de b. que representa la valoración del mismo según las
preferencias del usuario.
 adición: la operación “a add b”, siendo a y b
módulos lógicos denota un módulo lógico que La clase AsistentePersonalTrabajo redefine el método
contiene todas las cláusulas del módulo a y a evaluarPreferencias para dar mayor prioridad a los
continuación las del módulo b. eventos relacionados con actividades laborales. En
este caso, las cláusulas de la superclase son
JavaLog permite utilizar estas operaciones con redefinidas mediante el operador rewrite. Nótese que
módulos definidos tanto en variables como en el módulo lógico de la subclase está delimitado por {%
métodos. y %}. Esto denota la operación rewrite del módulo
lógico de la subclase con el de la superclase.
Con el fin de ejemplificar la combinación de módulos
lógicos referenciados por variables, considérese el
asistente personal anteriormente descripto. Dicho
agente posee tres variables de instancia contexto1,
contexto2 y contexto3 conteniendo las preferencias de
un usuario. Así, por ejemplo contexto1.add(contexto2)
resulta en un módulo lógico conteniendo las siguientes
cláusulas:

preferencia(A,10):-
evento(A,negocios,P,Fecha,Hora,Lugar),
member(X,P), jefe(P).
preferencia(A,9):-
evento(A,golf,_,_,_,_).
Figura 3. Redefinición de un módulo lógico
preferencia(A,10):-
evento(A,social,P,Fecha,_,_),
noLaborable(Fecha), member(X,P),
Considérese otro escenario, en el cual no se desean
amigo(X).
redefinir las cláusulas presentes en la superclase, sino
que se necesitan añadir cláusulas que especifican la
contexto2.add(contexto1) resulta en un módulo
forma de tratar eventos relacionados con el trabajo. En
lógico conteniendo las siguientes cláusulas: la Figura 4 se ejemplifica este caso.

preferencia(A,10):-
evento(A,social,P,Fecha,_,_), AsistentePersonal
noLaborable(Fecha), member(X,P),
amigo(X). evaluarPreferencias()

preferencia(A,10):-
...
evento(A,negocios,P,Fecha,Hora,Lugar),
member(X,P), jefe(P). AsistentePersonalTrabajo
{{preferencia(A,5) :- ...
preferencia(A,9):- evaluarPreferencias() ...}};
evento(A,golf,_,_,_,_).
...
contexto1.rewrite(contexto2) resulta en un módulo
lógico conteniendo las siguientes cláusulas: Figura 4. Adición de módulos lógicos

preferencia(A,10):- En esta sección se ejemplificó la utilización de


evento(A,negocios,P,Fecha,Hora,Lugar), módulos lógicos. La siguiente sección trata acerca de
member(X,P), jefe(P). la integración de los paradigmas al nivel de objetos y
preferencia(A,9):- términos.
evento(A,golf,_,_,_,_).

Para combinar módulos lógicos localizados en


métodos se utiliza el concepto de herencia de la
programación orientada a objetos. Considérese la
clase AsistentePersonal presentada en la figura 3. El
método evaluarPreferencias se utiliza para, dado un
evento, obtener el valor numérico de dicho evento
tercer argumento de send ([]) especifica que el
4. Integración al nivel de objetos y mensaje toString no tiene argumentos.
términos
El ítem 3 de nuestra lista se refiere a la posibilidad de
Uno de las mayores dificultades en la integración de utilizar variables Java en un módulo lógico
los paradigmas de objetos y lógico, lo constituyen las perteneciente al mismo ámbito, como si fuese una
diferencias de ambos en lo referido a las variable Prolog. Por ejemplo, el método de la Figura 6
construcciones que cada uno de ellos es capaz de se invoca cuando el asistente personal recibe un nuevo
manipular. Así, por ejemplo, el paradigma de objetos evento. Dicho método define un módulo lógico con los
se limita a tratar con objetos y mensajes entre objetos. datos del evento recibido para luego ser evaluado de
Por otro lado, la programación en lógica utiliza acuerdo a las preferencias del usuario. Para poder
cláusulas y términos. utilizar una variable Java dentro de un módulo lógico,
ésta debe estar delimitada por #.
Para que la integración de los paradigmas sea efectiva,
es necesario que el lenguaje defina mecanismos que Así, en nuestro ejemplo, la variable Java nominada e
posibiliten la manipulación de ambas construcciones es utilizada en una cláusula Prolog dentro del módulo
desde cualquiera de los dos lenguajes. lógico en este caso definido en el mismo método.

Con el fin de lograr tales objetivos, el lenguaje


JavaLog permite: nuevoEvento( Fecha f, Vector participantes,
Hora hora, Lugar lugar, Asunto asunto ) {
1. Convertir objetos en términos. ...
2. Utilizar objetos en cláusulas como si fuesen
términos Prolog. Evento e = new Evento( Asunto, .... );
3. Manipular objetos disponibles en el ámbito de un
....
módulo lógico.
4. Manipular términos lógicos utilizados en un {{ evento(#e#, #Asunto#,
método desde la parte no lógica (o sea, desde #participantes#....... }};
código Java) del método. ....
Figura 6. Variables Java en módulos lógicos
La idea de convertir objetos en términos lógicos es la }
de permitir manipular objetos Java desde un programa Finalmente, el lenguaje permite manipular los
Prolog. Considérese, por ejemplo, un objeto de la clase términos utilizados en un módulo lógico de un método
Fecha. Dicho objeto posee tres variables de instancia: desde el ámbito de un método Java. Esto permite, por
día, mes y año. En la Figura 5 se muestra el término ejemplo, obtener valores de variables utilizadas en una
equivalente. El término que representa a un objeto consulta Prolog desde Java.
tiene el mismo nombre que la clase del objeto que
representa. El primer argumento es una referencia al 5. Trabajos Relacionados
objeto, de forma tal de poder acceder al objeto a partir
del término. El resto de los argumentos son las Varios lenguajes han sido propuestos para la
variables de instancia del objeto. programación de agentes (Kellett, 2001) (Denti, 1999)
(Fisher, 1994) (Poggy, 1994) (Weerasooriya, 1995).
Algunos de ellos utilizan conceptos del paradigma de
fecha(unaFecha, 10, Mar, 2001). orientación a objetos en un contexto lógico. Por
unaFecha: ejemplo, el lenguage Metatem (Kellett, 2001) (Fisher,
10 Mar 2001
1994) está basado en lógica temporal, encapsulando
un conjunto de reglas.
Figura 5. Objetos como términos
La mayoría de los lenguajes para la programación de
JavaLog permite manipular objetos, es decir, enviarles agente (por ejemplo, (Poggy, 1994) (Weerasooriya,
mensajes, de forma tal de permitir tanto el acceso a sus 1995) (Denti, 1999)) están soportados por conceptos
datos, como a su comportamiento. Para enviarle un de programación orientada a objetos sin considerar en
mensaje a un objeto se utiliza la cláusula send. Por absoluto los fundamentos lógicos de la especificación
ejemplo, send(unaFecha, toString, [], Str) instancia de estados mentales. Esta carencia podría ser
Str con una representación textual del objeto solucionada utilizando alguna arquitectura que
unaFecha. Este efecto se obtiene a partir del envío del materialice estas
mensaje toString al objeto unaFecha. El
deas en términos de objetos, pagando de esta manera el costo de manipular manualmente
las relaciones entre actitudes mentales.

A diferencia de los trabajos mencionados, nuestro enfoque intenta tomar ventaja de ambos
paradigmas a partir de una integración de ambos estilos de programación.

6. Experiencias
Varias experiencias han sido realizadas con este lenguaje. Por ejemplo, un agente de interfaz
para generar periódicos personalizados en Internet denominado NewsAgent (Cordero, 1999)
es una de estas experiencias.

NewsAgent es un agente que aprende las preferencias de los usuarios observándolos cuando
ellos están leyendo noticias en periódicos localizados en la WWW. A partir de este
aprendizaje, el agente genera diariamente un periódico personal para cada usuario respetando
sus preferencias, ahorrándole así tiempo en la examinación de noticias que no son de su
interés y colocando prioritariamente aquellas de mayor interés.

7. Conclusiones
Se ha presentado en este artículo el lenguaje de programación JavaLog que permite la
implementeación de sistemas multi-agentes utilizando tanto Java como Prolog. Un agente es
definido como un objeto Java, el cual manipula su estado mental a través de programación
lógica ya que sus actitudes mentales están definidas por cláusulas lógicas.

Nuestras experiencias han mostrado su utilidad en la simplificación de manipulación de


estados mentales en sistemas multi-agentes implementados básicamente con objetos.

Referencias
D. Cordero, P. Roldan, S. Schiaffino, A. Amandi. (1999) “Intelligent Agents Generating
Personal Newspapers”. In Proceedings of the International Conference on Enterprise
Information Systems, Portugal.
E. Denti, A. Omicini, (1999) “Engineering Multi- Agent Systems in LuCe” in Proceedings
of the Workshop on Multi-Agent Systems in Logic Programming - MAS’99 (in
conjunction with the International Conference on Logic Programming
1999), Las Cruces, New Mexico, USA, December 4, 1999.
M. Fisher. (1994) “Representing and Executing Agent-Based Systems”. In Proceedings of the
ECAI-94 Workshop on Agent Theories, Architectures, and Languages
K. Fukunaga, S. Hirose. (1986) “An Experience with a Prolog-Based Object-Oriented
Language. Proc. OOPSLA´86 Conference.
Y. Ishikawa, M. Tokoro. (1986) “A Concurrent Object-Oriented Knowledge Representation
Language Orient84/K: It’s features and implementation”. SIGPLAN Notices, 21(11): 232-
241.
A. Kellett, M. Fisher (2001) “Coordinating Heterogeneous Components Using Executable
Temporal Logic”. In, Meyer and Treur (eds), Agents, Reasoning and Dynamics. Vol. 6 in
Series of Handbooks in Defeasible Reasoning and Uncertainty Management Systems.
Kluwer Academic Publishers.
P. Mello, A. Natali. (1987) “Objects as Communicating Prolog Units”. In Proceedings of
ECCOP’87, European Conference on Object- Oriented Programming.
R. O'Keefe. (1985) “Towards an Algebra for Constructing Logic Programs”. In J. Cohen and
J. Conery (eds), Proceedings of IEEE Symposium on Logic Programming, IEEE Computer
Society Press, New York, pages 152- 160, 1985.
A. Poggy. (1994) “Daisy: an Object-Oriented System for Distributed Artificial Intelligence”.
In Proceedings of the ECAI-94 Workshop on Agent Theories, Architectures, and
Languages.
D. Weerasooriya, A. Rao, K. Ramamohanarao. (1995) “Design of a Concurrent Agent-Oriented
Language”. In Wooldridge, M.; Jennings, N. (Eds.). Intelligent Agents (LNAI 890).

También podría gustarte