TuringSim
C++ framework to simulate abstract computing models
amnesicMachine.h
1 #pragma once
2 
3 #include <machine/machine.h>
4 #include <transition/amnesic/amnesicMachineTransition.h>
5 
25  template <
26  typename TransitionType,
27  bool deterministic,
28  AcceptingStyle acceptingStyle,
29  template <typename...> class TransitionContainer = std::vector,
30  template <typename...> class InitialStateContainer = std::vector
31  >
33 
45  template <
46  typename TransitionType_,
47  AcceptingStyle acceptingStyle,
48  template <typename...> class TransitionContainer_,
49  template <typename...> class InitialStateContainer_
50  >
51  class AmnesicMachine<TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_> :
52  public Machine<TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_> {
54  public:
55  using typename Machine_::StateType;
56  using typename Machine_::IsAccepting;
57  using typename Machine_::StorageType;
58  using typename Machine_::IsAlternating;
59  using typename Machine_::TransitionType;
60  using typename Machine_::ApplyHelperType;
61  using typename Machine_::IsDeterministic;
62  using typename Machine_::TransitionContainer;
63  using typename Machine_::InitialStateContainer;
65 
66  static_assert(std::is_same_v<StateType, typename TransitionType::StateType>);
67  static_assert(std::is_same_v<StorageType, typename TransitionType::StorageType>);
68  static_assert(std::is_same_v<TransitionType, TransitionType_>);
69  static_assert(std::is_same_v<ApplyHelperType, typename TransitionType::ApplyHelperType>);
70  static_assert(std::is_same_v<ApplyHelperType, std::monostate>);
71  static_assert(std::is_same_v<IsDeterministic, std::true_type>);
72  static_assert(std::is_same_v<TransitionContainer, TransitionContainer_<std::pair<const TransitionType&, ApplyHelperType>>>);
73  static_assert(std::is_same_v<InitialStateContainer, InitialStateContainer_<StateType>>);
74  static_assert(std::is_same_v<OptionalHelpedTransition, std::optional<std::pair<const TransitionType&, ApplyHelperType>>>);
75 
76  static_assert(std::is_same_v<StorageType, std::monostate>,
77  "StorageType should be a word.");
79  "TransitionType must be a derived class of AmnesicMachineTransition");
80 
82  AmnesicMachine() = default;
84  AmnesicMachine(const AmnesicMachine&) = default;
96  virtual ~AmnesicMachine() override = default;
97 
98 #pragma clang diagnostic push
99 #pragma clang diagnostic ignored "-Wunused-parameter"
100 
113  virtual OptionalHelpedTransition getMatchingTransition(const StateType& state, const StorageType& storage) const noexcept override final {
114  return this->getMatchingTransitionFromState(state);
115  }
116 
129  virtual OptionalHelpedTransition getMatchingTransitionFromState(const StateType& state) const noexcept = 0;
130 
151  virtual bool isHaltingConfiguration(const StateType& state, const StorageType& storage) const noexcept override final {
152  return this->isHaltingState(state);
153  }
154 #pragma clang diagnostic pop
155 
173  virtual bool isHaltingState(const StateType& state) const noexcept = 0;
174  };
175 
189  template <
190  typename TransitionType_,
191  AcceptingStyle acceptingStyle,
192  template <typename...> class TransitionContainer_,
193  template <typename...> class InitialStateContainer_
194  >
195  class AmnesicMachine<TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_> :
196  public Machine<TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_> {
198  public:
199  using typename Machine_::StateType;
200  using typename Machine_::IsAccepting;
201  using typename Machine_::StorageType;
202  using typename Machine_::IsAlternating;
203  using typename Machine_::TransitionType;
204  using typename Machine_::ApplyHelperType;
205  using typename Machine_::IsDeterministic;
206  using typename Machine_::TransitionContainer;
207  using typename Machine_::InitialStateContainer;
208  using typename Machine_::OptionalHelpedTransition;
209 
210  static_assert(std::is_same_v<StateType, typename TransitionType::StateType>);
211  static_assert(std::is_same_v<StorageType, typename TransitionType::StorageType>);
212  static_assert(std::is_same_v<TransitionType, TransitionType_>);
213  static_assert(std::is_same_v<ApplyHelperType, typename TransitionType::ApplyHelperType>);
214  static_assert(std::is_same_v<ApplyHelperType, std::monostate>);
215  static_assert(std::is_same_v<IsDeterministic, std::false_type>);
216  static_assert(std::is_same_v<TransitionContainer, TransitionContainer_<std::pair<const TransitionType&, ApplyHelperType>>>);
217  static_assert(std::is_same_v<InitialStateContainer, InitialStateContainer_<StateType>>);
218  static_assert(std::is_same_v<OptionalHelpedTransition, std::optional<std::pair<const TransitionType&, ApplyHelperType>>>);
219 
220  static_assert(std::is_same_v<StorageType, std::monostate>,
221  "StorageType should be a word.");
223  "TransitionType must be a derived class of AmnesicMachineTransition");
224 
226  AmnesicMachine() = default;
228  AmnesicMachine(const AmnesicMachine&) = default;
240  virtual ~AmnesicMachine() override = default;
241 
242 #pragma clang diagnostic push
243 #pragma clang diagnostic ignored "-Wunused-parameter"
244 
257  virtual TransitionContainer getMatchingTransitions(const StateType& state, const StorageType& storage) const noexcept override final {
258  return this->getMatchingTransitionsFromState(state);
259  }
260 
270  virtual TransitionContainer getMatchingTransitionsFromState(const StateType& state) const noexcept = 0;
271 
290  virtual bool isHaltingConfiguration(const StateType& state, const StorageType& storage) const noexcept override final {
291  return this->isHaltingState(state);
292  }
293 #pragma clang diagnostic pop
294 
312  virtual bool isHaltingState(const StateType& state) const noexcept = 0;
313  };
314 }
TuringSim::Machine::Amnesic::AmnesicMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::isHaltingConfiguration
virtual bool isHaltingConfiguration(const StateType &state, const StorageType &storage) const noexcept override final
Test if a given configuration is a halting one.
Definition: amnesicMachine.h:290
TuringSim::Machine::Machine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::ApplyHelperType
TransitionType::ApplyHelperType ApplyHelperType
The type of the apply helper. Got from TransitionType.
Definition: machine.h:85
TuringSim::Transition::Amnesic::AmnesicMachineTransition
The transition base class for AmnesicMachine.
Definition: amnesicMachineTransition.h:16
TuringSim::Machine::Amnesic::AmnesicMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::operator=
AmnesicMachine & operator=(AmnesicMachine &&)=default
The default move assignment operator.
TuringSim::Machine::Amnesic::AmnesicMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::isHaltingConfiguration
virtual bool isHaltingConfiguration(const StateType &state, const StorageType &storage) const noexcept override final
Test if a given configuration is a halting one.
Definition: amnesicMachine.h:151
TuringSim::Machine::Amnesic::AmnesicMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::AmnesicMachine
AmnesicMachine(const AmnesicMachine &)=default
The default copy constructor.
TuringSim::Machine::Amnesic::AmnesicMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::getMatchingTransitionFromState
virtual OptionalHelpedTransition getMatchingTransitionFromState(const StateType &state) const noexcept=0
Get matching transition for the next step.
TuringSim::Machine::Amnesic::AmnesicMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::AmnesicMachine
AmnesicMachine(AmnesicMachine &&)=default
The default move constructor.
TuringSim::Machine::Amnesic::AmnesicMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::operator=
AmnesicMachine & operator=(const AmnesicMachine &)=default
The default copy assignment operator.
TuringSim::Machine::Amnesic::AmnesicMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::~AmnesicMachine
virtual ~AmnesicMachine() override=default
The default virtual destructor.
TuringSim::Machine::Amnesic::AmnesicMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::getMatchingTransitions
virtual TransitionContainer getMatchingTransitions(const StateType &state, const StorageType &storage) const noexcept override final
Get matching transition for the next step.
Definition: amnesicMachine.h:257
TuringSim::Machine::Machine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::InitialStateContainer
InitialStateContainer_< StateType > InitialStateContainer
The type returned by getInitialStates() const that contains initial states.
Definition: machine.h:256
TuringSim::Machine::Amnesic::AmnesicMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::getMatchingTransitionsFromState
virtual TransitionContainer getMatchingTransitionsFromState(const StateType &state) const noexcept=0
Get matching transitions for the next step using only the state.
TuringSim::Machine::Machine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::InitialStateContainer
InitialStateContainer_< StateType > InitialStateContainer
The type returned by getInitialStates() const that contains initial states.
Definition: machine.h:106
TuringSim::Machine::Machine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >
Base class for non deterministic machines.
Definition: machine.h:55
TuringSim::Machine::Machine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::ApplyHelperType
TransitionType::ApplyHelperType ApplyHelperType
The type of the apply helper. Got from TransitionType.
Definition: machine.h:234
TuringSim::Machine::Amnesic::AmnesicMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::isHaltingState
virtual bool isHaltingState(const StateType &state) const noexcept=0
Test if a given state is a halting one.
TuringSim::Machine::Amnesic::AmnesicMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::isHaltingState
virtual bool isHaltingState(const StateType &state) const noexcept=0
Test if a given state is a halting one.
TuringSim::Machine::Machine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::OptionalHelpedTransition
std::optional< std::pair< const TransitionType &, ApplyHelperType > > OptionalHelpedTransition
The type returned by getMatchingTransition(const StateType&, const StorageType&) const that contains ...
Definition: machine.h:250
TuringSim::Machine::Amnesic::AmnesicMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::AmnesicMachine
AmnesicMachine(const AmnesicMachine &)=default
The default copy constructor.
TuringSim::Machine::Amnesic::AmnesicMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::getMatchingTransition
virtual OptionalHelpedTransition getMatchingTransition(const StateType &state, const StorageType &storage) const noexcept override final
Get matching transition for the next step.
Definition: amnesicMachine.h:113
TuringSim::Machine::Machine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::StateType
TransitionType::StateType StateType
The type of the machine states. Got from TransitionType.
Definition: machine.h:67
TuringSim::Machine::Machine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::StateType
TransitionType::StateType StateType
The type of the machine states. Got from TransitionType.
Definition: machine.h:218
TuringSim::Machine::Amnesic::AmnesicMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::AmnesicMachine
AmnesicMachine(AmnesicMachine &&)=default
The default move constructor.
TuringSim::Machine::AcceptingStyle
AcceptingStyle
Whether the machine is accepting, alternating or nothing.
Definition: acceptingMachine.h:11
TuringSim::Machine::Amnesic::AmnesicMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::operator=
AmnesicMachine & operator=(const AmnesicMachine &)=default
The default copy assignment operator.
TuringSim::Machine::Machine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::TransitionContainer
TransitionContainer_< std::pair< const TransitionType &, ApplyHelperType > > TransitionContainer
The type returned by getMatchingTransitions(const StateType&, const StorageType&) const that contains...
Definition: machine.h:94
TuringSim::Machine::Amnesic::AmnesicMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::operator=
AmnesicMachine & operator=(AmnesicMachine &&)=default
The default move assignment operator.
TuringSim::Machine::Machine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::TransitionType
TransitionType_ TransitionType
The type of the transitions.
Definition: machine.h:212
TuringSim::Machine::Amnesic::AmnesicMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::~AmnesicMachine
virtual ~AmnesicMachine() override=default
The default virtual destructor.
TuringSim::Machine::Machine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::StorageType
TransitionType::StorageType StorageType
The type of the machine memoryGot from TransitionType.
Definition: machine.h:75
TuringSim::Machine::Amnesic
Namespace of amnesic machine, that is machines without memory.
TuringSim::Machine::Machine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::IsDeterministic
std::true_type IsDeterministic
std::true_type
Definition: machine.h:262
TuringSim::Machine::Machine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::TransitionContainer
TransitionContainer_< std::pair< const TransitionType &, ApplyHelperType > > TransitionContainer
The type returned by getMatchingTransitions(const StateType&, const StorageType&) const that contains...
Definition: machine.h:242
TuringSim::Machine::Machine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::StorageType
TransitionType::StorageType StorageType
The type of the machine memoryGot from TransitionType.
Definition: machine.h:225
TuringSim::Machine::Machine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >
Base class for deterministic machines.
Definition: machine.h:203
TuringSim::Machine::Machine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::OptionalHelpedTransition
std::optional< std::pair< const TransitionType &, ApplyHelperType > > OptionalHelpedTransition
Useless in non-deterministic machine. Is guaranteed to exist for compatibility with deterministic mac...
Definition: machine.h:99
TuringSim::Machine::Amnesic::AmnesicMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::AmnesicMachine
AmnesicMachine()=default
The default constructor.
TuringSim::Machine::Amnesic::AmnesicMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::AmnesicMachine
AmnesicMachine()=default
The default constructor.
TuringSim::Machine::Machine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::TransitionType
TransitionType_ TransitionType
The type of the transitions.
Definition: machine.h:60
TuringSim::Machine::Machine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::IsDeterministic
std::false_type IsDeterministic
std::false_type
Definition: machine.h:113
TuringSim::Machine::Machine
Base class for machines.
Definition: machine.h:33
TuringSim::Machine::Amnesic::AmnesicMachine
The class to represent an amnesic machine.
Definition: amnesicMachine.h:32