TuringSim
C++ framework to simulate abstract computing models
simpleTuringMachineTransition.h
1 #pragma once
2 
3 #include <symbol/simpleSymbolPattern.h>
4 #include <state/simpleStatePattern.h>
5 #include <transition/Turing/oneStepTuringMachineTransition.h>
6 
8 
19  template <
20  typename StateType_,
21  typename SymbolType_,
22  bool hasHalfTape = false>
25  StateType_,
26  SymbolType_,
27  std::monostate,
28  hasHalfTape
29  > {
30  private:
31  typedef std::monostate ApplyHelperType_;
33  public:
40 
41  static_assert(std::is_same_v<StateType_, StateType>);
42  static_assert(std::is_same_v<SymbolType_, SymbolType>);
43  static_assert(std::is_same_v<Memory::TapeLike<hasHalfTape, SymbolType_>, StorageType>);
44  static_assert(std::is_same_v<ApplyHelperType, std::monostate>);
45  static_assert(std::is_same_v<typename Memory::TapeLike<hasHalfTape, SymbolType_>::Movement, Movement>);
46 
50 
59  const StateType& preState,
60  const SymbolType& preSymbol,
61  const StateType& postState,
62  const SymbolType& postSymbol,
63  const Movement& movement) :
65  preState(preState),
66  preSymbol(preSymbol),
67  postState(postState),
68  postSymbol(postSymbol),
69  movement(movement){
70  }
71 
74 
77 
82 
87 
89  virtual ~SimpleTuringMachineTransition() override = default;
90 
91  virtual std::optional<std::monostate> matchFromCurrentCell(const StateType& conf, const SymbolType& symbol) const override final {
92  if(preSymbol.match(symbol) && preState.match(conf)) {
93  return std::optional<std::monostate>(std::monostate());
94  }
95  return std::optional<std::monostate>();
96  }
97 
98  virtual std::tuple<StateType, SymbolType, Movement> getPostElements(const StateType&, const SymbolType&, std::monostate&&) const override final {
99  return this->getPostElementsTrivially();
100  }
101 
105  std::tuple<StateType, SymbolType, Movement> getPostElementsTrivially() const {
106  return {postState, postSymbol, movement};
107  }
108 
113  const StateType& getPreState() const {
114  return preState.getState();
115  }
116 
121  const SymbolType& getPreSymbol() const {
122  return preSymbol.getLetter();
123  }
124 
129  bool operator<(const SimpleTuringMachineTransition& other) const {
130  if(preState < other.preState) {
131  return true;
132  }
133  if(other.preState < preState) {
134  return false;
135  }
136  if(preSymbol < other.preSymbol) {
137  return true;
138  }
139  if(other.preSymbol < preSymbol) {
140  return false;
141  }
142  if(postState < other.postState) {
143  return true;
144  }
145  if(other.postState < postState) {
146  return false;
147  }
148  if(postSymbol < other.postSymbol) {
149  return true;
150  }
151  if(other.postSymbol < postSymbol) {
152  return false;
153  }
154  if(movement < other.movement) {
155  return true;
156  }
157  if(other.movement < movement) {
158  return false;
159  }
160  return false;
161  }
162 
163  private:
166  StateType postState;
167  SymbolType postSymbol;
168  Movement movement;
169  };
170 }
TuringSim::Transition::Turing::SimpleTuringMachineTransition::getPostElements
virtual std::tuple< StateType, SymbolType, Movement > getPostElements(const StateType &, const SymbolType &, std::monostate &&) const override final
get the new state, the new symbol and the movement to execute.
Definition: simpleTuringMachineTransition.h:98
TuringSim::Transition::Turing::SimpleTuringMachineTransition::matchFromCurrentCell
virtual std::optional< std::monostate > matchFromCurrentCell(const StateType &conf, const SymbolType &symbol) const override final
Test whether the transition matches a configuration. Returned optional is empty iff the transition do...
Definition: simpleTuringMachineTransition.h:91
TuringSim::Symbol::SimpleSymbolPattern::match
virtual bool match(const T &letter) const noexcept override
Test if a symbol matches the symbol.
Definition: simpleSymbolPattern.h:34
TuringSim::State::SimpleStatePattern< StateType >
TuringSim::Transition::Turing::SimpleTuringMachineTransition::SimpleTuringMachineTransition
SimpleTuringMachineTransition(const StateType &preState, const SymbolType &preSymbol, const StateType &postState, const SymbolType &postSymbol, const Movement &movement)
The straightforward constructor: we specify each component of the transition separately.
Definition: simpleTuringMachineTransition.h:58
TuringSim::Memory::TapeLike
std::conditional_t< isHalfTape, HalfTape::HalfTape< SymbolType >, Tape::Tape< SymbolType > > TapeLike
Definition: tapeLike.h:12
TuringSim::Transition::Turing
Transitions for Turing machines.
Definition: localTuringMachineTransition.h:6
TuringSim::Transition::Turing::SimpleTuringMachineTransition::~SimpleTuringMachineTransition
virtual ~SimpleTuringMachineTransition() override=default
The default virtual destructor.
TuringSim::Symbol::SimpleSymbolPattern::getLetter
const T & getLetter() const
Get the accepted letter, for optimized containers.
Definition: simpleSymbolPattern.h:41
TuringSim::Transition::Turing::TuringMachineTransition::StateType
StateType_ StateType
The type of states.
Definition: transition.h:72
TuringSim::Transition::Turing::SimpleTuringMachineTransition::operator=
SimpleTuringMachineTransition & operator=(const SimpleTuringMachineTransition &)=default
The default copy assignment operator.
TuringSim::Transition::Turing::TuringMachineTransition::ApplyHelperType
ApplyHelperType_ ApplyHelperType
The type of apply helpers.
Definition: transition.h:82
TuringSim::Transition::Turing::SimpleTuringMachineTransition::getPreState
const StateType & getPreState() const
Get the only accepted state. Useful to store SimpleTuringMachineTransition into std::map,...
Definition: simpleTuringMachineTransition.h:113
TuringSim::Transition::Turing::OneStepTuringMachineTransition::SymbolType
SymbolType_ SymbolType
The type of symbols on the tape.
Definition: turingMachineTransition.h:37
TuringSim::State::SimpleStatePattern::getState
constexpr const T & getState() const
get the accepting state
Definition: simpleStatePattern.h:82
TuringSim::Transition::Turing::OneStepTuringMachineTransition
Turing machine transitions that reads only the current symbol, writes a symbol, performs a simple mov...
Definition: oneStepTuringMachineTransition.h:21
TuringSim::State::SimpleStatePattern::match
virtual std::optional< MatcherType > match(const T &state) const noexcept override
Test if a state matches.
Definition: simpleStatePattern.h:90
TuringSim::Transition::Turing::SimpleTuringMachineTransition::Movement
StorageType_::Movement Movement
The type of movement on the tape.
Definition: turingMachineTransition.h:42
TuringSim::Transition::Turing::SimpleTuringMachineTransition::SimpleTuringMachineTransition
SimpleTuringMachineTransition(SimpleTuringMachineTransition &&)=default
The default move constructor.
TuringSim::Transition::Turing::SimpleTuringMachineTransition::operator<
bool operator<(const SimpleTuringMachineTransition &other) const
A strong total order.
Definition: simpleTuringMachineTransition.h:129
TuringSim::Transition::Turing::SimpleTuringMachineTransition::operator=
SimpleTuringMachineTransition & operator=(SimpleTuringMachineTransition &&)=default
The default move assignment operator.
TuringSim::Transition::Turing::SimpleTuringMachineTransition::SimpleTuringMachineTransition
SimpleTuringMachineTransition()=delete
An SimpleTuringMachineTransition makes no sense.
TuringSim::Transition::Turing::SimpleTuringMachineTransition::SymbolType
SymbolType_ SymbolType
The type of symbols on the tape.
Definition: turingMachineTransition.h:37
TuringSim::Transition::Turing::OneStepTuringMachineTransition::HasHalfTape
std::integral_constant< bool, hasHalfTape > HasHalfTape
Whether the tape is a half-tape or a full tape.
Definition: turingMachineTransition.h:49
TuringSim::Transition::Turing::TuringMachineTransition::StorageType
StorageType_ StorageType
The type of storage.
Definition: transition.h:77
TuringSim::Transition::Turing::OneStepTuringMachineTransition::Movement
StorageType_::Movement Movement
The type of movement on the tape.
Definition: turingMachineTransition.h:42
TuringSim::Transition::Turing::SimpleTuringMachineTransition
Turing machine transition where the state pattern is a TuringSim::State::SimpleStatePattern and the s...
Definition: simpleTuringMachineTransition.h:29
TuringSim::Transition::Turing::SimpleTuringMachineTransition::SimpleTuringMachineTransition
SimpleTuringMachineTransition(const SimpleTuringMachineTransition &)=default
The default copy constructor.
TuringSim::Transition::Turing::SimpleTuringMachineTransition::getPreSymbol
const SymbolType & getPreSymbol() const
Get the only accepted symbol. Useful to store SimpleTuringMachineTransition into std::map,...
Definition: simpleTuringMachineTransition.h:121
TuringSim::Symbol::SimpleSymbolPattern< SymbolType >
TuringSim::Transition::Transition< StateType_, Memory::TapeLike< hasHalfTape, SymbolType_ >, std::monostate >::StorageType
Memory::TapeLike< hasHalfTape, SymbolType_ > StorageType
The type of storage.
Definition: transition.h:77
TuringSim::Transition::Turing::SimpleTuringMachineTransition::getPostElementsTrivially
std::tuple< StateType, SymbolType, Movement > getPostElementsTrivially() const
Get the new state, the new symbol and the movement.
Definition: simpleTuringMachineTransition.h:105