TuringSim
C++ framework to simulate abstract computing models
localTuringMachine.h
1 #pragma once
2 
3 #include <variant>
4 
5 #include <machine/Turing/turingMachine.h>
6 #include <transition/Turing/localTuringMachineTransition.h>
7 
23  template<
24  typename TransitionType_,
25  bool deterministic,
26  AcceptingStyle acceptingStyle,
27  template <typename...> class TransitionContainer_ = std::vector,
28  template <typename...> class InitialStateContainer_ = std::vector>
30 
44  template<
45  typename TransitionType_,
46  AcceptingStyle acceptingStyle,
47  template <typename...> class TransitionContainer_,
48  template <typename...> class InitialStateContainer_>
50  TransitionType_,
51  false,
52  acceptingStyle,
53  TransitionContainer_,
54  InitialStateContainer_> :
55  public TuringMachine<
56  TransitionType_,
57  false,
58  acceptingStyle,
59  TransitionContainer_,
60  InitialStateContainer_> {
62  public:
63  using typename TuringMachine_::StateType;
64  using typename TuringMachine_::SymbolType;
65  using typename TuringMachine_::HasHalfTape;
66  using typename TuringMachine_::IsAccepting;
67  using typename TuringMachine_::StorageType;
68  using typename TuringMachine_::IsAlternating;
69  using typename TuringMachine_::TransitionType;
70  using typename TuringMachine_::ApplyHelperType;
71  using typename TuringMachine_::IsDeterministic;
72  using typename TuringMachine_::TransitionContainer;
73  using typename TuringMachine_::InitialStateContainer;
74  using typename TuringMachine_::OptionalHelpedTransition;
75 
76  static_assert(std::is_same_v<StateType, typename TransitionType::StateType>);
77  static_assert(std::is_same_v<SymbolType, typename StorageType::SymbolType>);
78  static_assert(std::is_same_v<HasHalfTape, typename TransitionType::HasHalfTape>);
79  static_assert(std::is_same_v<StorageType, typename TransitionType::StorageType>);
80  static_assert(std::is_same_v<TransitionType, TransitionType_>);
81  static_assert(std::is_same_v<ApplyHelperType, typename TransitionType::ApplyHelperType>);
82  static_assert(std::is_same_v<IsDeterministic, std::false_type>);
83  static_assert(std::is_same_v<TransitionContainer, TransitionContainer_<std::pair<const TransitionType&, ApplyHelperType>>>);
84  static_assert(std::is_same_v<InitialStateContainer, InitialStateContainer_<StateType>>);
85  static_assert(std::is_same_v<OptionalHelpedTransition, std::optional<std::pair<const TransitionType&, ApplyHelperType>>>);
86 
88  "TransitionType must be a derived class of LocalTuringMachineTransition");
89 
91  LocalTuringMachine() = default;
105  virtual ~LocalTuringMachine() override = default;
106 
117  virtual TransitionContainer getMatchingTransitionsFromCurrentCell(const StateType& state, const SymbolType& symbol) const noexcept = 0;
118 
129  virtual TransitionContainer getMatchingTransitions(const StateType& state, const StorageType& tape) const noexcept override final {
130  return this->getMatchingTransitionsFromCurrentCell(state, tape.read());
131  }
132  };
133 
147  template<
148  typename TransitionType_,
149  AcceptingStyle acceptingStyle,
150  template <typename...> class TransitionContainer_,
151  template <typename...> class InitialStateContainer_>
153  TransitionType_,
154  true,
155  acceptingStyle,
156  TransitionContainer_,
157  InitialStateContainer_> :
158  public TuringMachine<
159  TransitionType_,
160  true,
161  acceptingStyle,
162  TransitionContainer_,
163  InitialStateContainer_> {
165  public:
166  using typename TuringMachine_::StateType;
167  using typename TuringMachine_::SymbolType;
168  using typename TuringMachine_::HasHalfTape;
169  using typename TuringMachine_::IsAccepting;
170  using typename TuringMachine_::StorageType;
171  using typename TuringMachine_::IsAlternating;
172  using typename TuringMachine_::TransitionType;
173  using typename TuringMachine_::ApplyHelperType;
174  using typename TuringMachine_::IsDeterministic;
175  using typename TuringMachine_::TransitionContainer;
176  using typename TuringMachine_::InitialStateContainer;
177  using typename TuringMachine_::OptionalHelpedTransition;
178 
179  static_assert(std::is_same_v<StateType, typename TransitionType::StateType>);
180  static_assert(std::is_same_v<HasHalfTape, typename TransitionType::HasHalfTape>);
181  static_assert(std::is_same_v<SymbolType, typename StorageType::SymbolType>);
182  static_assert(std::is_same_v<StorageType, typename TransitionType::StorageType>);
183  static_assert(std::is_same_v<TransitionType, TransitionType_>);
184  static_assert(std::is_same_v<ApplyHelperType, typename TransitionType::ApplyHelperType>);
185  static_assert(std::is_same_v<IsDeterministic, std::true_type>);
186  static_assert(std::is_same_v<TransitionContainer, TransitionContainer_<std::pair<const TransitionType&, ApplyHelperType>>>);
187  static_assert(std::is_same_v<InitialStateContainer, InitialStateContainer_<StateType>>);
188  static_assert(std::is_same_v<OptionalHelpedTransition, std::optional<std::pair<const TransitionType&, ApplyHelperType>>>);
189 
191  "TransitionType must be a derived class of LocalTuringMachineTransition");
192 
194  LocalTuringMachine() = default;
208  virtual ~LocalTuringMachine() override = default;
209 
220  virtual OptionalHelpedTransition getMatchingTransitionFromCurrentCell(const StateType& state, const SymbolType& symbol) const noexcept = 0;
221 
235  virtual OptionalHelpedTransition getMatchingTransition(const StateType& state, const StorageType& tape) const noexcept override final {
236  return this->getMatchingTransitionFromCurrentCell(state, tape.read());
237  }
238  };
239 }
TuringSim::Machine::Turing::LocalTuringMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::LocalTuringMachine
LocalTuringMachine(const LocalTuringMachine &)=default
The default copy constructor.
TuringSim::Machine::Turing::LocalTuringMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::getMatchingTransition
virtual OptionalHelpedTransition getMatchingTransition(const StateType &state, const StorageType &tape) const noexcept override final
Get matching transitions for the next step.
Definition: localTuringMachine.h:235
TuringSim::Machine::Turing::LocalTuringMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::getMatchingTransitions
virtual TransitionContainer getMatchingTransitions(const StateType &state, const StorageType &tape) const noexcept override final
Get matching transitions for the next step.
Definition: localTuringMachine.h:129
TuringSim::Machine::Turing::LocalTuringMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::LocalTuringMachine
LocalTuringMachine(const LocalTuringMachine &)=default
The default copy constructor.
TuringSim::Machine::Turing::LocalTuringMachine
Turing machines that only reads the current cell on the tape to select matching transitions.
Definition: localTuringMachine.h:29
TuringSim::Machine::Turing::LocalTuringMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::~LocalTuringMachine
virtual ~LocalTuringMachine() override=default
The default virtual destructor.
TuringSim::Machine::Turing::TuringMachine
The class to represent a Turing machine.
Definition: turingMachine.h:34
TuringSim::Machine::Turing::LocalTuringMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::LocalTuringMachine
LocalTuringMachine()=default
The default constructor.
TuringSim::Machine::Turing::TuringMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::SymbolType
StorageType::SymbolType SymbolType
The type of the symbols on the tape.
Definition: turingMachine.h:51
TuringSim::Machine::Turing::LocalTuringMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::~LocalTuringMachine
virtual ~LocalTuringMachine() override=default
The default virtual destructor.
TuringSim::Machine::Turing::LocalTuringMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::operator=
LocalTuringMachine & operator=(LocalTuringMachine &&)=default
The default move assignment operator.
TuringSim::Machine::Turing::LocalTuringMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::operator=
LocalTuringMachine & operator=(LocalTuringMachine &&)=default
The default move assignment operator.
TuringSim::Machine::AcceptingStyle
AcceptingStyle
Whether the machine is accepting, alternating or nothing.
Definition: acceptingMachine.h:11
TuringSim::Machine::Turing::TuringMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::HasHalfTape
TransitionType::HasHalfTape HasHalfTape
Whether the tape is a Tape or a HalfTape.
Definition: turingMachine.h:59
TuringSim::Machine::Turing::LocalTuringMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::getMatchingTransitionsFromCurrentCell
virtual TransitionContainer getMatchingTransitionsFromCurrentCell(const StateType &state, const SymbolType &symbol) const noexcept=0
Returns matching transitions from the current state and symbol.
TuringSim::Machine::Turing::LocalTuringMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::LocalTuringMachine
LocalTuringMachine(LocalTuringMachine &&)=default
The default move constructor.
TuringSim::Machine::Turing::LocalTuringMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::LocalTuringMachine
LocalTuringMachine(LocalTuringMachine &&)=default
The default move constructor.
TuringSim::Machine::Turing
Namespace of Turing machines, that is whose storage is a tape.
Definition: deterministicSimpleTuringMachine.h:8
TuringSim::Machine::Turing::LocalTuringMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::getMatchingTransitionFromCurrentCell
virtual OptionalHelpedTransition getMatchingTransitionFromCurrentCell(const StateType &state, const SymbolType &symbol) const noexcept=0
Returns matching transition from the current state and symbol.
TuringSim::Machine::Turing::LocalTuringMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::LocalTuringMachine
LocalTuringMachine()=default
The default constructor.
TuringSim::Machine::Turing::LocalTuringMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::operator=
LocalTuringMachine & operator=(const LocalTuringMachine &)=default
The default copy assignment operator.
TuringSim::Machine::Turing::LocalTuringMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::operator=
LocalTuringMachine & operator=(const LocalTuringMachine &)=default
The default copy assignment operator.
TuringSim::Transition::Turing::LocalTuringMachineTransition
Base class for Turing machine transitions that only reads the current symbol on the tape to decide if...
Definition: localTuringMachineTransition.h:23