+#include <vector>
+#include <string>
+#include <ext/hash_map>
+#include <locale>
+
+//! A list of strings, each string representing an effect.
+typedef std::vector<std::string> Literals;
+//! A map, but really a list of pairs, the precondition as a string, and a bool, true if it's a hard precondition, otherwise false.
+typedef __gnu_cxx::hash_map<std::string,bool> Preconditions;
+//! A map from returnvalue of the execution to the effects achieved.
+typedef __gnu_cxx::hash_map<int,Literals> EffectsMap;
+
+// These are needed to be able to use std::string as key in a hash_map.
+namespace __gnu_cxx {
+ template< typename CharT, typename Traits, typename Alloc >
+ struct hash< std::basic_string<CharT, Traits, Alloc> > {
+ size_t operator()(const std::basic_string<CharT, Traits, Alloc>& s) const {
+
+ const std::collate<CharT>& c = std::use_facet< std::collate<CharT> >(std::locale());
+
+ return c.hash(s.c_str(), s.c_str() + s.size());
+
+ }
+
+ };
+
+ template< typename CharT, typename Traits, typename Alloc >
+ struct hash< const std::basic_string<CharT, Traits, Alloc> > { //yes you need this version aswell!
+
+ size_t operator()(const std::basic_string<CharT, Traits, Alloc>& s) const {
+
+ const std::collate<CharT>& c = std::use_facet< std::collate<CharT> >(std::locale());
+
+ return c.hash(s.c_str(), s.c_str() + s.size());
+ }
+
+ };
+};
+
+/**
+ * This class holds the information associated with an action.
+ * This is the name, the preconditions, the executable and the effects.
+ */