|
|
@ -11,8 +11,8 @@ std::string westUpdate(const AgentName &a) { return "(col"+a+"'=col"+a+"-1)"; } |
|
|
|
|
|
|
|
namespace prism { |
|
|
|
|
|
|
|
PrismModulesPrinter::PrismModulesPrinter(std::ostream& os, const ModelType &modelType, const coordinates &maxBoundaries, const cells &boxes, const cells &balls, const cells &lockedDoors, const cells &unlockedDoors, const cells &keys, const std::map<std::string, cells> &slipperyTiles, const AgentNameAndPositionMap &agentNameAndPositionMap, std::vector<Configuration> config, const float probIntended, const float faultyProbability, const bool anyLava, const bool anyGoals) |
|
|
|
: os(os), modelType(modelType), maxBoundaries(maxBoundaries), boxes(boxes), balls(balls), lockedDoors(lockedDoors), unlockedDoors(unlockedDoors), keys(keys), slipperyTiles(slipperyTiles), agentNameAndPositionMap(agentNameAndPositionMap), configuration(config), probIntended(probIntended), faultyProbability(faultyProbability), anyLava(anyLava), anyGoals(anyGoals) { |
|
|
|
PrismModulesPrinter::PrismModulesPrinter(std::ostream& os, const ModelType &modelType, const coordinates &maxBoundaries, const cells &lockedDoors, const cells &unlockedDoors, const cells &keys, const std::map<std::string, cells> &slipperyTiles, const AgentNameAndPositionMap &agentNameAndPositionMap, std::vector<Configuration> config, const float probIntended, const float faultyProbability, const bool anyLava, const bool anyGoals) |
|
|
|
: os(os), modelType(modelType), maxBoundaries(maxBoundaries), lockedDoors(lockedDoors), unlockedDoors(unlockedDoors), keys(keys), slipperyTiles(slipperyTiles), agentNameAndPositionMap(agentNameAndPositionMap), configuration(config), probIntended(probIntended), faultyProbability(faultyProbability), anyLava(anyLava), anyGoals(anyGoals) { |
|
|
|
numberOfPlayer = agentNameAndPositionMap.size(); |
|
|
|
size_t index = 0; |
|
|
|
for(auto begin = agentNameAndPositionMap.begin(); begin != agentNameAndPositionMap.end(); begin++, index++) { |
|
|
@ -40,12 +40,6 @@ namespace prism { |
|
|
|
for(const auto &key : keys) { |
|
|
|
printPortableObjectModule(key); |
|
|
|
} |
|
|
|
for(const auto &ball : balls) { |
|
|
|
printPortableObjectModule(ball); |
|
|
|
} |
|
|
|
for(const auto &box : boxes) { |
|
|
|
printPortableObjectModule(box); |
|
|
|
} |
|
|
|
for(const auto &door : unlockedDoors) { |
|
|
|
printDoorModule(door, true); |
|
|
|
} |
|
|
@ -110,22 +104,24 @@ namespace prism { |
|
|
|
os << "endmodule\n\n"; |
|
|
|
} |
|
|
|
|
|
|
|
void PrismModulesPrinter::printPortableObjectActions(const std::string &agentName, const std::string &identifier) { |
|
|
|
void PrismModulesPrinter::printPortableObjectActions(const std::string &agentName, const std::string &identifier, const bool canBeDroped) { |
|
|
|
std::string actionName = "[" + agentName + "_pickup_" + identifier + "]"; |
|
|
|
agentNameActionMap.at(agentName).insert({NOFAULT, actionName}); |
|
|
|
agentNameActionMap.at(agentName).insert({PICKUP, actionName}); |
|
|
|
os << " " << actionName << " true -> (col" << identifier << "'=-1) & (row" << identifier << "'=-1) & (" << identifier << "PickedUp'=true);\n"; |
|
|
|
actionName = "[" + agentName + "_drop_" + identifier + "_north]"; |
|
|
|
agentNameActionMap.at(agentName).insert({NOFAULT, actionName}); |
|
|
|
os << " " << actionName << " " << " true -> (col" << identifier << "'=col" << agentName << ") & (row" << identifier << "'=row" << agentName << "-1) & (" << identifier << "PickedUp'=false);\n"; |
|
|
|
actionName = "[" + agentName + "_drop_" + identifier + "_west]"; |
|
|
|
agentNameActionMap.at(agentName).insert({NOFAULT, actionName}); |
|
|
|
os << " " << actionName << " " << " true -> (col" << identifier << "'=col" << agentName << "-1) & (row" << identifier << "'=row" << agentName << ") & (" << identifier << "PickedUp'=false);\n"; |
|
|
|
actionName = "[" + agentName + "_drop_" + identifier + "_south]"; |
|
|
|
agentNameActionMap.at(agentName).insert({NOFAULT, actionName}); |
|
|
|
os << " " << actionName << " " << " true -> (col" << identifier << "'=col" << agentName << ") & (row" << identifier << "'=row" << agentName << "+1) & (" << identifier << "PickedUp'=false);\n"; |
|
|
|
actionName = "[" + agentName + "_drop_" + identifier + "_east]"; |
|
|
|
agentNameActionMap.at(agentName).insert({NOFAULT, actionName}); |
|
|
|
os << " " << actionName << " " << " true -> (col" << identifier << "'=col" << agentName << "+1) & (row" << identifier << "'=row" << agentName << ") & (" << identifier << "PickedUp'=false);\n"; |
|
|
|
if(canBeDroped) { |
|
|
|
actionName = "[" + agentName + "_drop_" + identifier + "_north]"; |
|
|
|
agentNameActionMap.at(agentName).insert({DROP, actionName}); |
|
|
|
os << " " << actionName << " " << " true -> (col" << identifier << "'=col" << agentName << ") & (row" << identifier << "'=row" << agentName << "-1) & (" << identifier << "PickedUp'=false);\n"; |
|
|
|
actionName = "[" + agentName + "_drop_" + identifier + "_west]"; |
|
|
|
agentNameActionMap.at(agentName).insert({DROP, actionName}); |
|
|
|
os << " " << actionName << " " << " true -> (col" << identifier << "'=col" << agentName << "-1) & (row" << identifier << "'=row" << agentName << ") & (" << identifier << "PickedUp'=false);\n"; |
|
|
|
actionName = "[" + agentName + "_drop_" + identifier + "_south]"; |
|
|
|
agentNameActionMap.at(agentName).insert({DROP, actionName}); |
|
|
|
os << " " << actionName << " " << " true -> (col" << identifier << "'=col" << agentName << ") & (row" << identifier << "'=row" << agentName << "+1) & (" << identifier << "PickedUp'=false);\n"; |
|
|
|
actionName = "[" + agentName + "_drop_" + identifier + "_east]"; |
|
|
|
agentNameActionMap.at(agentName).insert({DROP, actionName}); |
|
|
|
os << " " << actionName << " " << " true -> (col" << identifier << "'=col" << agentName << "+1) & (row" << identifier << "'=row" << agentName << ") & (" << identifier << "PickedUp'=false);\n"; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void PrismModulesPrinter::printDoorModule(const cell &door, const bool &opened) { |
|
|
@ -191,18 +187,6 @@ namespace prism { |
|
|
|
printPortableObjectActionsForRobot(agentName, identifier); |
|
|
|
} |
|
|
|
|
|
|
|
for(const auto &ball : balls) { |
|
|
|
std::string identifier = capitalize(ball.getColor()) + ball.getType(); |
|
|
|
os << " " << agentName << "Carrying" << identifier << " : bool;\n"; |
|
|
|
printPortableObjectActionsForRobot(agentName, identifier); |
|
|
|
} |
|
|
|
|
|
|
|
for(const auto &box : boxes) { |
|
|
|
std::string identifier = capitalize(box.getColor()) + box.getType(); |
|
|
|
os << " " << agentName << "Carrying" << identifier << " : bool;\n"; |
|
|
|
printPortableObjectActionsForRobot(agentName, identifier); |
|
|
|
} |
|
|
|
|
|
|
|
printNonMovementActionsForRobot(agentName); |
|
|
|
|
|
|
|
|
|
|
@ -213,13 +197,15 @@ namespace prism { |
|
|
|
os << "endmodule\n\n"; |
|
|
|
} |
|
|
|
|
|
|
|
void PrismModulesPrinter::printPortableObjectActionsForRobot(const std::string &a, const std::string &i) { |
|
|
|
actionStream << " [" << a << "_pickup_" << i << "] " << " !" << a << "IsCarrying & " << a << "CannotMove" << i << " -> (" << a << "Carrying" << i << "'=true);\n"; |
|
|
|
actionStream << " [" << a << "_drop_" << i << "_north]\t" << a << "Carrying" << i << " & view" << a << "=3 & !" << a << "CannotMoveConditionally & !" << a << "CannotMoveNorthWall -> (" << a << "Carrying" << i << "'=false);\n"; |
|
|
|
actionStream << " [" << a << "_drop_" << i << "_west] \t" << a << "Carrying" << i << " & view" << a << "=2 & !" << a << "CannotMoveConditionally & !" << a << "CannotMoveWestWall -> (" << a << "Carrying" << i << "'=false);\n"; |
|
|
|
actionStream << " [" << a << "_drop_" << i << "_south]\t" << a << "Carrying" << i << " & view" << a << "=1 & !" << a << "CannotMoveConditionally & !" << a << "CannotMoveSouthWall -> (" << a << "Carrying" << i << "'=false);\n"; |
|
|
|
actionStream << " [" << a << "_drop_" << i << "_east] \t" << a << "Carrying" << i << " & view" << a << "=0 & !" << a << "CannotMoveConditionally & !" << a << "CannotMoveEastWall -> (" << a << "Carrying" << i << "'=false);\n"; |
|
|
|
actionStream << "\n"; |
|
|
|
void PrismModulesPrinter::printPortableObjectActionsForRobot(const std::string &a, const std::string &i, const bool canBeDroped) { |
|
|
|
actionStream << " [" << a << "_pickup_" << i << "] " << " !" << a << "IsCarrying & " << a << "IsInFrontOf" << i << " -> (" << a << "Carrying" << i << "'=true);\n"; |
|
|
|
if(canBeDroped) { |
|
|
|
actionStream << " [" << a << "_drop_" << i << "_north]\t" << a << "Carrying" << i << " & view" << a << "=3 & !" << a << "CannotMoveConditionally & !" << a << "CannotMoveNorthWall -> (" << a << "Carrying" << i << "'=false);\n"; |
|
|
|
actionStream << " [" << a << "_drop_" << i << "_west] \t" << a << "Carrying" << i << " & view" << a << "=2 & !" << a << "CannotMoveConditionally & !" << a << "CannotMoveWestWall -> (" << a << "Carrying" << i << "'=false);\n"; |
|
|
|
actionStream << " [" << a << "_drop_" << i << "_south]\t" << a << "Carrying" << i << " & view" << a << "=1 & !" << a << "CannotMoveConditionally & !" << a << "CannotMoveSouthWall -> (" << a << "Carrying" << i << "'=false);\n"; |
|
|
|
actionStream << " [" << a << "_drop_" << i << "_east] \t" << a << "Carrying" << i << " & view" << a << "=0 & !" << a << "CannotMoveConditionally & !" << a << "CannotMoveEastWall -> (" << a << "Carrying" << i << "'=false);\n"; |
|
|
|
actionStream << "\n"; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void PrismModulesPrinter::printUnlockedDoorActionsForRobot(const std::string &agentName, const std::string &identifier) { |
|
|
@ -636,7 +622,7 @@ namespace prism { |
|
|
|
} |
|
|
|
|
|
|
|
bool PrismModulesPrinter::anyPortableObject() const { |
|
|
|
return !keys.empty() || !boxes.empty() || !balls.empty(); |
|
|
|
return !keys.empty(); |
|
|
|
} |
|
|
|
|
|
|
|
bool PrismModulesPrinter::faultyBehaviour() const { |
|
|
|