3 #include <machine/Turing/turingStyleMConfigurationTuringMachine.h>
21 bool hasHalfTape =
false,
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;
40 static_assert(std::is_same_v<StateType, typename TransitionType::StateType>);
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);
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>>>);
82 const StateType& initialState,
84 const std::set<TransitionType>& transitions
87 initialState(initialState),
90 for(
const TransitionType& transition: transitions) {
91 if(transition.getPreStatePattern()->isVariable()) {
92 this->pureVariablePreStatePatternTransitions.insert(transition);
95 this->transitions.insert(*transition.getPreStatePattern(), transition);
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);
130 return {{transition, *helper}};
134 for(
const TransitionType& transition: pureVariablePreStatePatternTransitions) {
135 std::optional<ApplyHelperType> helper = transition.matchFromCurrentCell(state, symbol);
137 return {{transition, *helper}};
140 return {std::nullopt};
142 catch (std::out_of_range) {
143 return {std::nullopt};
148 StateType initialState;
150 std::set<TransitionType> pureVariablePreStatePatternTransitions;