TuringSim
C++ framework to simulate abstract computing models
turingStyleMConfigurationTuringMachineTransition.h
1 #pragma once
2 
3 #include <utils/compare.h>
4 #include <utils/printer.h>
5 #include <symbol/turingMachineSymbolPattern.h>
6 #include <transition/Turing/localTuringMachineTransition.h>
7 #include <transition/Turing/mConfigurationTuringMachineTransition.h>
8 
10 
16  template<typename T, bool hasHalfTape>
18  : public MConfigurationTuringMachineTransition<T, T, hasHalfTape>
19  {
21  public:
30 
35 
41 
47  struct DynamicWrite {
54  constexpr bool operator==(const DynamicWrite& other) const { return symbol_key == other.symbol_key; }
59  constexpr bool operator!=(const DynamicWrite& other) const { return symbol_key != other.symbol_key; }
64  constexpr bool operator<(const DynamicWrite& other) const { return symbol_key < other.symbol_key; }
65  };
66 
71  typedef std::variant<ConstantInstruction, DynamicWrite> Instruction;
72 
73  static_assert(std::is_same_v<T, SymbolType>);
74  static_assert(std::is_same_v<T, NodeStateType>);
75  static_assert(std::is_same_v<StateType, std::shared_ptr<const State::MConfiguration::MConfiguration<T>>>);
76  static_assert(std::is_same_v<ApplyHelperType, std::map<T, std::shared_ptr<const State::MConfiguration::MConfiguration<T>>>>);
77  static_assert(std::is_same_v<StorageType, Memory::TapeLike<hasHalfTape, SymbolType>>);
78 
86  template <typename CharT = char, typename Traits = std::char_traits<CharT>>
87  friend std::basic_ostream<CharT, Traits>& operator<<(std::basic_ostream<CharT, Traits>& os, const DynamicWrite& i) {
88  os << "dyn_write(" << i.symbol_key << ")";
89  return os;
90  }
91 
99  template <typename CharT = char, typename Traits = std::char_traits<CharT>>
100  friend std::basic_ostream<CharT, Traits>& operator<<(std::basic_ostream<CharT, Traits>& os, const Instruction& instruction) {
101  using Utils::Visitor;
102  std::visit(
103  Visitor{
104  [&os](const ConstantInstruction& i) { os << i; },
105  [&os](const DynamicWrite& i) { os << i; },
106  },
107  instruction);
108  return os;
109  }
110 
116  template <typename CharT = char, typename Traits = std::char_traits<CharT>>
117  std::function<std::basic_ostream<CharT, Traits>&(std::basic_ostream<CharT, Traits>&)> debug() const {
118  return [this](std::basic_ostream<CharT, Traits>& os) -> std::basic_ostream<CharT, Traits>& {
119  using Utils::Debug::operator<<;
120  os << "(" << preStatePattern.debug() << ", " << preSymbolPattern << ", " << symbolPlaceHolder << ") -> "
121  << "(" << Utils::Debug::debug(instructions) << ", " << postStatePattern.debug() << ")";
122  return os;
123  };
124  }
125 
126  template <typename U, bool hT, typename CharT, typename Traits>
127  friend std::basic_ostream<CharT, Traits>& operator<<(std::basic_ostream<CharT, Traits>&, const TuringStyleMConfigurationTuringMachineTransition<U, hT>&);
128 
129 
133 
143  const std::shared_ptr<const State::MConfiguration::MConfiguration<NodeStateType>>& preStatePattern,
144  const SymbolPattern& preSymbolPattern,
145  const std::vector<Instruction>& instructions,
146  const NodeStateType& symbolPlaceHolder,
147  const std::shared_ptr<const State::MConfiguration::MConfiguration<NodeStateType>>& postStatePattern);
148 
151 
154 
159 
164 
167 
175  virtual std::optional<ApplyHelperType> matchFromCurrentCell(const StateType& state, const SymbolType& symbol) const override;
176 
189  virtual StateType apply(const StateType& state, StorageType& storage, ApplyHelperType&& helper, bool& running) const override;
190 
196 
201  return preStatePattern;
202  }
203 
209 
215  return compare(other) < 0;
216  }
222  return compare(other) == 0;
223  }
224  private:
225  static constexpr bool matchSymbolPattern(const SymbolPattern&, const SubstitutionType&, const SymbolType&);
226  static constexpr ConstantInstruction generateConstantInstruction(const Instruction&, const SubstitutionType&);
227  static constexpr std::vector<ConstantInstruction> generateConstantInstructions(const std::vector<Instruction>&, const SubstitutionType&);
228 
229  std::shared_ptr<const State::MConfiguration::MConfiguration<NodeStateType>> preStatePattern;
230  SymbolPattern preSymbolPattern;
231  std::vector<Instruction> instructions;
232  std::shared_ptr<const State::MConfiguration::MConfiguration<NodeStateType>> postStatePattern;
233  NodeStateType symbolPlaceHolder;
234  };
235 
245  template <typename U, bool hT, typename CharT = char, typename Traits = std::char_traits<CharT>>
246  std::basic_ostream<CharT, Traits>& operator<<(std::basic_ostream<CharT, Traits>& os, const TuringStyleMConfigurationTuringMachineTransition<U, hT>& transition) {
247  using Utils::Debug::operator<<;
248  os
249  << "(" << transition.preStatePattern << ", " << transition.preSymbolPattern << ", " << transition.symbolPlaceHolder << ") -> "
250  << "(" << Utils::Debug::debug(transition.instructions) << ", " << transition.postStatePattern << ")";
251  return os;
252  }
253 
254  template<typename T, bool hT>
255  constexpr bool TuringStyleMConfigurationTuringMachineTransition<T, hT>::matchSymbolPattern(
256  const SymbolPattern& pattern,
257  const SubstitutionType& substitution,
258  const SymbolType& symbol) {
259  bool matched = pattern.match(symbol, substitution);
260  return matched;
261  }
262 
263  template<typename T, bool hT>
264  constexpr std::vector<typename TuringStyleMConfigurationTuringMachineTransition<T, hT>::ConstantInstruction>
265  TuringStyleMConfigurationTuringMachineTransition<T, hT>::generateConstantInstructions(
266  const std::vector<Instruction>& instructions,
267  const SubstitutionType& substitution) {
268  std::vector<ConstantInstruction> is;
269  std::transform(
270  instructions.begin(),
271  instructions.end(),
272  std::back_inserter(is),
273  [&substitution](const Instruction& i) { return generateConstantInstruction(i, substitution); }
274  );
275  return is;
276  }
277 
278  template<typename T, bool hT>
280  TuringStyleMConfigurationTuringMachineTransition<T, hT>::generateConstantInstruction(
281  const Instruction& instruction,
282  const SubstitutionType& substitution) {
283  using Utils::Visitor;
284  ConstantInstruction i =
285  std::visit(
286  Visitor{
287  [](const ConstantInstruction& i) { return i; },
288  [&substitution](const DynamicWrite& i) -> ConstantInstruction {
289  typename SubstitutionType::const_iterator it = substitution.find(i.symbol_key);
290  if(it == substitution.end()) {
291  using Utils::Debug::operator<<;
292  std::ostringstream ss;
293  ss << "Unable to transform dynamic write into constant write" << std::endl;
294  ss << " Symbol key: " << Utils::Debug::debug(i.symbol_key) << std::endl;
295  ss << " Substitution: " << Utils::Debug::debug(substitution);
296  throw std::runtime_error(ss.str());
297  }
298  std::shared_ptr<const State::MConfiguration::MConfiguration<T>> symbol = it->second;
299  typename MConfigurationTuringMachineTransition_::WriteInstruction wi {symbol->getNode()};
300  return wi;
301  },
302  },
303  instruction
304  );
305  return i;
306  }
307 
308  template<typename T, bool hT>
309  std::optional<typename TuringStyleMConfigurationTuringMachineTransition<T, hT>::ApplyHelperType>
311  const SymbolType& symbol) const {
312  SubstitutionType substitution;
313  try {
314  std::shared_ptr<const State::MConfiguration::MConfiguration<T>> symbolAsState = std::make_shared<const State::MConfiguration::MConfiguration<T>>(symbol);
315  std::shared_ptr<const State::MConfiguration::MConfiguration<T>> preStatePatternWithoutPlaceholder =
316  State::MConfiguration::MConfiguration<T>::applySubstitution(preStatePattern, {{symbolPlaceHolder, symbolAsState}});
317  substitution = preStatePatternWithoutPlaceholder->unifyWithMConf(m_conf);
318  }
320  return std::optional<ApplyHelperType>(std::nullopt);
321  }
322 
323  if(matchSymbolPattern(preSymbolPattern, substitution, symbol)) {
324  return std::optional<ApplyHelperType>(substitution);
325  }
326  return std::optional<ApplyHelperType>(std::nullopt);
327  }
328 
329  template<typename T, bool hT>
332  const StateType&,
333  StorageType& tape,
334  ApplyHelperType&& substitution,
335  bool& running) const {
336  SymbolType preSymbol = tape.read();
337  typename ApplyHelperType::const_iterator it = substitution.find(symbolPlaceHolder);
338  StateType preSymbolAsMConf = std::make_shared<const State::MConfiguration::MConfiguration<T>>(preSymbol);
339  if (it == substitution.end()) {
340  substitution.insert({symbolPlaceHolder, preSymbolAsMConf});
341  }
342  StateType postState = State::MConfiguration::MConfiguration<SymbolType>::applySubstitution(postStatePattern, substitution);
343 
344  std::vector<ConstantInstruction> constant_instructions = generateConstantInstructions(instructions, substitution);
345  MConfigurationTuringMachineTransition_::run_instructions(tape, running, constant_instructions);
346  return postState;
347  }
348 
349  template<typename T, bool hT>
351  const std::shared_ptr<const State::MConfiguration::MConfiguration<NodeStateType>>& preStatePattern,
352  const SymbolPattern& preSymbolPattern,
353  const std::vector<Instruction>& instructions,
354  const NodeStateType& symbolPlaceHolder,
355  const std::shared_ptr<const State::MConfiguration::MConfiguration<NodeStateType>>& postStatePattern
356  ) :
357  preStatePattern(preStatePattern), preSymbolPattern(preSymbolPattern), instructions(instructions),
358  postStatePattern(postStatePattern), symbolPlaceHolder(symbolPlaceHolder) {
359  }
360 
361  template<typename T, bool hT>
366  using Utils::Visitor;
367  std::optional<AlphaRelation> preStateRelation_o = preStatePattern->isAlphaEquivalent(other.preStatePattern);
368  std::optional<AlphaRelation> postStateRelation_o = postStatePattern->isAlphaEquivalent(other.postStatePattern);
369 
370  if(!preStateRelation_o || !postStateRelation_o) {
371  return false;
372  }
373 
374  AlphaRelation preStateRelation = *preStateRelation_o;
375  AlphaRelation postStateRelation = *postStateRelation_o;
376 
377  for(const std::pair<T, T>& binding : preStateRelation.first) {
378  typename AlphaRewriting::iterator it = postStateRelation.first.find(binding.first);
379  if(it != postStateRelation.first.end()) {
380  if(it->second != binding.second) {
381  return false;
382  }
383  }
384  }
385 
386  if(typename AlphaRewriting::iterator it = postStateRelation.first.find(symbolPlaceHolder);
387  it != postStateRelation.first.end()) {
388  if (it->second != other.symbolPlaceHolder) {
389  return false;
390  }
391  }
392 
393  if(!preSymbolPattern.isAlphaEquivalent(preSymbolPattern, preStateRelation.first)) {
394  return false;
395  }
396 
397  if(instructions.size() != other.instructions.size()) {
398  return false;
399  }
400 
401  for(typename std::vector<Instruction>::const_iterator it = instructions.begin(),
402  it2 = other.instructions.begin(); it != instructions.end(); ++it, ++it2) {
403  Instruction instruction = *it;
404  Instruction otherInstruction = *it2;
405 
406  if(instruction.index() != otherInstruction.index()) {
407  return false;
408  }
409  else if(std::holds_alternative<DynamicWrite>(instruction)) {
410  DynamicWrite dynamicWrite = std::get<DynamicWrite>(instruction);
411  DynamicWrite otherDynamicWrite = std::get<DynamicWrite>(otherInstruction);
412  if(preStateRelation.first[dynamicWrite.symbol_key] != otherDynamicWrite.symbol_key) {
413  return false;
414  }
415  }
416  else if(instruction != otherInstruction) {
417  return false;
418  }
419  }
420 
421  return true;
422  }
423 
424  template<typename T, bool hT>
426  int cmp;
427  cmp = preStatePattern->compare(*other.preStatePattern);
428  if(cmp != 0) {
429  return cmp;
430  }
431  cmp = Utils::compare(preSymbolPattern, other.preSymbolPattern);
432  if(cmp != 0) {
433  return cmp;
434  }
435  cmp = Utils::compare(instructions, other.instructions);
436  if(cmp != 0) {
437  return cmp;
438  }
439  cmp = postStatePattern->compare(*other.postStatePattern);
440  if(cmp != 0) {
441  return cmp;
442  }
443  cmp = Utils::compare(symbolPlaceHolder, other.symbolPlaceHolder);
444  return cmp;
445  }
446 }
TuringSim::State::MConfiguration::MConfiguration::AlphaRewriting
std::map< NodeType, NodeType > AlphaRewriting
The type of rewriting in an alpha-equivalence, in one direction only.
Definition: mConfiguration.h:41
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< std::string > >, Memory::TapeLike< hasHalfTape, std::string >, MConfigurationTuringMachineTransitionApplyHelper< std::string > >::ApplyHelperType
MConfigurationTuringMachineTransitionApplyHelper< std::string > 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::TuringStyleMConfigurationTuringMachineTransition::operator<<
friend std::basic_ostream< CharT, Traits > & operator<<(std::basic_ostream< CharT, Traits > &os, const DynamicWrite &i)
Debug printer for dynamic write.
Definition: turingStyleMConfigurationTuringMachineTransition.h:87
TuringSim::Transition::Turing::TuringStyleMConfigurationTuringMachineTransition::~TuringStyleMConfigurationTuringMachineTransition
virtual ~TuringStyleMConfigurationTuringMachineTransition() override=default
The default virtual destructor.
TuringSim::State::MConfiguration::MConfiguration< T >
TuringSim::Transition::Turing::TuringStyleMConfigurationTuringMachineTransition::SymbolPattern
Symbol::TuringStyleMixedSymbolPattern< T > SymbolPattern
The type of symbol patterns.
Definition: turingStyleMConfigurationTuringMachineTransition.h:34
TuringSim::Transition::Turing::TuringStyleMConfigurationTuringMachineTransition::DynamicWrite
An instruction that writes a single symbol identified by a key in a substitution.
Definition: turingStyleMConfigurationTuringMachineTransition.h:47
TuringSim::Memory::TapeLike
std::conditional_t< isHalfTape, HalfTape::HalfTape< SymbolType >, Tape::Tape< SymbolType > > TapeLike
Definition: tapeLike.h:12
TuringSim::Transition::Turing::TuringStyleMConfigurationTuringMachineTransition::operator<<
friend std::basic_ostream< CharT, Traits > & operator<<(std::basic_ostream< CharT, Traits > &, const TuringStyleMConfigurationTuringMachineTransition< U, hT > &)
Debug printer of transitions.
Definition: turingStyleMConfigurationTuringMachineTransition.h:246
TuringSim::Transition::Turing
Transitions for Turing machines.
Definition: localTuringMachineTransition.h:6
TuringSim::Transition::Transition< std::shared_ptr< const State::MConfiguration::MConfiguration< std::string > >, Memory::TapeLike< hasHalfTape, std::string >, MConfigurationTuringMachineTransitionApplyHelper< std::string > >::StateType
std::shared_ptr< const State::MConfiguration::MConfiguration< std::string > > StateType
The type of states.
Definition: transition.h:72
TuringSim::Transition::Turing::TuringStyleMConfigurationTuringMachineTransition::TuringStyleMConfigurationTuringMachineTransition
TuringStyleMConfigurationTuringMachineTransition(const TuringStyleMConfigurationTuringMachineTransition &)=default
The default copy constructor.
TuringSim::Transition::Turing::TuringStyleMConfigurationTuringMachineTransition::getPreStatePattern
const StateType getPreStatePattern() const
Get the pre-state pattern for optimized storage.
Definition: turingStyleMConfigurationTuringMachineTransition.h:200
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition< T, T, hasHalfTape >::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::TuringStyleMConfigurationTuringMachineTransition::operator<
bool operator<(const TuringStyleMConfigurationTuringMachineTransition &other) const
Less than. Strong ordering.
Definition: turingStyleMConfigurationTuringMachineTransition.h:214
TuringSim::Transition::Turing::TuringStyleMConfigurationTuringMachineTransition::apply
virtual StateType apply(const StateType &state, StorageType &storage, ApplyHelperType &&helper, bool &running) const override
Apply a previously matching transition and return the new state.
Definition: turingStyleMConfigurationTuringMachineTransition.h:331
TuringSim::Transition::Turing::TuringMachineTransition< std::shared_ptr< const State::MConfiguration::MConfiguration< T > >, T, MConfigurationTuringMachineTransitionApplyHelper< T >, hasHalfTape >::StateType
std::shared_ptr< const State::MConfiguration::MConfiguration< T > > StateType
The type of states.
Definition: transition.h:72
TuringSim::State::MConfiguration::MConfiguration::AlphaRelation
std::pair< AlphaRewriting, AlphaRewriting > AlphaRelation
The type of bi-directional alpha-equivalence.
Definition: mConfiguration.h:46
TuringSim::Transition::Turing::TuringMachineTransition< std::shared_ptr< const State::MConfiguration::MConfiguration< T > >, T, MConfigurationTuringMachineTransitionApplyHelper< T >, hasHalfTape >::ApplyHelperType
MConfigurationTuringMachineTransitionApplyHelper< T > ApplyHelperType
The type of apply helpers.
Definition: transition.h:82
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition< T, T, hasHalfTape >::SubstitutionType
ApplyHelperType SubstitutionType
The type of substitutions, same as apply helper.
Definition: mConfigurationTuringMachineTransition.h:53
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition< T, T, hasHalfTape >::Movement
StorageType_::Movement Movement
The type of movement on the tape.
Definition: turingMachineTransition.h:42
TuringSim::Transition::Turing::TuringStyleMConfigurationTuringMachineTransition::TuringStyleMConfigurationTuringMachineTransition
TuringStyleMConfigurationTuringMachineTransition(TuringStyleMConfigurationTuringMachineTransition &&)=default
The default move constructor.
TuringSim::Transition::Turing::TuringStyleMConfigurationTuringMachineTransition::DynamicWrite::operator<
constexpr bool operator<(const DynamicWrite &other) const
Less than operator. Strong ordering.
Definition: turingStyleMConfigurationTuringMachineTransition.h:64
TuringSim::Transition::Turing::TuringStyleMConfigurationTuringMachineTransition::operator<<
friend std::basic_ostream< CharT, Traits > & operator<<(std::basic_ostream< CharT, Traits > &os, const Instruction &instruction)
Debug printer of transitions.
Definition: turingStyleMConfigurationTuringMachineTransition.h:100
TuringSim::Transition::Turing::TuringStyleMConfigurationTuringMachineTransition::isAlphaEquivalent
bool isAlphaEquivalent(const TuringStyleMConfigurationTuringMachineTransition &other) const
Test if *this is alpha-equivalent to other.
Definition: turingStyleMConfigurationTuringMachineTransition.h:362
TuringSim::Transition::Turing::TuringStyleMConfigurationTuringMachineTransition::DynamicWrite::symbol_key
T symbol_key
The key of the symbol to write.
Definition: turingStyleMConfigurationTuringMachineTransition.h:48
TuringSim::Transition::Turing::TuringStyleMConfigurationTuringMachineTransition::ConstantInstruction
MConfigurationTuringMachineTransition_::Instruction ConstantInstruction
The type of instructions we can run without context. Dynamic instruction will be translated to consta...
Definition: turingStyleMConfigurationTuringMachineTransition.h:40
TuringSim::Symbol::TuringStyleMixedSymbolPattern< T >
TuringSim::State::MConfiguration::NoUnificationException
Exception launched when we try to unify two incompatibles MConfiguration.
Definition: mConfiguration.h:407
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition< std::string, std::string, hasHalfTape >::Instruction
std::variant< MovementInstruction, EraseInstruction, WriteInstruction > Instruction
either a MovementInstruction, a EraseInstruction or a WriteInstruction.
Definition: mConfigurationTuringMachineTransition.h:134
TuringSim::Transition::Turing::TuringStyleMConfigurationTuringMachineTransition::TuringStyleMConfigurationTuringMachineTransition
TuringStyleMConfigurationTuringMachineTransition()=delete
Build a TuringStyleMConfigurationTuringMachineTransition from nothing is meaningless.
TuringSim::Transition::Turing::TuringStyleMConfigurationTuringMachineTransition::operator==
bool operator==(const TuringStyleMConfigurationTuringMachineTransition &other) const
Equality operator.
Definition: turingStyleMConfigurationTuringMachineTransition.h:221
TuringSim::Transition::Turing::TuringStyleMConfigurationTuringMachineTransition
Transitions as we find in 1936 Turing's paper.
Definition: turingStyleMConfigurationTuringMachineTransition.h:19
TuringSim::Transition::Turing::TuringStyleMConfigurationTuringMachineTransition::matchFromCurrentCell
virtual std::optional< ApplyHelperType > matchFromCurrentCell(const StateType &state, const SymbolType &symbol) const override
Test whether the transition matches a configuration. Returned optional is empty iff the transition do...
Definition: turingStyleMConfigurationTuringMachineTransition.h:310
TuringSim::Transition::Turing::LocalTuringMachineTransition< std::shared_ptr< const State::MConfiguration::MConfiguration< std::string > >, std::string, MConfigurationTuringMachineTransitionApplyHelper< std::string >, hasHalfTape >::SymbolType
std::string SymbolType
The type of symbols on the tape.
Definition: turingMachineTransition.h:37
TuringSim::Transition::Turing::TuringStyleMConfigurationTuringMachineTransition::DynamicWrite::operator==
constexpr bool operator==(const DynamicWrite &other) const
Equality operator.
Definition: turingStyleMConfigurationTuringMachineTransition.h:54
TuringSim::Transition::Turing::TuringStyleMConfigurationTuringMachineTransition::DynamicWrite::operator!=
constexpr bool operator!=(const DynamicWrite &other) const
Un-equality operator.
Definition: turingStyleMConfigurationTuringMachineTransition.h:59
TuringSim::Transition::Turing::operator<<
std::basic_ostream< CharT, Traits > & operator<<(std::basic_ostream< CharT, Traits > &os, const TuringStyleMConfigurationTuringMachineTransition< U, hT > &transition)
Debug printer of transitions.
Definition: turingStyleMConfigurationTuringMachineTransition.h:246
TuringSim::Transition::Turing::TuringMachineTransition< std::shared_ptr< const State::MConfiguration::MConfiguration< T > >, T, MConfigurationTuringMachineTransitionApplyHelper< T >, hasHalfTape >::StorageType
StorageType_ StorageType
The type of storage.
Definition: transition.h:77
TuringSim::Utils::compare
int compare(const T &lhs, const T &rhs)
To compare things.
Definition: compare.h:47
TuringSim::Transition::Turing::TuringStyleMConfigurationTuringMachineTransition::operator=
TuringStyleMConfigurationTuringMachineTransition & operator=(TuringStyleMConfigurationTuringMachineTransition &&)=default
The default move assignment operator.
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition< T, T, hasHalfTape >::SymbolType
T SymbolType
The type of symbols on the tape.
Definition: turingMachineTransition.h:37
TuringSim::Transition::Turing::TuringStyleMConfigurationTuringMachineTransition::operator=
TuringStyleMConfigurationTuringMachineTransition & operator=(const TuringStyleMConfigurationTuringMachineTransition &)=default
The default copy assignment operator.
TuringSim::Utils::Debug::debug
std::function< std::basic_ostream< CharT, Traits > &(std::basic_ostream< CharT, Traits > &)> debug(const T &s)
Generic debug printing function.
Definition: printer.h:34
TuringSim::Transition::Turing::TuringStyleMConfigurationTuringMachineTransition::compare
int compare(const TuringStyleMConfigurationTuringMachineTransition &other) const
Compare two transitions. OCaml style, waiting for <=>. Strong ordering.
Definition: turingStyleMConfigurationTuringMachineTransition.h:425
TuringSim::Transition::Turing::TuringStyleMConfigurationTuringMachineTransition::debug
std::function< std::basic_ostream< CharT, Traits > &(std::basic_ostream< CharT, Traits > &)> debug() const
Debug printer of transitions.
Definition: turingStyleMConfigurationTuringMachineTransition.h:117
TuringSim::Transition::Transition< std::shared_ptr< const State::MConfiguration::MConfiguration< std::string > >, Memory::TapeLike< hasHalfTape, std::string >, MConfigurationTuringMachineTransitionApplyHelper< std::string > >::StorageType
Memory::TapeLike< hasHalfTape, std::string > StorageType
The type of storage.
Definition: transition.h:77
TuringSim::Transition::Turing::TuringStyleMConfigurationTuringMachineTransition::Instruction
std::variant< ConstantInstruction, DynamicWrite > Instruction
Either a constant instruction that can be executed without context, or a dynamic instruction (dynamic...
Definition: turingStyleMConfigurationTuringMachineTransition.h:71
TuringSim::Transition::Turing::TuringStyleMConfigurationTuringMachineTransition::TuringStyleMConfigurationTuringMachineTransition
TuringStyleMConfigurationTuringMachineTransition(const std::shared_ptr< const State::MConfiguration::MConfiguration< NodeStateType >> &preStatePattern, const SymbolPattern &preSymbolPattern, const std::vector< Instruction > &instructions, const NodeStateType &symbolPlaceHolder, const std::shared_ptr< const State::MConfiguration::MConfiguration< NodeStateType >> &postStatePattern)
Regular constructor.
Definition: turingStyleMConfigurationTuringMachineTransition.h:350
TuringSim::Transition::Turing::MConfigurationTuringMachineTransition< T, T, hasHalfTape >::NodeStateType
T NodeStateType
The type of the nodes in the m-configurations.
Definition: mConfigurationTuringMachineTransition.h:48
TuringSim::State::MConfiguration::MConfiguration::applySubstitution
static std::shared_ptr< const MConfiguration< NodeType > > applySubstitution(std::shared_ptr< const MConfiguration< NodeType >> pattern, const Unification &subs)
Apply a substitution to the tree.
Definition: mConfiguration.h:660