TuringSim
C++ framework to simulate abstract computing models
stateAcceptingMachine.h
1 #pragma once
2 
3 #include <machine/acceptingMachine.h>
4 
5 #include <map>
6 #include <set>
7 
8 namespace TuringSim::Machine {
12  namespace impl_details_ {
34  template<
35  typename StateType,
36  AcceptingStyle acceptingStyle
37  >
39 
43  template<typename StateType_>
44  struct StateAcceptingMachineArgs<StateType_, AcceptingStyle::NonAccepting> {
48  typedef std::tuple<> AcceptingConstructorArgs;
49  };
50 
54  template<typename StateType_>
55  struct StateAcceptingMachineArgs<StateType_, AcceptingStyle::Accepting> {
59  typedef std::tuple<const std::set<StateType_> &> AcceptingConstructorArgs;
60  };
61 
65  template<typename StateType_>
77  typedef std::tuple<bool, const std::set<StateType_> &, const std::set<StateType_> &, const std::set<StateType_> &, const std::set<StateType_> &> AcceptingConstructorArgs;
78  };
79  }
80 
89  template<
90  typename MachineType,
91  AcceptingStyle acceptingStyle
92  >
94 
102  template<typename MachineType_>
103  class StateAcceptingMachine<MachineType_, AcceptingStyle::NonAccepting> : public MachineType_ {
104  public:
105  using typename MachineType_::StateType;
106  using typename MachineType_::IsAccepting;
107  using typename MachineType_::StorageType;
108  using typename MachineType_::IsAlternating;
109  using typename MachineType_::TransitionType;
110  using typename MachineType_::ApplyHelperType;
111  using typename MachineType_::IsDeterministic;
112  using typename MachineType_::TransitionContainer;
113  using typename MachineType_::InitialStateContainer;
114  using typename MachineType_::OptionalHelpedTransition;
115 
116  static_assert(std::is_same_v<StateType, typename TransitionType::StateType>);
117  static_assert(std::is_same_v<StorageType, typename TransitionType::StorageType>);
118  static_assert(std::is_same_v<ApplyHelperType, typename TransitionType::ApplyHelperType>);
119  static_assert(std::is_same_v<OptionalHelpedTransition, std::optional<std::pair<const TransitionType& , ApplyHelperType>>>);
120 
124 
127 
130 
135 
140 
142  virtual ~StateAcceptingMachine() override = default;
143  };
144 
152  template<typename MachineType_>
153  class StateAcceptingMachine<MachineType_, AcceptingStyle::Accepting> : public MachineType_ {
154  public:
155  using typename MachineType_::StateType;
156  using typename MachineType_::IsAccepting;
157  using typename MachineType_::StorageType;
158  using typename MachineType_::IsAlternating;
159  using typename MachineType_::TransitionType;
160  using typename MachineType_::ApplyHelperType;
161  using typename MachineType_::IsDeterministic;
162  using typename MachineType_::TransitionContainer;
163  using typename MachineType_::InitialStateContainer;
164  using typename MachineType_::OptionalHelpedTransition;
165 
166  static_assert(std::is_same_v<StateType, typename TransitionType::StateType>);
167  static_assert(std::is_same_v<StorageType, typename TransitionType::StorageType>);
168  static_assert(std::is_same_v<ApplyHelperType, typename TransitionType::ApplyHelperType>);
169  static_assert(std::is_same_v<OptionalHelpedTransition, std::optional<std::pair<const TransitionType& , ApplyHelperType>>>);
170 
174 
178  StateAcceptingMachine(const std::set<StateType>& acceptingStates) :
179  MachineType_(),
180  acceptingStates(acceptingStates) {}
181 
184 
187 
192 
197 
199  virtual ~StateAcceptingMachine() override = default;
200 
201 #pragma clang diagnostic push
202 #pragma clang diagnostic ignored "-Wunused-parameter"
203 
210  virtual bool isAcceptingConfiguration(const StateType& state, const StorageType& storage) const noexcept override final {
211  return isAcceptingState(state);
212  }
213 #pragma clang diagnostic pop
214 
219  bool isAcceptingState(const StateType& state) const noexcept {
220  return acceptingStates.count(state) > 0;
221  }
222 
223  protected:
226  std::set<StateType> acceptingStates;
227  };
228 
236  template<typename MachineType_>
237  class StateAcceptingMachine<MachineType_, AcceptingStyle::Alternating> : public MachineType_ {
238  public:
239  using typename MachineType_::StateType;
240  using typename MachineType_::IsAccepting;
241  using typename MachineType_::StorageType;
242  using typename MachineType_::IsAlternating;
243  using typename MachineType_::TransitionType;
244  using typename MachineType_::ApplyHelperType;
245  using typename MachineType_::IsDeterministic;
246  using typename MachineType_::TransitionContainer;
247  using typename MachineType_::InitialStateContainer;
248  using typename MachineType_::OptionalHelpedTransition;
249 
250  static_assert(std::is_same_v<StateType, typename TransitionType::StateType>);
251  static_assert(std::is_same_v<StorageType, typename TransitionType::StorageType>);
252  static_assert(std::is_same_v<ApplyHelperType, typename TransitionType::ApplyHelperType>);
253  static_assert(std::is_same_v<OptionalHelpedTransition, std::optional<std::pair<const TransitionType& , ApplyHelperType>>>);
254 
258 
269  bool initiallyUniversal,
270  const std::set<StateType>& accepting,
271  const std::set<StateType>& rejecting,
272  const std::set<StateType>& universal,
273  const std::set<StateType>& existential) :
274  MachineType_(),
275  initiallyUniversal(initiallyUniversal), acceptance() {
276  std::vector<std::tuple<const std::set<StateType>*, Acceptance::NodeType>> categories = {
277  {&accepting, Acceptance::Accept},
278  {&rejecting, Acceptance::Reject},
279  {&universal, Acceptance::Universal},
280  {&existential, Acceptance::Existential},
281  };
282  for (auto&[set, category]: categories) {
283  for (const StateType& state: *set) {
284  acceptance[state] = category;
285  }
286  }
287  }
288 
291 
294 
299 
304 
306  virtual ~StateAcceptingMachine() override = default;
307 
308 #pragma clang diagnostic push
309 #pragma clang diagnostic ignored "-Wunused-parameter"
310 
317  virtual Acceptance::NodeType isAcceptingConfiguration(const StateType& state, const StorageType& storage) const noexcept override final {
318  return isAcceptingState(state);
319  }
320 #pragma clang diagnostic pop
321 
328  Acceptance::NodeType isAcceptingState(const StateType& state) const noexcept {
329  if (typename std::map<StateType, Acceptance::NodeType>::const_iterator it = acceptance.find(state);
330  it != acceptance.end()) {
331  return it->second;
332  }
333  return Acceptance::Existential;
334  }
335 
339  virtual bool isInitiallyUniversal() const noexcept override final {
340  return initiallyUniversal;
341  }
342 
343  protected:
347 
350  std::map<StateType, Acceptance::NodeType> acceptance;
351  };
352 }
TuringSim::Machine::StateAcceptingMachine< MachineType_, AcceptingStyle::Accepting >::StateAcceptingMachine
StateAcceptingMachine(StateAcceptingMachine &&)=default
The default move constructor.
TuringSim::Machine::StateAcceptingMachine< MachineType_, AcceptingStyle::NonAccepting >::StateAcceptingMachine
StateAcceptingMachine(const StateAcceptingMachine &)=default
The default copy constructor.
TuringSim::Machine::StateAcceptingMachine< MachineType_, AcceptingStyle::Alternating >::acceptance
std::map< StateType, Acceptance::NodeType > acceptance
The type of each node.
Definition: stateAcceptingMachine.h:350
TuringSim::Machine::StateAcceptingMachine< MachineType_, AcceptingStyle::Alternating >::StateAcceptingMachine
StateAcceptingMachine(const StateAcceptingMachine &)=default
The default copy constructor.
TuringSim::Machine::StateAcceptingMachine< MachineType_, AcceptingStyle::Alternating >::isAcceptingState
Acceptance::NodeType isAcceptingState(const StateType &state) const noexcept
Whether a given state is accepting, rejecting or quantified.
Definition: stateAcceptingMachine.h:328
TuringSim::Machine::StateAcceptingMachine< MachineType_, AcceptingStyle::Alternating >::~StateAcceptingMachine
virtual ~StateAcceptingMachine() override=default
The default virtual destructor.
TuringSim::Machine::StateAcceptingMachine< MachineType_, AcceptingStyle::Accepting >::isAcceptingConfiguration
virtual bool isAcceptingConfiguration(const StateType &state, const StorageType &storage) const noexcept override final
Whether a given configuration is accepting.
Definition: stateAcceptingMachine.h:210
TuringSim::Machine::impl_details_::StateAcceptingMachineArgs
This class provide a single type AcceptingConstructorArgs that is the tuple of parameters used to dec...
Definition: stateAcceptingMachine.h:38
TuringSim::Machine::StateAcceptingMachine< MachineType_, AcceptingStyle::NonAccepting >::StateAcceptingMachine
StateAcceptingMachine()=default
Default constructor.
TuringSim::Machine::AcceptingStyle::NonAccepting
@ NonAccepting
A computation machine that does not accept anything.
TuringSim::Machine::StateAcceptingMachine< MachineType_, AcceptingStyle::Accepting >::operator=
StateAcceptingMachine & operator=(StateAcceptingMachine &&)=default
The default move assignment operator.
TuringSim::Machine::StateAcceptingMachine< MachineType_, AcceptingStyle::Alternating >::operator=
StateAcceptingMachine & operator=(StateAcceptingMachine &&)=default
The default move assignment operator.
TuringSim::Machine::StateAcceptingMachine< MachineType_, AcceptingStyle::Alternating >::isInitiallyUniversal
virtual bool isInitiallyUniversal() const noexcept override final
Whether we only want all initial states to success, or only one.
Definition: stateAcceptingMachine.h:339
TuringSim::Machine::StateAcceptingMachine< MachineType_, AcceptingStyle::Alternating >::isAcceptingConfiguration
virtual Acceptance::NodeType isAcceptingConfiguration(const StateType &state, const StorageType &storage) const noexcept override final
Whether a given configuration is accepting, rejecting or quantified.
Definition: stateAcceptingMachine.h:317
TuringSim::Machine::StateAcceptingMachine< MachineType_, AcceptingStyle::Accepting >::StateAcceptingMachine
StateAcceptingMachine()=delete
Delete default constructor: need accepting states.
TuringSim::Machine::StateAcceptingMachine< MachineType_, AcceptingStyle::Accepting >::isAcceptingState
bool isAcceptingState(const StateType &state) const noexcept
Whether a given state is accepting.
Definition: stateAcceptingMachine.h:219
TuringSim::Machine
The namespace that contains machines. To run them, see TuringSim::Runner.
Definition: acceptingMachine.h:7
TuringSim::Machine::StateAcceptingMachine< MachineType_, AcceptingStyle::Accepting >::StateAcceptingMachine
StateAcceptingMachine(const std::set< StateType > &acceptingStates)
Builds a SimpleFiniteStateMachine_accept_impl given a set of accepting states.
Definition: stateAcceptingMachine.h:178
TuringSim::Machine::AcceptingStyle
AcceptingStyle
Whether the machine is accepting, alternating or nothing.
Definition: acceptingMachine.h:11
TuringSim::Machine::StateAcceptingMachine< MachineType_, AcceptingStyle::NonAccepting >::operator=
StateAcceptingMachine & operator=(const StateAcceptingMachine &)=default
The default copy assignment operator.
TuringSim::Machine::StateAcceptingMachine< MachineType_, AcceptingStyle::Alternating >::StateAcceptingMachine
StateAcceptingMachine(StateAcceptingMachine &&)=default
The default move constructor.
TuringSim::Machine::StateAcceptingMachine
Definition: stateAcceptingMachine.h:93
TuringSim::Machine::StateAcceptingMachine< MachineType_, AcceptingStyle::Accepting >::acceptingStates
std::set< StateType > acceptingStates
The set of accepting states.
Definition: stateAcceptingMachine.h:226
TuringSim::Machine::StateAcceptingMachine< MachineType_, AcceptingStyle::Accepting >::~StateAcceptingMachine
virtual ~StateAcceptingMachine() override=default
The default virtual destructor.
TuringSim::Machine::StateAcceptingMachine< MachineType_, AcceptingStyle::Alternating >::initiallyUniversal
bool initiallyUniversal
the quantifier to apply between initial states.
Definition: stateAcceptingMachine.h:346
TuringSim::Machine::impl_details_::StateAcceptingMachineArgs< StateType_, AcceptingStyle::NonAccepting >::AcceptingConstructorArgs
std::tuple AcceptingConstructorArgs
Empty tuple: no arg for non-accepting machines.
Definition: stateAcceptingMachine.h:48
TuringSim::Machine::StateAcceptingMachine< MachineType_, AcceptingStyle::Alternating >::StateAcceptingMachine
StateAcceptingMachine(bool initiallyUniversal, const std::set< StateType > &accepting, const std::set< StateType > &rejecting, const std::set< StateType > &universal, const std::set< StateType > &existential)
Builds a SimpleFiniteStateMachine_accept_impl.
Definition: stateAcceptingMachine.h:268
TuringSim::Machine::impl_details_::StateAcceptingMachineArgs< StateType_, AcceptingStyle::Accepting >::AcceptingConstructorArgs
std::tuple< const std::set< StateType_ > & > AcceptingConstructorArgs
A tuple with the single set of accepting states.
Definition: stateAcceptingMachine.h:59
TuringSim::Machine::StateAcceptingMachine< MachineType_, AcceptingStyle::NonAccepting >::StateAcceptingMachine
StateAcceptingMachine(StateAcceptingMachine &&)=default
The default move constructor.
TuringSim::Machine::StateAcceptingMachine< MachineType_, AcceptingStyle::NonAccepting >::~StateAcceptingMachine
virtual ~StateAcceptingMachine() override=default
The default virtual destructor.
TuringSim::Machine::StateAcceptingMachine< MachineType_, AcceptingStyle::NonAccepting >::operator=
StateAcceptingMachine & operator=(StateAcceptingMachine &&)=default
The default move assignment operator.
TuringSim::Machine::StateAcceptingMachine< MachineType_, AcceptingStyle::Alternating >::operator=
StateAcceptingMachine & operator=(const StateAcceptingMachine &)=default
The default copy assignment operator.
TuringSim::Machine::StateAcceptingMachine< MachineType_, AcceptingStyle::Accepting >::operator=
StateAcceptingMachine & operator=(const StateAcceptingMachine &)=default
The default copy assignment operator.
TuringSim::Machine::StateAcceptingMachine< MachineType_, AcceptingStyle::Accepting >::StateAcceptingMachine
StateAcceptingMachine(const StateAcceptingMachine &)=default
The default copy constructor.
TuringSim::Machine::StateAcceptingMachine< MachineType_, AcceptingStyle::Alternating >::StateAcceptingMachine
StateAcceptingMachine()=delete
Delete default constructor: need initial quantifier, and accepting/rejecting/universal states.
TuringSim::Machine::impl_details_::StateAcceptingMachineArgs< StateType_, AcceptingStyle::Alternating >::AcceptingConstructorArgs
std::tuple< bool, const std::set< StateType_ > &, const std::set< StateType_ > &, const std::set< StateType_ > &, const std::set< StateType_ > & > AcceptingConstructorArgs
A tuple with parameters for alternating machines.
Definition: stateAcceptingMachine.h:77