From 6fe76a009d41dbb53c882c1d258c6c4baf93d93c Mon Sep 17 00:00:00 2001
From: Tim Quatmann <tim.quatmann@cs.rwth-aachen.de>
Date: Tue, 12 Jan 2021 07:09:18 +0100
Subject: [PATCH] Polished parsing of Prism-SMGs, in particular   * Fixed
 issues related to module renaming that resulted from setting the module
 indices already in the first run   * Fixed a few uint_fast32_t vs
 uint_fast64_t issues, created alias PlayerIndex

---
 src/storm-parsers/parser/PrismParser.cpp      | 102 +++++++++---------
 src/storm-parsers/parser/PrismParser.h        |  56 +++++-----
 .../generator/PrismNextStateGenerator.cpp     |   2 +-
 src/storm/storage/prism/Player.cpp            |  10 +-
 src/storm/storage/prism/Player.h              |  25 ++---
 src/storm/storage/prism/Program.cpp           |  22 ++--
 src/storm/storage/prism/Program.h             |   9 +-
 7 files changed, 119 insertions(+), 107 deletions(-)

diff --git a/src/storm-parsers/parser/PrismParser.cpp b/src/storm-parsers/parser/PrismParser.cpp
index 624dda819..ba67e1ce3 100644
--- a/src/storm-parsers/parser/PrismParser.cpp
+++ b/src/storm-parsers/parser/PrismParser.cpp
@@ -191,7 +191,7 @@ namespace storm {
             invariantConstruct = (qi::lit("invariant") > boolExpression > qi::lit("endinvariant"))[qi::_val = qi::_1];
             invariantConstruct.name("invariant construct");
 
-            knownModuleName = (identifier[qi::_val = qi::_1])[qi::_pass = phoenix::bind(&PrismParser::isKnownModuleName, phoenix::ref(*this), qi::_1)];
+            knownModuleName = (identifier[qi::_val = qi::_1])[qi::_pass = phoenix::bind(&PrismParser::isKnownModuleName, phoenix::ref(*this), qi::_1, false)];
             knownModuleName.name("existing module name");
 
             freshModuleName = (identifier[qi::_val = qi::_1])[qi::_pass = phoenix::bind(&PrismParser::isFreshModuleName, phoenix::ref(*this), qi::_1)];
@@ -276,18 +276,18 @@ namespace storm {
             freshPlayerName = (identifier[qi::_val = qi::_1])[qi::_pass = phoenix::bind(&PrismParser::isFreshPlayerName, phoenix::ref(*this), qi::_1)];
             freshPlayerName.name("fresh player name");
 
-            commandName = (qi::lit("[") >> identifier >> qi::lit("]"))[qi::_val = qi::_1];
-            commandName.name("command name");
+            playerControlledActionName = ((qi::lit("[") > identifier > qi::lit("]"))[qi::_val = qi::_1])[qi::_pass = phoenix::bind(&PrismParser::isKnownActionName, phoenix::ref(*this), qi::_1, true)];
+            playerControlledActionName.name("player controlled action name");
 
-            moduleName = identifier[qi::_val = qi::_1];
-            moduleName.name("module name");
+            playerControlledModuleName = (identifier[qi::_val = qi::_1])[qi::_pass = phoenix::bind(&PrismParser::isKnownModuleName, phoenix::ref(*this), qi::_1, true)];
+            playerControlledModuleName.name("player controlled module name");
 
-            playerDefinition = (qi::lit("player") > freshPlayerName[qi::_a = qi::_1]
-                    > +(   (commandName[phoenix::push_back(qi::_c, qi::_1)]
-                        |   moduleName[phoenix::push_back(qi::_b, qi::_1)]) % ','
+            playerConstruct = (qi::lit("player") > freshPlayerName[qi::_a = qi::_1]
+                    > +(   (playerControlledActionName[phoenix::push_back(qi::_c, qi::_1)]
+                        |   playerControlledModuleName[phoenix::push_back(qi::_b, qi::_1)]) % ','
                         )
                     > qi::lit("endplayer"))[qi::_val = phoenix::bind(&PrismParser::createPlayer, phoenix::ref(*this), qi::_a, qi::_b, qi::_c)];
-            playerDefinition.name("player definition");
+            playerConstruct.name("player construct");
 
             moduleRenaming = (qi::lit("[") > ((identifier > qi::lit("=") > identifier)[phoenix::insert(qi::_a, phoenix::construct<std::pair<std::string,std::string>>(qi::_1, qi::_2))] % ",") > qi::lit("]"))[qi::_val = phoenix::bind(&PrismParser::createModuleRenaming, phoenix::ref(*this), qi::_a)];
             moduleRenaming.name("Module renaming list");
@@ -302,7 +302,6 @@ namespace storm {
                      > modelTypeDefinition[phoenix::bind(&PrismParser::setModelType, phoenix::ref(*this), phoenix::ref(globalProgramInformation), qi::_1)]
                      > -observablesConstruct
                      >  *( definedConstantDefinition[phoenix::push_back(phoenix::bind(&GlobalProgramInformation::constants, phoenix::ref(globalProgramInformation)), qi::_1)]
-                         | playerDefinition(phoenix::ref(globalProgramInformation))[phoenix::push_back(phoenix::bind(&GlobalProgramInformation::players, phoenix::ref(globalProgramInformation)), qi::_1)]
                          | undefinedConstantDefinition[phoenix::push_back(phoenix::bind(&GlobalProgramInformation::constants, phoenix::ref(globalProgramInformation)), qi::_1)]
                          | formulaDefinition[phoenix::push_back(phoenix::bind(&GlobalProgramInformation::formulas, phoenix::ref(globalProgramInformation)), qi::_1)]
                          | globalVariableDefinition(phoenix::ref(globalProgramInformation))
@@ -310,8 +309,9 @@ namespace storm {
                          | initialStatesConstruct(phoenix::ref(globalProgramInformation))
                          | rewardModelDefinition(phoenix::ref(globalProgramInformation))[phoenix::push_back(phoenix::bind(&GlobalProgramInformation::rewardModels, phoenix::ref(globalProgramInformation)), qi::_1)]
                          | labelDefinition[phoenix::push_back(phoenix::bind(&GlobalProgramInformation::labels, phoenix::ref(globalProgramInformation)), qi::_1)]
-                           | observableDefinition[phoenix::push_back(phoenix::bind(&GlobalProgramInformation::observationLabels, phoenix::ref(globalProgramInformation)), qi::_1)]
-                           | formulaDefinition[phoenix::push_back(phoenix::bind(&GlobalProgramInformation::formulas, phoenix::ref(globalProgramInformation)), qi::_1)]
+                         | observableDefinition[phoenix::push_back(phoenix::bind(&GlobalProgramInformation::observationLabels, phoenix::ref(globalProgramInformation)), qi::_1)]
+                         | formulaDefinition[phoenix::push_back(phoenix::bind(&GlobalProgramInformation::formulas, phoenix::ref(globalProgramInformation)), qi::_1)]
+                         | playerConstruct(phoenix::ref(globalProgramInformation))[phoenix::push_back(phoenix::bind(&GlobalProgramInformation::players, phoenix::ref(globalProgramInformation)), qi::_1)]
                      )
                      > -(systemCompositionConstruct(phoenix::ref(globalProgramInformation))) > qi::eoi)[qi::_val = phoenix::bind(&PrismParser::createProgram, phoenix::ref(*this), phoenix::ref(globalProgramInformation))];
             start.name("probabilistic program");
@@ -430,8 +430,8 @@ namespace storm {
             return true;
         }
 
-        bool PrismParser::isKnownModuleName(std::string const& moduleName) {
-            if (!this->secondRun && this->globalProgramInformation.moduleToIndexMap.count(moduleName) == 0) {
+        bool PrismParser::isKnownModuleName(std::string const& moduleName, bool inSecondRun) {
+            if ((this->secondRun == inSecondRun) && this->globalProgramInformation.moduleToIndexMap.count(moduleName) == 0) {
                 STORM_LOG_ERROR("Parsing error in " << this->getFilename() << ": Unknown module '" << moduleName << "'.");
                 return false;
             }
@@ -446,6 +446,14 @@ namespace storm {
             return true;
         }
 
+        bool PrismParser::isKnownActionName(std::string const& actionName, bool inSecondRun) {
+            if ((this->secondRun == inSecondRun) && this->globalProgramInformation.actionIndices.count(actionName) == 0) {
+                STORM_LOG_ERROR("Parsing error in " << this->getFilename() << ": Unknown action label '" << actionName << "'.");
+                return false;
+            }
+            return true;
+        };
+
         bool PrismParser::isFreshIdentifier(std::string const& identifier) {
             if (!this->secondRun && this->manager->hasVariable(identifier)) {
                 STORM_LOG_ERROR("Parsing error in " << this->getFilename() << ": Duplicate identifier '" << identifier << "'.");
@@ -777,52 +785,40 @@ namespace storm {
             // We need this list to be filled in both runs.
         }
 
-        storm::prism::Module PrismParser::createModule(std::string const& moduleName, std::vector<storm::prism::BooleanVariable> const& booleanVariables, std::vector<storm::prism::IntegerVariable> const& integerVariables, std::vector<storm::prism::ClockVariable> const& clockVariables, boost::optional<storm::expressions::Expression> const& invariant, std::vector<storm::prism::Command> const& commands, GlobalProgramInformation& globalProgramInformation) const {
-            if (!this->secondRun) {
-                globalProgramInformation.moduleToIndexMap[moduleName] = globalProgramInformation.modules.size();
-            } else {
-                STORM_LOG_THROW(globalProgramInformation.moduleToIndexMap[moduleName] == globalProgramInformation.modules.size(), storm::exceptions::WrongFormatException, "Internal error while parsing: the index for module " << moduleName << " does not match the on in the first run.");
-            }
-            return storm::prism::Module(moduleName, booleanVariables, integerVariables, clockVariables, invariant.is_initialized()? invariant.get() : storm::expressions::Expression(), commands, this->getFilename());
-        }
-
         storm::prism::Player PrismParser::createPlayer(std::string const& playerName, std::vector<std::string> const& moduleNames, std::vector<std::string> const & actionNames) {
             if (this->secondRun) {
                 std::map<std::string, uint_fast64_t> controlledModuleIndices;
                 std::map<std::string, uint_fast64_t> controlledActionIndices;
-                for(std::string moduleName : moduleNames) {
-                    auto const& moduleIndexPair = globalProgramInformation.moduleToIndexMap.find(moduleName);
-                    if (moduleIndexPair != globalProgramInformation.moduleToIndexMap.end()) {
-                        controlledModuleIndices.insert(std::pair<std::string, uint_fast64_t>(moduleIndexPair->first, moduleIndexPair->second));
-                        if (std::find(globalProgramInformation.playerControlledModules.begin(), globalProgramInformation.playerControlledModules.end(), moduleName) != globalProgramInformation.playerControlledModules.end()) {
-                            STORM_LOG_THROW(false, storm::exceptions::WrongFormatException, "Parsing error in " << this->getFilename() << " for player " << playerName << ": Module '" << moduleName << "' already controlled by another player.");
-                        } else {
-                            globalProgramInformation.playerControlledModules.push_back(moduleName);
-                        }
-                    } else {
-                        STORM_LOG_THROW(false, storm::exceptions::WrongFormatException, "Parsing error in " << this->getFilename() << " for player " << playerName << ": No module named '" << moduleName << "' present.");
-                    }
+                for(auto const& moduleName : moduleNames) {
+                    auto moduleIndexPair = globalProgramInformation.moduleToIndexMap.find(moduleName);
+                    STORM_LOG_ASSERT(moduleIndexPair != globalProgramInformation.moduleToIndexMap.end(),  "Parsing error in " << this->getFilename() << " for player " << playerName << ": No module named '" << moduleName << "' present.");
+                    controlledModuleIndices.insert(*moduleIndexPair);
+                    bool moduleNotYetControlled = globalProgramInformation.playerControlledModules.insert(moduleIndexPair->second).second;
+                    STORM_LOG_THROW(moduleNotYetControlled, storm::exceptions::WrongFormatException, "Parsing error in " << this->getFilename() << " for player " << playerName << ": Module '" << moduleName << "' already controlled by another player.");
                 }
                 for(std::string actionName : actionNames) {
-                    auto const& actionIndexPair = globalProgramInformation.actionIndices.find(actionName);
-                    if (actionIndexPair != globalProgramInformation.actionIndices.end()) {
-                        controlledActionIndices.insert(std::pair<std::string, uint_fast64_t>(actionIndexPair->first, actionIndexPair->second));
-                        if (std::find(globalProgramInformation.playerControlledCommands.begin(), globalProgramInformation.playerControlledCommands.end(), actionName) != globalProgramInformation.playerControlledCommands.end()) {
-                            STORM_LOG_THROW(false, storm::exceptions::WrongFormatException, "Parsing error in " << this->getFilename() << " for player " << playerName << ": Command '" << actionName << "' already controlled by another player.");
-                        } else {
-                            globalProgramInformation.playerControlledCommands.push_back(actionName);
-                        }
-                    } else {
-                        STORM_LOG_THROW(false, storm::exceptions::WrongFormatException, "Parsing error in " << this->getFilename() << " for player " << playerName << ": No action named '" << actionName << "' present.");
-                    }
+                    auto actionIndexPair = globalProgramInformation.actionIndices.find(actionName);
+                    STORM_LOG_ASSERT(actionIndexPair != globalProgramInformation.actionIndices.end(),  "Parsing error in " << this->getFilename() << " for player " << playerName << ": No action named '" << actionName << "' present.");
+                    controlledActionIndices.insert(*actionIndexPair);
+                    bool actionNotYetControlled = globalProgramInformation.playerControlledActions.insert(actionIndexPair->second).second;
+                    STORM_LOG_THROW(actionNotYetControlled, storm::exceptions::WrongFormatException, "Parsing error in " << this->getFilename() << " for player " << playerName << ": Command '" << actionName << "' already controlled by another player.");
                 }
-                STORM_LOG_DEBUG("PLAYER created:" << playerName);
                 return storm::prism::Player(playerName, controlledModuleIndices, controlledActionIndices);
             } else {
                 return storm::prism::Player();
             }
         }
 
+        storm::prism::Module PrismParser::createModule(std::string const& moduleName, std::vector<storm::prism::BooleanVariable> const& booleanVariables, std::vector<storm::prism::IntegerVariable> const& integerVariables, std::vector<storm::prism::ClockVariable> const& clockVariables, boost::optional<storm::expressions::Expression> const& invariant, std::vector<storm::prism::Command> const& commands, GlobalProgramInformation& globalProgramInformation) const {
+            if (!this->secondRun) {
+                globalProgramInformation.moduleToIndexMap[moduleName] = globalProgramInformation.modules.size();
+            }
+            // Assert that the module name is already known and has the expected  index.
+            STORM_LOG_ASSERT(!this->secondRun || globalProgramInformation.moduleToIndexMap.count(moduleName) > 0, "Module name '" << moduleName << "' was not found.");
+            STORM_LOG_ASSERT(!this->secondRun || globalProgramInformation.moduleToIndexMap[moduleName] == globalProgramInformation.modules.size(), "The index for module '" << moduleName << "' does not match the index from the first parsing run.");
+            return storm::prism::Module(moduleName, booleanVariables, integerVariables, clockVariables, invariant.is_initialized()? invariant.get() : storm::expressions::Expression(), commands, this->getFilename());
+        }
+
         bool PrismParser::isValidModuleRenaming(std::string const& oldModuleName, storm::prism::ModuleRenaming const& moduleRenaming, GlobalProgramInformation const& globalProgramInformation) const {
             if (!this->secondRun) {
                 auto const& renaming = moduleRenaming.getRenaming();
@@ -867,9 +863,12 @@ namespace storm {
             auto const& moduleIndexPair = globalProgramInformation.moduleToIndexMap.find(oldModuleName);
             STORM_LOG_THROW(moduleIndexPair != globalProgramInformation.moduleToIndexMap.end(), storm::exceptions::WrongFormatException, "Parsing error in " << this->getFilename() << ": No module named '" << oldModuleName << "' to rename.");
             storm::prism::Module const& moduleToRename = globalProgramInformation.modules[moduleIndexPair->second];
+            STORM_LOG_THROW(!moduleToRename.isRenamedFromModule(), storm::exceptions::WrongFormatException, "Parsing error in " << this->getFilename() << ": The module '" << newModuleName << "' can not be created from module '" << oldModuleName << "' through module renaming because '" << oldModuleName << "' is also a renamed module. Create '" << newModuleName << "' via a renaming from base module '" << moduleToRename.getBaseModule() << "' instead.");
             auto const& renaming = moduleRenaming.getRenaming();
-
             if (!this->secondRun) {
+                // Add a mapping from the new module name to its (future) index.
+                globalProgramInformation.moduleToIndexMap[newModuleName] = globalProgramInformation.modules.size();
+                
                 // Register all (renamed) variables for later use.
                 // We already checked before, whether the renaiming is valid.
                 for (auto const& variable : moduleToRename.getBooleanVariables()) {
@@ -918,9 +917,10 @@ namespace storm {
                 // Return a dummy module in the first pass.
                 return storm::prism::Module();
             } else {
-                // Add a mapping from the new module name to its (future) index.
-                globalProgramInformation.moduleToIndexMap[newModuleName] = globalProgramInformation.modules.size();
-
+                // Assert that the module name is already known and has the expected  index.
+                STORM_LOG_ASSERT(globalProgramInformation.moduleToIndexMap.count(newModuleName) > 0, "Module name '" << newModuleName << "' was not found.");
+                STORM_LOG_ASSERT(globalProgramInformation.moduleToIndexMap[newModuleName] == globalProgramInformation.modules.size(), "The index for module " << newModuleName << " does not match the index from the first parsing run.");
+                
                 // Create a mapping from identifiers to the expressions they need to be replaced with.
                 std::map<storm::expressions::Variable, storm::expressions::Expression> expressionRenaming;
                 for (auto const& namePair : renaming) {
diff --git a/src/storm-parsers/parser/PrismParser.h b/src/storm-parsers/parser/PrismParser.h
index c86e75324..2a1d5beeb 100644
--- a/src/storm-parsers/parser/PrismParser.h
+++ b/src/storm-parsers/parser/PrismParser.h
@@ -39,7 +39,7 @@ namespace storm {
                 globalIntegerVariables.clear();
                 players.clear();
                 playerControlledModules.clear();
-                playerControlledCommands.clear();
+                playerControlledActions.clear();
                 modules.clear();
                 rewardModels.clear();
                 labels.clear();
@@ -65,9 +65,8 @@ namespace storm {
             std::vector<storm::prism::Label> labels;
             std::vector<storm::prism::ObservationLabel> observationLabels;
             std::vector<storm::prism::Player> players;
-
-            std::vector<std::string> playerControlledModules;
-            std::vector<std::string> playerControlledCommands;
+            std::set<uint_fast64_t> playerControlledModules;
+            std::set<uint_fast64_t> playerControlledActions;
 
             bool hasInitialConstruct;
             storm::prism::InitialConstruct initialConstruct;
@@ -123,25 +122,26 @@ namespace storm {
                     ("ma", 5)
                     ("pomdp", 6)
                     ("pta", 7)
-                    ("const", 8)
-                    ("int", 9)
-                    ("bool", 10)
-                    ("module", 11)
-                    ("endmodule", 12)
-                    ("rewards", 13)
-                    ("endrewards", 14)
-                    ("true", 15)
-                    ("false", 16)
-                    ("min", 17)
-                    ("max", 18)
-                    ("floor", 19)
-                    ("ceil", 20)
-                    ("init", 21)
-                    ("endinit", 22)
-                    ("invariant", 23)
-                    ("endinvariant", 24)
-                    ("smg", 25)
-                    ("endplayer", 26);
+                    ("smg", 8)
+                    ("const", 9)
+                    ("int", 10)
+                    ("bool", 11)
+                    ("module", 12)
+                    ("endmodule", 13)
+                    ("rewards", 14)
+                    ("endrewards", 15)
+                    ("true", 16)
+                    ("false", 17)
+                    ("min", 18)
+                    ("max", 19)
+                    ("floor", 20)
+                    ("ceil", 21)
+                    ("init", 22)
+                    ("endinit", 23)
+                    ("invariant", 24)
+                    ("endinvariant", 25)
+                    ("player", 26)
+                    ("endplayer", 27);
                 }
             };
 
@@ -262,6 +262,7 @@ namespace storm {
             qi::rule<Iterator, storm::prism::Update(GlobalProgramInformation&), Skipper> updateDefinition;
             qi::rule<Iterator, std::vector<storm::prism::Assignment>(), Skipper> assignmentDefinitionList;
             qi::rule<Iterator, storm::prism::Assignment(), Skipper> assignmentDefinition;
+            qi::rule<Iterator, std::string(), Skipper> knownActionName;
 
             // Rules for reward definitions.
             qi::rule<Iterator, std::string(), Skipper> freshRewardModelName;
@@ -272,9 +273,9 @@ namespace storm {
 
             // Rules for player definitions
             qi::rule<Iterator, std::string(), Skipper> freshPlayerName;
-            qi::rule<Iterator, std::string(), qi::locals<std::string>, Skipper> commandName;
-            qi::rule<Iterator, std::string(), qi::locals<std::string>, Skipper> moduleName;
-            qi::rule<Iterator, storm::prism::Player(GlobalProgramInformation&), qi::locals<std::string, std::vector<std::string>, std::vector<std::string>>, Skipper> playerDefinition;
+            qi::rule<Iterator, std::string(), qi::locals<std::string>, Skipper> playerControlledActionName;
+            qi::rule<Iterator, std::string(), qi::locals<std::string>, Skipper> playerControlledModuleName;
+            qi::rule<Iterator, storm::prism::Player(GlobalProgramInformation&), qi::locals<std::string, std::vector<std::string>, std::vector<std::string>>, Skipper> playerConstruct;
 
             // Rules for initial states expression.
             qi::rule<Iterator, qi::unused_type(GlobalProgramInformation&), Skipper> initialStatesConstruct;
@@ -327,8 +328,9 @@ namespace storm {
             // Helper methods used in the grammar.
             bool isValidIdentifier(std::string const& identifier);
             bool isFreshIdentifier(std::string const& identifier);
-            bool isKnownModuleName(std::string const& moduleName);
+            bool isKnownModuleName(std::string const& moduleName, bool inSecondRun);
             bool isFreshModuleName(std::string const& moduleName);
+            bool isKnownActionName(std::string const& actionName, bool inSecondRun);
             bool isFreshLabelName(std::string const& moduleName);
             bool isFreshObservationLabelName(std::string const& labelName);
             bool isFreshRewardModelName(std::string const& moduleName);
diff --git a/src/storm/generator/PrismNextStateGenerator.cpp b/src/storm/generator/PrismNextStateGenerator.cpp
index 03b4975a6..bcadbe7ee 100644
--- a/src/storm/generator/PrismNextStateGenerator.cpp
+++ b/src/storm/generator/PrismNextStateGenerator.cpp
@@ -87,7 +87,7 @@ namespace storm {
                     for (auto const& moduleIndexPair : player.getModules()) {
                         moduleIndexToPlayerIndexMap[moduleIndexPair.second] = playerIndex;
                     }
-                    for (auto const& commandIndexPair : player.getCommands()) {
+                    for (auto const& commandIndexPair : player.getActions()) {
                         commandIndexToPlayerIndexMap[commandIndexPair.second] = playerIndex;
                     }
                 }
diff --git a/src/storm/storage/prism/Player.cpp b/src/storm/storage/prism/Player.cpp
index f2e30d3ad..02c2117cf 100644
--- a/src/storm/storage/prism/Player.cpp
+++ b/src/storm/storage/prism/Player.cpp
@@ -2,7 +2,7 @@
 
 namespace storm {
     namespace prism {
-        Player::Player(std::string const& playerName, std::map<std::string, uint_fast32_t> const& controlledModules, std::map<std::string, uint_fast32_t> const& controlledCommands, std::string const& filename, uint_fast32_t lineNumber) : LocatedInformation(filename, lineNumber), playerName(playerName), controlledModules(controlledModules), controlledCommands(controlledCommands) {
+        Player::Player(std::string const& playerName, std::map<std::string, uint_fast64_t> const& controlledModules, std::map<std::string, uint_fast64_t> const& controlledActions, std::string const& filename, uint_fast32_t lineNumber) : LocatedInformation(filename, lineNumber), playerName(playerName), controlledModules(controlledModules), controlledActions(controlledActions) {
             // Nothing to do here.
         }
 
@@ -10,12 +10,12 @@ namespace storm {
             return this->playerName;
         }
 
-        std::map<std::string, uint_fast32_t> const& Player::getModules() const {
+        std::map<std::string, uint_fast64_t> const& Player::getModules() const {
             return this->controlledModules;
         }
 
-        std::map<std::string, uint_fast32_t> const& Player::getCommands() const {
-            return this->controlledCommands;
+        std::map<std::string, uint_fast64_t> const& Player::getActions() const {
+            return this->controlledActions;
         }
 
         std::ostream& operator<<(std::ostream& stream, Player const& player) {
@@ -27,7 +27,7 @@ namespace storm {
             for (auto const& module : player.getModules()) {
                 stream << "\t" << module.first << std::endl;
             }
-            for (auto const& command : player.getCommands()) {
+            for (auto const& command : player.getActions()) {
                 stream << "\t[" << command.first << "]" << std::endl;
             }
             stream << "endplayer" << std::endl;
diff --git a/src/storm/storage/prism/Player.h b/src/storm/storage/prism/Player.h
index 7d9437f7f..92a79b3bd 100644
--- a/src/storm/storage/prism/Player.h
+++ b/src/storm/storage/prism/Player.h
@@ -1,5 +1,4 @@
-#ifndef STORM_STORAGE_PRISM_PLAYER_H_
-#define STORM_STORAGE_PRISM_PLAYER_H_
+#pragma once
 
 #include <string>
 #include <vector>
@@ -13,6 +12,9 @@
 
 namespace storm {
     namespace prism {
+        
+        typedef uint_fast64_t PlayerIndex;
+        
         class Player : public LocatedInformation {
         public:
             /*!
@@ -20,11 +22,11 @@ namespace storm {
              *
              * @param playerName The name of the player.
              * @param controlledModules The controlled modules.
-             * @param controlledCommands The controlled actions.
+             * @param controlledActions The controlled actions.
              * @param filename The filename in which the player is defined.
              * @param lineNumber The line number in which the player is defined.
              */
-            Player(std::string const& playerName, std::map<std::string, uint_fast32_t> const& controlledModules, std::map<std::string, uint_fast32_t> const& controlledCommands, std::string const& filename = "", uint_fast32_t lineNumber = 0);
+            Player(std::string const& playerName, std::map<std::string, uint_fast64_t> const& controlledModules, std::map<std::string, uint_fast64_t> const& controlledActions, std::string const& filename = "", uint_fast32_t lineNumber = 0);
 
             // Create default implementations of constructors/assignment.
             Player() = default;
@@ -45,14 +47,14 @@ namespace storm {
              *
              * @return The modules controlled by the player.
              */
-            std::map<std::string, uint_fast32_t> const& getModules() const; // TODO
+            std::map<std::string, uint_fast64_t> const& getModules() const; // TODO
 
             /*!
-             * Retrieves all controlled Commands of the player.
+             * Retrieves all controlled Actions of the player.
              *
-             * @return The commands controlled by the player.
+             * @return The Actions controlled by the player.
              */
-            std::map<std::string, uint_fast32_t> const& getCommands() const;
+            std::map<std::string, uint_fast64_t> const& getActions() const;
 
             friend std::ostream& operator<<(std::ostream& stream, Player const& player);
         private:
@@ -60,13 +62,12 @@ namespace storm {
             std::string playerName;
 
             // The modules associated with this player.
-            std::map<std::string, uint_fast32_t> controlledModules;
+            std::map<std::string, uint_fast64_t> controlledModules;
 
-            // The commands associated with this player.
-            std::map<std::string, uint_fast32_t> controlledCommands;
+            // The Actions associated with this player.
+            std::map<std::string, uint_fast64_t> controlledActions;
         };
 
     } // namespace prism
 } // namespace storm
 
-#endif /* STORM_STORAGE_PRISM_PLAYER_H_ */
diff --git a/src/storm/storage/prism/Program.cpp b/src/storm/storage/prism/Program.cpp
index 3acef442e..9599766ff 100644
--- a/src/storm/storage/prism/Program.cpp
+++ b/src/storm/storage/prism/Program.cpp
@@ -483,6 +483,18 @@ namespace storm {
             return this->players;
         }
 
+        std::size_t Program::getNumberOfPlayers() const {
+            return this->getPlayers().size();
+        }
+
+        PlayerIndex const& Program::getIndexOfPlayer(std::string const& playerName) const {
+            return this->playerToIndexMap.at(playerName);
+        }
+
+        std::map<std::string, PlayerIndex> const& Program::getPlayerNameToIndexMapping() const {
+            return playerToIndexMap;
+        }
+
         std::size_t Program::getNumberOfFormulas() const {
             return this->getFormulas().size();
         }
@@ -491,10 +503,6 @@ namespace storm {
             return this->getModules().size();
         }
 
-        std::size_t Program::getNumberOfPlayers() const {
-            return this->getPlayers().size();
-        }
-
         storm::prism::Module const& Program::getModule(uint_fast64_t index) const {
             return this->modules[index];
         }
@@ -513,10 +521,6 @@ namespace storm {
             return this->modules;
         }
 
-        uint_fast32_t const& Program::getIndexOfPlayer(std::string playerName) const {
-            return this->playerToIndexMap.at(playerName);
-        }
-
         std::map<std::string, uint_fast64_t> const& Program::getActionNameToIndexMapping() const {
             return actionToIndexMap;
         }
@@ -813,7 +817,7 @@ namespace storm {
             for (uint_fast64_t moduleIndex = 0; moduleIndex < this->getNumberOfModules(); ++moduleIndex) {
                 this->moduleToIndexMap[this->getModules()[moduleIndex].getName()] = moduleIndex;
             }
-            for (uint_fast64_t playerIndex = 0; playerIndex < this->getNumberOfPlayers(); ++playerIndex) {
+            for (PlayerIndex playerIndex = 0; playerIndex < this->getNumberOfPlayers(); ++playerIndex) {
                 this->playerToIndexMap[this->getPlayers()[playerIndex].getName()] = playerIndex;
             }
             for (uint_fast64_t rewardModelIndex = 0; rewardModelIndex < this->getNumberOfRewardModels(); ++rewardModelIndex) {
diff --git a/src/storm/storage/prism/Program.h b/src/storm/storage/prism/Program.h
index 56610556f..af25c4d47 100644
--- a/src/storm/storage/prism/Program.h
+++ b/src/storm/storage/prism/Program.h
@@ -338,8 +338,13 @@ namespace storm {
              *
              * @return The index of the player in the program.
              */
-            uint_fast32_t const& getIndexOfPlayer(std::string playerName) const;
+            PlayerIndex const& getIndexOfPlayer(std::string const& playerName) const;
 
+            /*!
+             * @return Retrieves the mapping of player names to their indices.
+             */
+            std::map<std::string, PlayerIndex> const& getPlayerNameToIndexMapping() const;
+            
             /*!
              * Retrieves the mapping of action names to their indices.
              *
@@ -761,7 +766,7 @@ namespace storm {
             std::vector<Player> players;
 
             // A mapping of player names to their indices.
-            std::map<std::string, uint_fast64_t> playerToIndexMap;
+            std::map<std::string, PlayerIndex> playerToIndexMap;
 
             // The modules associated with the program.
             std::vector<Module> modules;