TuringSim
C++ framework to simulate abstract computing models
deterministicSimpleTuringMachine.h
1 #pragma once
2 
3 
4 #include <variant>
5 #include <machine/Turing/simpleTuringMachine.h>
6 #include <transition/Turing/simpleTuringMachineTransition.h>
7 
21  template<
22  typename StateType_,
23  typename SymbolType_,
24  bool hasHalfTape = false,
25  AcceptingStyle acceptingStyle = AcceptingStyle::NonAccepting
26  >
28  public SimpleTuringMachine<
29  StateType_,
30  SymbolType_,
31  true,
32  hasHalfTape,
33  acceptingStyle
34  >
35  {
37  public:
38  using typename SimpleTuringMachine_::StateType;
39  using typename SimpleTuringMachine_::SymbolType;
40  using typename SimpleTuringMachine_::HasHalfTape;
41  using typename SimpleTuringMachine_::IsAccepting;
42  using typename SimpleTuringMachine_::StorageType;
43  using typename SimpleTuringMachine_::IsAlternating;
44  using typename SimpleTuringMachine_::TransitionType;
45  using typename SimpleTuringMachine_::ApplyHelperType;
46  using typename SimpleTuringMachine_::IsDeterministic;
47  using typename SimpleTuringMachine_::TransitionContainer;
48  using typename SimpleTuringMachine_::InitialStateContainer;
49  using typename SimpleTuringMachine_::OptionalHelpedTransition;
50 
51  static_assert(std::is_same_v<StateType, typename TransitionType::StateType>);
52  static_assert(std::is_same_v<StateType, StateType_>);
53  static_assert(std::is_same_v<SymbolType, typename StorageType::SymbolType>);
54  static_assert(std::is_same_v<SymbolType, SymbolType_>);
55  static_assert(std::is_same_v<HasHalfTape, typename TransitionType::HasHalfTape>);
56  static_assert(HasHalfTape::value == hasHalfTape);
57  static_assert(std::is_same_v<StorageType, Memory::TapeLike<hasHalfTape, SymbolType>>);
58  static_assert(std::is_same_v<StorageType, typename TransitionType::StorageType>);
59  static_assert(std::is_same_v<ApplyHelperType, typename TransitionType::ApplyHelperType>);
60  static_assert(std::is_same_v<IsDeterministic, std::true_type>);
61  static_assert(std::is_same_v<TransitionContainer, std::set<std::pair<const TransitionType&, ApplyHelperType>>>);
62  static_assert(std::is_same_v<InitialStateContainer, std::set<StateType>>);
63  static_assert(std::is_same_v<OptionalHelpedTransition, std::optional<std::pair<const TransitionType&, ApplyHelperType>>>);
64 
80  virtual ~DeterministicSimpleTuringMachine() override = default;
81 
92  const StateType& initialState,
93  const std::set<StateType>& finalStates,
94  const std::set<TransitionType>& transitions
95  ) :
96  SimpleTuringMachine_(finalStates),
97  initialState(initialState),
98  transitions() {
99  for(const TransitionType& transition : transitions) {
100  this->transitions[transition.getPreState()].insert({transition.getPreSymbol(), transition});
101  }
102  }
103 
108  virtual StateType getInitialState() const noexcept override final {
109  return initialState;
110  }
111 
125  virtual OptionalHelpedTransition getMatchingTransitionFromCurrentCell(const StateType& state, const SymbolType& symbol) const noexcept override final {
126  try {
127  return {{transitions.at(state).at(symbol), std::monostate()}};
128  }
129  catch (std::out_of_range) {
130  return {std::nullopt};
131  }
132  }
133 
134  private:
135  StateType initialState;
136  std::map<StateType, std::map<SymbolType, TransitionType>> transitions;
137  };
138 }
TuringSim::Machine::Turing::DeterministicSimpleTuringMachine
The class to represent a deterministic simple turing machine.
Definition: deterministicSimpleTuringMachine.h:35
TuringSim::Memory::TapeLike
std::conditional_t< isHalfTape, HalfTape::HalfTape< SymbolType >, Tape::Tape< SymbolType > > TapeLike
Definition: tapeLike.h:12
TuringSim::Machine::Turing::DeterministicSimpleTuringMachine::DeterministicSimpleTuringMachine
DeterministicSimpleTuringMachine(const StateType &initialState, const std::set< StateType > &finalStates, const std::set< TransitionType > &transitions)
Build a DeterministicSimpleTuringMachine from an initial state, a set of transitions,...
Definition: deterministicSimpleTuringMachine.h:91
TuringSim::Machine::Turing::DeterministicSimpleTuringMachine::~DeterministicSimpleTuringMachine
virtual ~DeterministicSimpleTuringMachine() override=default
The default virtual destructor.
TuringSim::Machine::Turing::DeterministicSimpleTuringMachine::DeterministicSimpleTuringMachine
DeterministicSimpleTuringMachine(DeterministicSimpleTuringMachine &&)=default
The default move constructor.
TuringSim::Machine::Turing::DeterministicSimpleTuringMachine::DeterministicSimpleTuringMachine
DeterministicSimpleTuringMachine(const DeterministicSimpleTuringMachine &)=default
The default copy constructor.
TuringSim::Machine::Turing::DeterministicSimpleTuringMachine::getMatchingTransitionFromCurrentCell
virtual OptionalHelpedTransition getMatchingTransitionFromCurrentCell(const StateType &state, const SymbolType &symbol) const noexcept override final
Returns the matching transition, if any, and its helper from a state and the current symbol.
Definition: deterministicSimpleTuringMachine.h:125
TuringSim::Machine::Turing::DeterministicSimpleTuringMachine::getInitialState
virtual StateType getInitialState() const noexcept override final
Return the initial state of the Turing machine.
Definition: deterministicSimpleTuringMachine.h:108
TuringSim::Machine::AcceptingStyle
AcceptingStyle
Whether the machine is accepting, alternating or nothing.
Definition: acceptingMachine.h:11
TuringSim::Machine::Turing::SimpleTuringMachine
The class to represent a simple turing machine.
Definition: simpleTuringMachine.h:40
TuringSim::Machine::Turing::DeterministicSimpleTuringMachine::DeterministicSimpleTuringMachine
DeterministicSimpleTuringMachine()=delete
The default deleted constructor.
TuringSim::Machine::Turing::DeterministicSimpleTuringMachine::operator=
DeterministicSimpleTuringMachine & operator=(DeterministicSimpleTuringMachine &&)=default
The default move assignment operator.
TuringSim::Machine::Turing
Namespace of Turing machines, that is whose storage is a tape.
Definition: deterministicSimpleTuringMachine.h:8
TuringSim::Machine::Turing::DeterministicSimpleTuringMachine::operator=
DeterministicSimpleTuringMachine & operator=(const DeterministicSimpleTuringMachine &)=default
The default copy assignment operator.