El Lenguaje de Interacción entre Agentes (LIA) permite definir ambientes
conteniendo Agentes y Escenarios (Interacciones) donde los agentes interactuan
para alcanzar sus propósitos.
El Ambiente está representado mediante variables globales y regionales.
Las variables globales son aquellas que cualquier hebra de los agentes tiene acceso.
Las variables regionales se accesan solamente por las hebras de los agentes que las declaran. Ejemplo:
global { // VARIABLES GLOBALES
int Reloj ;
port pcliente ; // PUERTO DONDE ESCUCHA MENSAJES UN CLIENTE
port pprovedor ; // PUERTO DONDE ESCUCHA MENSAJES UN PROVEEDOR
char id_msg[30] ;
int duracion, lectores ;
}
regional { // VARIABLES REGIONALES
float localidad ;
char sucursal[40] ;
}
NOTA: Adelante de las diagonales (//) se indican los comentarios
Los Agentes se declaran con sus variables regionales, sus variables internas
que representan a sus recursos y características, sus propósitos, los eventos inesperados que
percibe el agente, las acciones que usa para superar a los eventos inesperados, y los
papeles iniciales con los que inicia su ejecución cuando se crea. Ejemplo:
agent Cliente { // AGENTE CLIENTE
regional { // VARIABLE REGIONAL QUE PUEDE REFERENCIAR
localidad ;
}
internal { // VARIABLES INTERNAS
char tiene[30], dinero[30], comidaAporta[30],
obtiene[30], quiere[30], desea[30],
ofrece[30], alimento[30] ;
char articulo[100] ; int comprar_a ;
}
purpose { // PROPOSITOS DEL AGENTE
vacaciones_cancun ; // SE INTERPRETA COMO vacaciones(cancun)
}
percieve { // EVENTOS INESPERADOS QUE PERCIBE EL AGENTE
lluvia, terremoto, caida ;
}
action { // ACCIONES ANTE EVENTOS INESPERADOS
pedirAyuda ;
}
initial { // PAPELES INICIALES
esperar ;
}
}
Los escenarios se declaran mediante la palabra reservada de LIA: interaction,
en cada uno se describen los papeles que componen al escenario. En cada papel
se indican los recursos que se utilizan en el mismo y el número de instancias
activas del papel una vez que se encuentra en ejecución, por ejemplo, presidente
de una corporación solamente existe 1, pero obreros en una fábrica existen 40 o hasta
300. En cada papel se indican los recursos o características que debe cumplir un
agente para tomarlo, y los efectos positivos o negativos que produce ejecutar dicho
papel, la sintaxis de los efectos hasta ahora es predicado_valor que se interpreta
como predicado(valor). Se indican también sus variables locales y las instrucciones que
lo forman.
interaction Buscando {
role buscador(producto, oferta)[instances 1] {
requisite {
ofrece_oferta, dinero_oferta, desea_producto, alimento_producto ;
}
positive {
quiere_producto ;
}
negative {
ofrece_oferta ;
}
local {
char logro[100] ;
char linea[100] ;
int encontro ;
}
linea := "Buscando ";
append(linea, articulo);
print(linea);
mensaje := "( BUY ARTICULO ";
append(mensaje ,articulo);
tmp := " )";
append(mensaje ,tmp);
id_msg := "mensaje1";
lectores = 10;
duracion = 120; // EN SEGUNDOS
// EMITE EL MENSAJE DE LO QUE QUIERE EL CLIENTE
out(pcte, id_msg, mensaje, lectores, duracion);
// ESPERA UN TIEMPO PARA QUE AGENTES VENDEDORES SE ENTEREN
wait(10);
encontro = 0;
while( encontro == 0 ) {
// ACEPTA UNA OFERTA
id_msg := "acuerdo";
espera = 100;
accept(pcte, id_msg, linea, espera);
// REVISA SI LO QUE PIDEN LO PUEDE SURTIR
dato:= "ARTICULO";
extract(solicitud, dato, cual);
compare(cual, articulo, resultado);
// EN CASO QUE LO PUEDE SURTIR
if( resultado == 1 ) {
encontro = 1;
}
}
logro := "quiere_";
append(logro, desea); // 'ARTICULO'
goal(logro); // INDICA QUE SE HA OBTENIDO UN ARTICULO
// SI ES EL DESEADO ENTONCES SE ALCANZO EL PROPÓSITO
}
}
Las instrucciones de LIA que se han establecido hasta ahora son:
INSTRUCCIÓN |
DESCRIPCIÓN |
if |
esta instrucción es de control del flujo de ejecución, si la condición que evalúa es verdadera se ejecutan las instrucciones que forman su cuerpo. |
while |
es otra instrucción de control de flujo, que hace que se repitan las instrucciones contenidas en el bloque mientras la condición que se evalúa es verdadera. |
print |
despliega el contenido de una variable o una cadena constante. |
addagent |
se utiliza para crear instancias de un agente, se coloca el identificador del agente del que se crea su instancia, luego el nombre del agente creado, algunos propósitos que se le adicionan y se asignan los valores iniciales a sus variables internas. Se usa sólo en main. |
addinteract |
se utiliza para crear instancias de una interacción, se indica la interacción de la que se crea la instancia y el nombre de la interacción creada. Se usa sólo en main. |
goal |
indica cuando un propósito se ha alcanzado, el predicado indicado se busca en los que tiene un agente y causa que los papeles subsecuentes del plan generado para el propósito, se cancelen en ejecución. |
out |
sirve para que un agente coloque un mensaje en un puerto, se explica más adelante en este capítulo. |
accept |
sirve para que un agente acepte un mensaje en un puerto, se explica mas adelante en este capítulo. |
deletemessage |
sirve para que un agente retire voluntariamente un mensaje que el mismo haya colocado en una cola. |
append |
permite concatenar cadenas, en este caso se anexa la segunda cadena en la primera, dando como resultado una cadena concatenada. |
extract |
extrae el valor de una cadena utilizando como prefijo el contenido de la primera . |
compare |
indica el resultado de comparar el contenido de las cadenas indicadas por los primeros dos identificadores y dejando el resultado en la variable que aparece como tercer identificador. |
wait |
indica que se haga una pausa de los segundos indicados en la instrucción. |
expresiones aritméticas |
permiten realizar cálculos aritméticos y asignarlos a una variable. |
expresiones de cadena |
permite asignar valores a las variables de cadena. |
En un ambiente descrito en LIA se
debe incluir una sección principal donde inicia la ejecución de la misma y se crean
instancias de agentes y escenarios.
main()
{
print("Industria del Maíz");
// CREACION DE INTERACCIONES
addinteract(Casa ,casaAntonio );
addinteract(Mercado,CentralAbasto);
addinteract(Buscando, Buscar);
// CREACION DE AGENTES
addagent(Cliente , Antonio, // ANTONIO ES UN AGENTE CLIENTE
obtiene_energia, // SE ADICIONAN PROPÓSITOS
ofrece := "dinero"; // SE ASIGNAN VALORES A SUS VAR. INTERNAS
desea := "tortillas"; alimento := "tortillas";
dinero := "dinero"; comidaAporta := "energia";
articulo := "MAIZ-SEMILLA";
ontology := "cliente" ); // SE INDICA LA ONTOLOGÍA QUE USA
addagent(Provedor, Rafael,
gana_dinero,
ofrece := "maíz"; desea := "dinero"; recurso := "dinero";
persona := "humano"; capta := "humano";
producto := "MAIZ-SEMILLA-BLANCO"; precio := "80.00";
id := "1"; ontology := "provedor" );
addagent(Provedor, Juan,
gana_dinero,
ofrece := "maíz"; desea := "dinero"; recurso := "dinero";
persona := "humano"; capta := "humano";
producto := "MAIZ-JARABE"; precio := "15.00"; id := "2";
ontology := "provedor" );
addagent(Provedor, Esteban,
gana_dinero,
ofrece := "maíz"; desea := "dinero"; recurso := "dinero";
persona := "humano"; capta := "humano";
producto := "MAIZ-FRUCTUOSA"; precio := "12.00"; id := "3";
ontology := "provedor" );
}