/*******************************+ * * Testfile for the FSL-Language * Version 1.0.1-01 * * Nr.1 * *************************************/ /******************************** * This example shows a simple world * which will be used as an environment * for some simple cognitive agents **********************************/ system sys1 (int COLs, int ROWs)[int INHABITANTS, int HISTORY days]{ // The world consists of a grid of COLs x ROWs many cells // The input parameters have to be provided by a calling program // It's not necessary but highly recommend to set some deafult // values for the input parameters if(isequ(COLs,0))[B]{COLs = 8;} if(isequ(ROWs,0))[B]{ROWs = 8;} struct CELL { //Every cell cas x-y-coordinates and a content int X; // From left-to-right, start with 0 int Y; // From upper-to-lower, start with 0 str content; // "o" := obstacle "e" := eatable "_" := free //If an agent is positioned in a cell it is an obstacle with name "o:agent_name" }; struct CELL World1[mul(COLs,ROWs)[NUM]]; // The world as a COLs x ROWs - 2D-Field is stored as a 1D-Array // In a more advanced version of this LModel can the LModel asked the // user for some parameters by communication. Then it can change // the actual states by system-calls. // For the first version of this program we assume default values // One has to set some values // We will place 8 obstacles and 4 eatables... /***************************** ________ <== 1-8 ________ <== 9-16 __e_o___ <== 17-24 ____o___ <== 25-32 ____o___ <== 33-40 ______o_ <== 41-48 __oo__o_ <== 49-56 __e__o_e <== 57-64 *********************************/ // The 2D-field is considered with x-axis from left to right, // y-axis from upper to lower // Counting ist started with (X,Y) = (0,0) // Arrays start counting with 1! // Because only some of the elements of the array World1 will // explicitely be set it is recommended to give all elements // some default value: int Count = 1; while(less(Count,65))[B]{ //loop for whole Array World1 int YCount = 0; while(less(YCount,8))[B]{ //loop for Y-Counts int XCount = 0; while(less(XCount,8))[B]{ //loop for X-Counts World1[Count].X = XCount; World1[Count].Y = YCount; World1[Count].Content = "_"; add(Count,1); add(XCount,1); } add(YCount,1); } } World1[19].X=2; World1[19].Y=2; World1[19].Content="e"; // Every element of the World1 is a struct of type CELL // The elements of a struct are named by a DOT-Operator '.' World1[21].X=4; World1[21].Y=4; World1[21].Content="o"; World1[29].X=4; World1[29].Y=3; World1[29].Content="o"; World1[37].X=4; World1[37].Y=4; World1[37].Content="o"; World1[47].X=6; World1[47].Y=5; World1[47].Content="o"; World1[51].X=2; World1[51].Y=6; World1[51].Content="o"; World1[52].X=3; World1[52].Y=6; World1[53].Content="o"; World1[55].X=6; World1[55].Y=6; World1[55].Content="o"; World1[59].X=2; World1[59].Y=7; World1[59].Content="e"; World1[62].X=5; World1[62].Y=7; World1[62].Content="o"; World1[64].X=7; World1[64].Y=7; World1[64].Content="e"; // After these assertions has the interpreter automatically generated // an Array with 64 elements where only those elements explicitly // asserted above have special values /**********************************************************+ * * Now is the basic data structure configured. * In what follows must the simulator of this world communicate * with possible inhabitants of this world. * An inhabitant must have an 'identity', possibly a 'rank' * within the group of possible inhabitants and he must * communicate which kind of 'actions' he is intending * to do. The following minimal list of possible actions * is assumed: * * A possible inhabitant is sending the following login-action * by a pes_sim_send-system call: * * pes_sim_send("ID:RANK:SENDTIME:login:x-pos:y-pos:dir") * * A possible SimWorld is receiving the following login-action * by a pes_sim_receive-system call: * * pes_sim_receive("ID:RANK:SENDTIME:RECEIVETIME:login:x-pos:y-pos:dir") * * The possible inhabitant can 'want' to be located at a certain * x-y-position headed in direction 'dir'; if not possible he will * receive another position 'nearby': * * pes_sim_send("ID:RANK:SENDTIME:login-response:x-pos:y-pos:dir") * * A logged in inhabitant is sending the following logout-action * by a pes_sim_send-system call: * * pes_sim_send("ID:RANK:SENDTIME:logout") * * pes_sim_receive("ID:RANK:SENDTIME:RECEIVETIME:logout") * * The Simworld will answer: * * pes_sim_send("ID:RANK:SENDTIME:logout-response") * * A logged in inhabitant is sending the following move-action * specifying a distance [0,1] and a direction [0-3]: * * pes_sim_send("ID:RANK:SENDTIME:move:distance:dir") * * pes_sim_receive("ID:RANK:SENDTIME:RECEIVETIME:move:distance:dir") * * The SimWorld will answer. If a move is not possible on account of * an obstacle the response will send a distance=0: * * pes_sim_send("ID:RANK:SENDTIME:move-response:distance:dir") * * A logged in inhabitant is sending the following eat-action * * pes_sim_send("ID:RANK:SENDTIME:eat") * * pes_sim_receive("ID:RANK:SENDTIME:RECEIVETIME:eat") * * The SimWorld will answer and specifying the amount of energy * which could be gained by eating: * * pes_sim_send("ID:RANK:SENDTIME:eat-response:energy") * ******************************************************************/ while(true)[B]{ // This is the main SimWorld-Loop // In this version it will not be possible to send an // external command to force the system to stop receive(NextItemIncomingQueue)[B]; if(findsubstr("login",NextItemIncomingQueue)[B])[B]{ // Process Login loginsys(NextItemIncomingQueue)[LoginResponse]; } elseif(findsubstr("eat",NextItemIncomingQueue)[B])[B]{ // Process Eat logoutsys(NextItemIncomingQueue)[LogoutResponse]; } elseif(findsubstr("move",NextItemIncomingQueue)[B])[B]{ // Process Move movesys(NextItemIncomingQueue)[MoveResponse]; } elseif(findsubstr("logout",NextItemIncomingQueue)[B])[B]{ // Process Logout eatsys(NextItemIncomingQueue)[EatResponse]; } else{ // Nothing to do } }// End of while-Loop }// End of root-system /*******************************************************+ * * Declarations of some subsystems * *********************************************************** * * loginsys() * ******************************************************************/ system loginsys(str NextItemIncomingQueue)[bool LoginResponse]{ struct LoginResult { int ID; int RANK; int SENDTIME; int RECEIVETIME; int Xpos; int Ypos; int Dir; }; // The different parts of the string have to be parsed LoginResult = loginsys_parse(NextItemIncomingQueue)[ID,RANK,SENDTIME,RECEIVETIME,Xpos,Ypos,Dir]; // Then the request for login has to be converted into // the action to locate a new inhabitant in the world // If the intended position is already occupied an alternative // position has to be found // After that the request has to be answered } system logoutsys(str NextItemIncomingQueue)[boolLogoutResponse]]{ struct LogoutResult { int ID; int RANK; int SENDTIME; int RECEIVETIME; }; // The different parts of the string have to be parsed LogoutResult = logoutsys_parse(NextItemIncomingQueue)[ID,RANK,SENDTIME,RECEIVETIME]; // Then the request for logout has to be converted into // the action to remove an registered inhabitant from the world // After that the request has to be answered } system movesys(str NextItemIncomingQueue)[boolMoveResponse]]{ struct MoveResult { int ID; int RANK; int SENDTIME; int RECEIVETIME; int Distance; }; // The different parts of the string have to be parsed MoveResult = movesys_parse(NextItemIncomingQueue)[ID,RANK,SENDTIME,RECEIVETIME,Distance]; // Then the request for a move has to be converted into // the action to locate a registered inhabitant on a new position. // If the intended position is already occupied this has to // be communicated to the sender // After that the request has to be answered } system eatsys(str NextItemIncomingQueue)[boolEatResponse]]{ struct EatResult { int ID; int RANK; int SENDTIME; int RECEIVETIME; int Energy; }; // The different parts of the string have to be parsed EatResult = eatsys_parse(NextItemIncomingQueue)[ID,RANK,SENDTIME,RECEIVETIME,Energy]; // Then the request for an eat has to be converted into // the action to eat that eatable 'ahead' of the actual position. // After that the request has to be answered with the amount of gained // energy }