TuringSim
C++ framework to simulate abstract computing models
turingMachine.h
1 #pragma once
2 
3 #include <memory/tapeLike.h>
4 #include <machine/machine.h>
5 #include <transition/Turing/turingMachineTransition.h>
6 
27  template <
28  typename TransitionType_,
29  bool deterministic,
30  AcceptingStyle acceptingStyle,
31  template <typename...> class TransitionContainer_ = std::vector,
32  template <typename...> class InitialStateContainer_ = std::vector>
33  class TuringMachine : public Machine<TransitionType_, deterministic, acceptingStyle, TransitionContainer_, InitialStateContainer_>
34  {
36  public:
37  using typename Machine_::StateType;
38  using typename Machine_::IsAccepting;
39  using typename Machine_::StorageType;
40  using typename Machine_::IsAlternating;
41  using typename Machine_::TransitionType;
42  using typename Machine_::ApplyHelperType;
43  using typename Machine_::IsDeterministic;
44  using typename Machine_::TransitionContainer;
45  using typename Machine_::InitialStateContainer;
46  using typename Machine_::OptionalHelpedTransition;
47 
51  typedef typename StorageType::SymbolType SymbolType;
52 
59  typedef typename TransitionType::HasHalfTape HasHalfTape;
60 
61  static_assert(std::is_same_v<StateType, typename TransitionType::StateType>);
62  static_assert(std::is_same_v<StorageType, typename TransitionType::StorageType>);
63  static_assert(std::is_same_v<TransitionType, TransitionType_>);
64  static_assert(std::is_same_v<ApplyHelperType, typename TransitionType::ApplyHelperType>);
65  static_assert(std::is_same_v<IsDeterministic, std::integral_constant<bool, deterministic>>);
66  static_assert(std::is_same_v<TransitionContainer, TransitionContainer_<std::pair<const TransitionType&, ApplyHelperType>>>);
67  static_assert(std::is_same_v<InitialStateContainer, InitialStateContainer_<StateType>>);
68  static_assert(std::is_same_v<OptionalHelpedTransition, std::optional<std::pair<const TransitionType&, ApplyHelperType>>>);
69 
70  static_assert(std::is_same_v<StorageType, Memory::TapeLike<HasHalfTape::value, SymbolType>>,
71  "StorageType should be TapeLike.");
73  "TransitionType must be a derived class of TuringMachineTransition");
74 
76  TuringMachine() = default;
78  TuringMachine(const TuringMachine&) = default;
90  virtual ~TuringMachine() override = default;
91 
105  virtual bool isHaltingState(const StateType& state) const noexcept = 0;
106 
107 #pragma clang diagnostic push
108 #pragma clang diagnostic ignored "-Wunused-parameter"
109 
123  virtual bool isHaltingConfiguration(const StateType& state, const StorageType& storage) const noexcept override final {
124  return this->isHaltingState(state);
125  }
126 #pragma clang diagnostic pop
127  };
128 }
TuringSim::Machine::Turing::TuringMachine::isHaltingConfiguration
virtual bool isHaltingConfiguration(const StateType &state, const StorageType &storage) const noexcept override final
Test if a given configuration is a halting one.
Definition: turingMachine.h:123
TuringSim::Machine::Turing::TuringMachine::operator=
TuringMachine & operator=(TuringMachine &&)=default
The default move assignment operator.
TuringSim::Machine::Turing::TuringMachine::operator=
TuringMachine & operator=(const TuringMachine &)=default
The default copy assignment operator.
TuringSim::Memory::TapeLike
std::conditional_t< isHalfTape, HalfTape::HalfTape< SymbolType >, Tape::Tape< SymbolType > > TapeLike
Definition: tapeLike.h:12
TuringSim::Machine::Turing::TuringMachine::TuringMachine
TuringMachine(const TuringMachine &)=default
The default copy constructor.
TuringSim::Machine::Turing::TuringMachine::~TuringMachine
virtual ~TuringMachine() override=default
The default virtual destructor.
TuringSim::Machine::Turing::TuringMachine::TuringMachine
TuringMachine()=default
The default constructor.
TuringSim::Machine::Turing::TuringMachine
The class to represent a Turing machine.
Definition: turingMachine.h:34
TuringSim::Machine::Turing::TuringMachine::SymbolType
StorageType::SymbolType SymbolType
The type of the symbols on the tape.
Definition: turingMachine.h:51
TuringSim::Machine::AcceptingStyle
AcceptingStyle
Whether the machine is accepting, alternating or nothing.
Definition: acceptingMachine.h:11
TuringSim::Machine::Turing::TuringMachine::isHaltingState
virtual bool isHaltingState(const StateType &state) const noexcept=0
Test if a given state is a halting one.
TuringSim::Machine::Turing::TuringMachine::TuringMachine
TuringMachine(TuringMachine &&)=default
The default move constructor.
TuringSim::Machine::Turing::TuringMachine::HasHalfTape
TransitionType::HasHalfTape HasHalfTape
Whether the tape is a Tape or a HalfTape.
Definition: turingMachine.h:59
TuringSim::Transition::Turing::TuringMachineTransition
Base class for Turing machine transitions.
Definition: turingMachineTransition.h:26
TuringSim::Machine::Turing
Namespace of Turing machines, that is whose storage is a tape.
Definition: deterministicSimpleTuringMachine.h:8
TuringSim::Machine::Machine
Base class for machines.
Definition: machine.h:33