#pragma once #include #include #include "MinigridGrammar.h" #include "PrismPrinter.h" #include "ConfigYaml.h" std::string vectorToDisjunction(const std::vector &formulae); std::string cellToConjunction(const AgentName &agentName, const cell &c); std::string coordinatesToConjunction(const AgentName &agentName, const coordinates &c, const ViewDirection viewDirection); std::map getSurroundingCells(const cell &c); namespace prism { class PrismFormulaPrinter { public: PrismFormulaPrinter(std::ostream &os, const std::map &restrictions, const cells &boxes, const cells &balls, const cells &lockedDoors, const cells &unlockedDoors, const cells &keys, const std::map &slipperyTiles, const cells &lava, const cells &goals); void print(const AgentName &agentName); void printRestrictionFormula(const AgentName &agentName, const std::string &direction, const cells &grid_cells); void printIsOnFormula(const AgentName &agentName, const std::string &type, const cells &grid_cells, const std::string &direction = ""); void printIsNextToFormula(const AgentName &agentName, const std::string &type, const std::map &coordinates); void printRestrictionFormulaWithCondition(const AgentName &agentName, const std::string &reason, const std::map &coordinates, const std::string &condition); private: std::string buildFormula(const std::string &formulaName, const std::string &formula); std::string buildLabel(const std::string &labelName, const std::string &label); std::string buildDisjunction(const AgentName &agentName, const std::map &cells); std::string buildDisjunction(const AgentName &agentName, const cells &cells, const std::vector &conditions = {}); std::ostream &os; std::map restrictions; cells boxes; cells balls; cells lockedDoors; cells unlockedDoors; cells keys; std::map slipperyTiles; cells lava; cells goals; std::vector conditionalMovementRestrictions; std::vector portableObjects; }; }