TuringSim
C++ framework to simulate abstract computing models
deterministicTuringStyleMConfigurationTuringMachine.h
1 #pragma once
2 
3 #include <machine/Turing/turingStyleMConfigurationTuringMachine.h>
4 
19  template <
20  typename SymbolType_,
21  bool hasHalfTape = false,
22  AcceptingStyle acceptingStyle = AcceptingStyle::NonAccepting
23  >
24  class DeterministicTuringStyleMConfigurationTuringMachine : public TuringStyleMConfigurationTuringMachine<SymbolType_, true, hasHalfTape, acceptingStyle> {
26  public:
27  using typename TuringStyleMConfigurationTuringMachine_::StateType;
28  using typename TuringStyleMConfigurationTuringMachine_::SymbolType;
29  using typename TuringStyleMConfigurationTuringMachine_::HasHalfTape;
30  using typename TuringStyleMConfigurationTuringMachine_::IsAccepting;
31  using typename TuringStyleMConfigurationTuringMachine_::StorageType;
32  using typename TuringStyleMConfigurationTuringMachine_::IsAlternating;
33  using typename TuringStyleMConfigurationTuringMachine_::TransitionType;
34  using typename TuringStyleMConfigurationTuringMachine_::ApplyHelperType;
35  using typename TuringStyleMConfigurationTuringMachine_::IsDeterministic;
36  using typename TuringStyleMConfigurationTuringMachine_::TransitionContainer;
37  using typename TuringStyleMConfigurationTuringMachine_::InitialStateContainer;
38  using typename TuringStyleMConfigurationTuringMachine_::OptionalHelpedTransition;
39 
40  static_assert(std::is_same_v<StateType, typename TransitionType::StateType>);
41  static_assert(std::is_same_v<StateType, std::shared_ptr<const State::MConfiguration::MConfiguration<SymbolType>>>);
42  static_assert(std::is_same_v<SymbolType, typename StorageType::SymbolType>);
43  static_assert(std::is_same_v<SymbolType, SymbolType_>);
44  static_assert(std::is_same_v<HasHalfTape, typename TransitionType::HasHalfTape>);
45  static_assert(HasHalfTape::value == hasHalfTape);
46  static_assert(std::is_same_v<StorageType, Memory::TapeLike<hasHalfTape, SymbolType>>);
47  static_assert(std::is_same_v<StorageType, typename TransitionType::StorageType>);
49  static_assert(std::is_same_v<ApplyHelperType, typename TransitionType::ApplyHelperType>);
50  static_assert(std::is_same_v<IsDeterministic, std::true_type>);
51  static_assert(std::is_same_v<TransitionContainer, std::set<std::pair<const TransitionType&, ApplyHelperType>>>);
52  static_assert(std::is_same_v<InitialStateContainer, std::set<StateType>>);
53  static_assert(std::is_same_v<OptionalHelpedTransition, std::optional<std::pair<const TransitionType&, ApplyHelperType>>>);
54 
71 
82  const StateType& initialState,
83  const std::set<State::MConfiguration::MConfiguration<SymbolType>>& finalStates,
84  const std::set<TransitionType>& transitions
85  ) :
87  initialState(initialState),
88  transitions()
89  {
90  for(const TransitionType& transition: transitions) {
91  if(transition.getPreStatePattern()->isVariable()) {
92  this->pureVariablePreStatePatternTransitions.insert(transition);
93  }
94  else{
95  this->transitions.insert(*transition.getPreStatePattern(), transition);
96  }
97  }
98  }
99 
100 
105  virtual StateType getInitialState() const noexcept override final {
106  return initialState;
107  }
108 
122  virtual OptionalHelpedTransition getMatchingTransitionFromCurrentCell(const StateType& state, const SymbolType& symbol) const noexcept override final {
123  try {
124  const std::map<State::MConfiguration::MConfiguration<SymbolType>, std::set<TransitionType>>& candidates = transitions.getCandidates(*state);
125  std::set<std::pair<const TransitionType&, ApplyHelperType>> matchingTransitions;
126  for(const auto& [_pattern, transitions]: candidates) {
127  for(const TransitionType& transition: transitions) {
128  std::optional<ApplyHelperType> helper = transition.matchFromCurrentCell(state, symbol);
129  if(helper) {
130  return {{transition, *helper}};
131  }
132  }
133  }
134  for(const TransitionType& transition: pureVariablePreStatePatternTransitions) {
135  std::optional<ApplyHelperType> helper = transition.matchFromCurrentCell(state, symbol);
136  if(helper) {
137  return {{transition, *helper}};
138  }
139  }
140  return {std::nullopt};
141  }
142  catch (std::out_of_range) {
143  return {std::nullopt};
144  }
145  }
146 
147  private:
148  StateType initialState;
150  std::set<TransitionType> pureVariablePreStatePatternTransitions;
151  };
152 }
TuringSim::Machine::Turing::DeterministicTuringStyleMConfigurationTuringMachine::DeterministicTuringStyleMConfigurationTuringMachine
DeterministicTuringStyleMConfigurationTuringMachine(DeterministicTuringStyleMConfigurationTuringMachine &&)=default
The default move constructor.
TuringSim::Machine::Turing::DeterministicTuringStyleMConfigurationTuringMachine::DeterministicTuringStyleMConfigurationTuringMachine
DeterministicTuringStyleMConfigurationTuringMachine(const DeterministicTuringStyleMConfigurationTuringMachine &)=default
The default copy constructor.
TuringSim::State::MConfiguration::MConfigurationMap< SymbolType, TransitionType >
TuringSim::State::MConfiguration::MConfiguration
The base class for m-configurations.
Definition: mConfiguration.h:25
TuringSim::Machine::Turing::DeterministicTuringStyleMConfigurationTuringMachine::DeterministicTuringStyleMConfigurationTuringMachine
DeterministicTuringStyleMConfigurationTuringMachine()=delete
The deleted default constructor.
TuringSim::Memory::TapeLike
std::conditional_t< isHalfTape, HalfTape::HalfTape< SymbolType >, Tape::Tape< SymbolType > > TapeLike
Definition: tapeLike.h:12
TuringSim::Machine::Turing::DeterministicTuringStyleMConfigurationTuringMachine::operator=
DeterministicTuringStyleMConfigurationTuringMachine & operator=(const DeterministicTuringStyleMConfigurationTuringMachine &)=default
The default copy assignment operator.
TuringSim::Machine::Turing::DeterministicTuringStyleMConfigurationTuringMachine
Deterministic machines whose transitions are Transition::TuringStyleMConfigurationTuringMachineTransi...
Definition: deterministicTuringStyleMConfigurationTuringMachine.h:24
TuringSim::Machine::Turing::DeterministicTuringStyleMConfigurationTuringMachine::~DeterministicTuringStyleMConfigurationTuringMachine
virtual ~DeterministicTuringStyleMConfigurationTuringMachine() override=default
The default virtual destructor.
TuringSim::Machine::Turing::TuringStyleMConfigurationTuringMachine
Machines whose transitions are Transition::TuringStyleMConfigurationTuringMachineTransition.
Definition: turingStyleMConfigurationTuringMachine.h:38
TuringSim::Machine::Turing::DeterministicTuringStyleMConfigurationTuringMachine::DeterministicTuringStyleMConfigurationTuringMachine
DeterministicTuringStyleMConfigurationTuringMachine(const StateType &initialState, const std::set< State::MConfiguration::MConfiguration< SymbolType >> &finalStates, const std::set< TransitionType > &transitions)
Build a DeterministicTuringStyleMConfigurationTuringMachine from an initial state,...
Definition: deterministicTuringStyleMConfigurationTuringMachine.h:81
TuringSim::Transition::Turing::TuringStyleMConfigurationTuringMachineTransition
Transitions as we find in 1936 Turing's paper.
Definition: turingStyleMConfigurationTuringMachineTransition.h:19
TuringSim::State::MConfiguration::MConfigurationMap::getCandidates
const std::map< MConf, std::set< V > > & getCandidates(const MConf &state) const
Gets all binding with same arity and root as state.
Definition: mConfigurationMap.h:112
TuringSim::Machine::AcceptingStyle
AcceptingStyle
Whether the machine is accepting, alternating or nothing.
Definition: acceptingMachine.h:11
TuringSim::Machine::Turing::DeterministicTuringStyleMConfigurationTuringMachine::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: deterministicTuringStyleMConfigurationTuringMachine.h:122
TuringSim::Machine::Turing::DeterministicTuringStyleMConfigurationTuringMachine::getInitialState
virtual StateType getInitialState() const noexcept override final
Return the initial state of the Turing machine.
Definition: deterministicTuringStyleMConfigurationTuringMachine.h:105
TuringSim::Machine::Turing
Namespace of Turing machines, that is whose storage is a tape.
Definition: deterministicSimpleTuringMachine.h:8
TuringSim::Machine::Turing::DeterministicTuringStyleMConfigurationTuringMachine::operator=
DeterministicTuringStyleMConfigurationTuringMachine & operator=(DeterministicTuringStyleMConfigurationTuringMachine &&)=default
The default move assignment operator.