TuringSim
C++ framework to simulate abstract computing models
mConfigurationTuringMachineTransition.h
1 #pragma once
2 
3 #include <utils/visitor.h>
4 #include <state/mConfiguration/mConfiguration.h>
5 #include <transition/Turing/localTuringMachineTransition.h>
6 
8 
13  template <typename T>
14  using MConfigurationTuringMachineTransitionApplyHelper = std::map<T, std::shared_ptr<const State::MConfiguration::MConfiguration<T>>>;
15 
22  template<
23  typename NodeStateType_,
24  typename SymbolType_,
25  bool hasHalfTape
26  >
29  std::shared_ptr<const State::MConfiguration::MConfiguration<NodeStateType_>>,
30  SymbolType_,
31  MConfigurationTuringMachineTransitionApplyHelper<NodeStateType_>,
32  hasHalfTape
33  > {
34  typedef std::shared_ptr<const State::MConfiguration::MConfiguration<NodeStateType_>> StateType_;
37  public:
44 
48  typedef NodeStateType_ NodeStateType;
49 
54 
65  bool operator==(const MovementInstruction& other) const { return movement == other.movement; }
66 
71  bool operator!=(const MovementInstruction& other) const { return movement != other.movement; }
72 
77  bool operator<(const MovementInstruction& other) const { return movement < other.movement; }
78  };
79 
84 #pragma clang diagnostic push
85 #pragma clang diagnostic ignored "-Wunused-parameter"
86 
90  bool operator==(const EraseInstruction& other) const { return true; }
91 
96  bool operator!=(const EraseInstruction& other) const { return false; }
97 
102  bool operator<(const EraseInstruction& other) const { return false; }
103 #pragma clang diagnostic pop
104  };
105 
116  bool operator==(const WriteInstruction& other) const { return symbol == other.symbol; }
117 
122  bool operator!=(const WriteInstruction& other) const { return symbol != other.symbol; }
123 
128  bool operator<(const WriteInstruction& other) const { return symbol < other.symbol; }
129  };
130 
134  typedef std::variant<MovementInstruction, EraseInstruction, WriteInstruction> Instruction;
135 
143  template <typename CharT = char, typename Traits = std::char_traits<CharT>>
144  friend std::basic_ostream<CharT, Traits>& operator<<(std::basic_ostream<CharT, Traits>& os, const MovementInstruction& mi) {
145  os << "move(" << mi.movement << ")";
146  return
147  os;
148  }
149 
150 #pragma clang diagnostic push
151 #pragma clang diagnostic ignored "-Wunused-parameter"
152 
159  template <typename CharT = char, typename Traits = std::char_traits<CharT>>
160  friend std::basic_ostream<CharT, Traits>& operator<<(std::basic_ostream<CharT, Traits>& os, const EraseInstruction& ei) {
161  os << "erase";
162  return os;
163  }
164 #pragma clang diagnostic pop
165 
173  template <typename CharT = char, typename Traits = std::char_traits<CharT>>
174  friend std::basic_ostream<CharT, Traits>& operator<<(std::basic_ostream<CharT, Traits>& os, const WriteInstruction& wi) {
175  os << "write(" << wi.symbol << ")";
176  return os;
177  }
178 
186  template <typename CharT = char, typename Traits = std::char_traits<CharT>>
187  friend std::basic_ostream<CharT, Traits>& operator<<(std::basic_ostream<CharT, Traits>& os, const Instruction& i) {
188  using Utils::Visitor;
189  std::visit(
190  Visitor{
191  [&os](const MovementInstruction& mi) {
192  os << mi;
193  },
194  [&os](const EraseInstruction& ei) {
195  os << ei;
196  },
197  [&os](const WriteInstruction& wi) {
198  os << wi;
199  },
200  },
201  i);
202  return os;
203  }
204 
207 
210 
213 
218 
223 
225  virtual ~MConfigurationTuringMachineTransition() override = default;
226 
227  protected:
232  void run_instruction(StorageType& tape, const Instruction& instruction) const {
233  using Utils::Visitor;
234  std::visit(
235  Visitor{
236  [&tape](const MovementInstruction& m) -> void { tape.move(m.movement); },
237  [&tape](const EraseInstruction& ) -> void { tape.erase(); },
238  [&tape](const WriteInstruction& w) -> void { tape.write(w.symbol); },
239  },
240  instruction);
241  }
242 
248  void run_instructions(StorageType& tape, bool& running, const std::vector<Instruction>& instructions) const {
249  for (const Instruction& i: instructions) {
250  try {
251  const MovementInstruction& mi = std::get<MovementInstruction>(i);
252  if (mi.movement == StorageType::Movement::HALT) {
253  running = false;
254  break;
255  }
256  }
257  catch (std::bad_variant_access) { // If [i] is not a movement instruction.
258  }
259  run_instruction(tape, i);
260  }
261  }
262  };
263 }
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition
Base class for Turing machine transitions that works with m-configurations.
Definition: mConfigurationTuringMachineTransition.h:33
TuringSim::Transition::Transition< std::shared_ptr< const State::MConfiguration::MConfiguration< T > >, Memory::TapeLike< hasHalfTape, T >, MConfigurationTuringMachineTransitionApplyHelper< T > >::ApplyHelperType
MConfigurationTuringMachineTransitionApplyHelper< T > ApplyHelperType
The type of apply helpers.
Definition: transition.h:82
TuringSim::Utils::Visitor
Visitor(Ts...) -> Visitor< Ts... >
The deduction guide for Visitor, useless since C++20.
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition::MovementInstruction::operator<
bool operator<(const MovementInstruction &other) const
Less than comparison. Strong ordering.
Definition: mConfigurationTuringMachineTransition.h:77
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition::MovementInstruction::movement
Movement movement
The movement to execute.
Definition: mConfigurationTuringMachineTransition.h:59
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition::WriteInstruction::operator<
bool operator<(const WriteInstruction &other) const
Less than comparison. Strong ordering.
Definition: mConfigurationTuringMachineTransition.h:128
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition::operator<<
friend std::basic_ostream< CharT, Traits > & operator<<(std::basic_ostream< CharT, Traits > &os, const WriteInstruction &wi)
Debug printer for write instructions.
Definition: mConfigurationTuringMachineTransition.h:174
TuringSim::Transition::Turing
Transitions for Turing machines.
Definition: localTuringMachineTransition.h:6
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition::~MConfigurationTuringMachineTransition
virtual ~MConfigurationTuringMachineTransition() override=default
The default virtual destructor.
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition::MConfigurationTuringMachineTransition
MConfigurationTuringMachineTransition()=default
The default constructor.
TuringSim::Transition::Turing::LocalTuringMachineTransition::Movement
StorageType_::Movement Movement
The type of movement on the tape.
Definition: turingMachineTransition.h:42
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition::operator<<
friend std::basic_ostream< CharT, Traits > & operator<<(std::basic_ostream< CharT, Traits > &os, const MovementInstruction &mi)
Debug printer for movement instructions.
Definition: mConfigurationTuringMachineTransition.h:144
TuringSim::Transition::Turing::TuringMachineTransition< StateType_, SymbolType_, ApplyHelperType_, false >::StateType
StateType_ StateType
The type of states.
Definition: transition.h:72
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition::MConfigurationTuringMachineTransition
MConfigurationTuringMachineTransition(const MConfigurationTuringMachineTransition &)=default
The default copy constructor.
TuringSim::Transition::Turing::TuringMachineTransition< StateType_, SymbolType_, ApplyHelperType_, false >::ApplyHelperType
ApplyHelperType_ ApplyHelperType
The type of apply helpers.
Definition: transition.h:82
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition::SubstitutionType
ApplyHelperType SubstitutionType
The type of substitutions, same as apply helper.
Definition: mConfigurationTuringMachineTransition.h:53
TuringSim::Transition::Turing::LocalTuringMachineTransition::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::MConfigurationTuringMachineTransition::Movement
StorageType_::Movement Movement
The type of movement on the tape.
Definition: turingMachineTransition.h:42
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition::operator<<
friend std::basic_ostream< CharT, Traits > & operator<<(std::basic_ostream< CharT, Traits > &os, const Instruction &i)
Debug printer for instructions.
Definition: mConfigurationTuringMachineTransition.h:187
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition::operator<<
friend std::basic_ostream< CharT, Traits > & operator<<(std::basic_ostream< CharT, Traits > &os, const EraseInstruction &ei)
Debug printer for erase instructions.
Definition: mConfigurationTuringMachineTransition.h:160
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition::WriteInstruction::operator==
bool operator==(const WriteInstruction &other) const
Equality comparison.
Definition: mConfigurationTuringMachineTransition.h:116
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition::EraseInstruction::operator==
bool operator==(const EraseInstruction &other) const
Equality comparison.
Definition: mConfigurationTuringMachineTransition.h:90
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition::operator=
MConfigurationTuringMachineTransition & operator=(MConfigurationTuringMachineTransition &&)=default
The default move assignment operator.
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition::WriteInstruction::operator!=
bool operator!=(const WriteInstruction &other) const
Un-equality comparison.
Definition: mConfigurationTuringMachineTransition.h:122
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition::MConfigurationTuringMachineTransition
MConfigurationTuringMachineTransition(MConfigurationTuringMachineTransition &&)=default
The default move constructor.
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition::EraseInstruction::operator!=
bool operator!=(const EraseInstruction &other) const
Un-equality comparison.
Definition: mConfigurationTuringMachineTransition.h:96
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition::Instruction
std::variant< MovementInstruction, EraseInstruction, WriteInstruction > Instruction
either a MovementInstruction, a EraseInstruction or a WriteInstruction.
Definition: mConfigurationTuringMachineTransition.h:134
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition::run_instruction
void run_instruction(StorageType &tape, const Instruction &instruction) const
Run a single instruction given a tape.
Definition: mConfigurationTuringMachineTransition.h:232
TuringSim::Transition::Turing::LocalTuringMachineTransition::SymbolType
SymbolType_ SymbolType
The type of symbols on the tape.
Definition: turingMachineTransition.h:37
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition::WriteInstruction::symbol
SymbolType symbol
The symbol to write.
Definition: mConfigurationTuringMachineTransition.h:110
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition::EraseInstruction::operator<
bool operator<(const EraseInstruction &other) const
Less than comparison. Strong ordering.
Definition: mConfigurationTuringMachineTransition.h:102
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition::operator=
MConfigurationTuringMachineTransition & operator=(const MConfigurationTuringMachineTransition &)=default
The default copy assignment operator.
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition::EraseInstruction
An instruction that erases the current symbol.
Definition: mConfigurationTuringMachineTransition.h:83
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition::MovementInstruction::operator!=
bool operator!=(const MovementInstruction &other) const
Un-equality comparison.
Definition: mConfigurationTuringMachineTransition.h:71
TuringSim::Transition::Turing::TuringMachineTransition< StateType_, SymbolType_, ApplyHelperType_, false >::StorageType
StorageType_ StorageType
The type of storage.
Definition: transition.h:77
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition::SymbolType
SymbolType_ SymbolType
The type of symbols on the tape.
Definition: turingMachineTransition.h:37
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition::run_instructions
void run_instructions(StorageType &tape, bool &running, const std::vector< Instruction > &instructions) const
Run a vector of instructions.
Definition: mConfigurationTuringMachineTransition.h:248
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition::MovementInstruction::operator==
bool operator==(const MovementInstruction &other) const
Equality comparison.
Definition: mConfigurationTuringMachineTransition.h:65
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition::WriteInstruction
An instruction that writes a symbol on the tape..
Definition: mConfigurationTuringMachineTransition.h:109
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition::MovementInstruction
An instruction that performs a move on the tape.
Definition: mConfigurationTuringMachineTransition.h:58
TuringSim::Transition::Turing::MConfigurationTuringMachineTransitionApplyHelper
std::map< T, std::shared_ptr< const State::MConfiguration::MConfiguration< T > >> MConfigurationTuringMachineTransitionApplyHelper
The helper of MConfigurationTuringMachineTransition<T, _, _>
Definition: mConfigurationTuringMachineTransition.h:14
TuringSim::Transition::Transition< std::shared_ptr< const State::MConfiguration::MConfiguration< T > >, Memory::TapeLike< hasHalfTape, T >, MConfigurationTuringMachineTransitionApplyHelper< T > >::StorageType
Memory::TapeLike< hasHalfTape, T > StorageType
The type of storage.
Definition: transition.h:77
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition::NodeStateType
NodeStateType_ NodeStateType
The type of the nodes in the m-configurations.
Definition: mConfigurationTuringMachineTransition.h:48
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