TuringSim
C++ framework to simulate abstract computing models
pushdownMachine.h
1 #pragma once
2 
3 #include <machine/machine.h>
4 #include <transition/PDM/pushdownMachineTransition.h>
5 
9 namespace TuringSim::Machine::PDM {
25  template <
26  typename TransitionType_,
27  bool deterministic,
28  AcceptingStyle acceptingStyle = AcceptingStyle::Accepting,
29  template <typename...> class TransitionContainer_ = std::vector,
30  template <typename...> class InitialStateContainer_ = std::vector
31  >
33 
47  template <
48  typename TransitionType_,
49  AcceptingStyle acceptingStyle,
50  template <typename...> class TransitionContainer_,
51  template <typename...> class InitialStateContainer_
52  >
53  class PushdownMachine<TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_> :
54  public Machine<TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_>{
56  public:
57  using typename Machine_::StateType;
58  using typename Machine_::IsAccepting;
59  using typename Machine_::StorageType;
60  using typename Machine_::IsAlternating;
61  using typename Machine_::TransitionType;
62  using typename Machine_::ApplyHelperType;
63  using typename Machine_::IsDeterministic;
64  using typename Machine_::TransitionContainer;
65  using typename Machine_::InitialStateContainer;
67 
71  typedef typename TransitionType::WordType WordType;
72 
76  typedef typename TransitionType::StackType StackType;
77 
81  typedef typename TransitionType::LetterType LetterType;
82 
86  typedef typename TransitionType::StackSymbolType StackSymbolType;
87 
88  static_assert(std::is_same_v<StateType, typename TransitionType::StateType>);
89  static_assert(std::is_same_v<StorageType, typename TransitionType::StorageType>);
90  static_assert(std::is_same_v<TransitionType, TransitionType_>);
91  static_assert(std::is_same_v<ApplyHelperType, typename TransitionType::ApplyHelperType>);
92  static_assert(std::is_same_v<ApplyHelperType, std::monostate>);
93  static_assert(std::is_same_v<IsDeterministic, std::true_type>);
94  static_assert(std::is_same_v<TransitionContainer, TransitionContainer_<std::pair<const TransitionType&, ApplyHelperType>>>);
95  static_assert(std::is_same_v<InitialStateContainer, InitialStateContainer_<StateType>>);
96  static_assert(std::is_same_v<OptionalHelpedTransition, std::optional<std::pair<const TransitionType&, ApplyHelperType>>>);
97 
99  "StorageType should be a word and a stack.");
101  "TransitionType must be a derived class of PushdownMachineTransition");
102 
103 
105  PushdownMachine() = default;
107  PushdownMachine(const PushdownMachine&) = default;
119  virtual ~PushdownMachine() override = default;
120 
134  virtual OptionalHelpedTransition getMatchingTransition(const StateType& state, const StorageType& storage) const noexcept override final {
135  return this->getMatchingTransitionFromCurrentLetter(state, std::get<WordType>(storage).front_opt(), std::get<StackType>(storage));
136  }
137 
152  virtual OptionalHelpedTransition getMatchingTransitionFromCurrentLetter(const StateType& state, const std::optional<LetterType>& letter, const StackType& stack) const noexcept = 0;
153  };
154 
168  template <
169  typename TransitionType_,
170  AcceptingStyle acceptingStyle,
171  template <typename...> class TransitionContainer_,
172  template <typename...> class InitialStateContainer_
173  >
174  class PushdownMachine<TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_> :
175  public Machine<TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_> {
177  public:
178  using typename Machine_::StateType;
179  using typename Machine_::IsAccepting;
180  using typename Machine_::StorageType;
181  using typename Machine_::IsAlternating;
182  using typename Machine_::TransitionType;
183  using typename Machine_::ApplyHelperType;
184  using typename Machine_::IsDeterministic;
185  using typename Machine_::TransitionContainer;
186  using typename Machine_::InitialStateContainer;
187  using typename Machine_::OptionalHelpedTransition;
188 
192  typedef typename TransitionType::WordType WordType;
193 
197  typedef typename TransitionType::StackType StackType;
198 
202  typedef typename TransitionType::LetterType LetterType;
203 
207  typedef typename TransitionType::StackSymbolType StackSymbolType;
208 
209  static_assert(std::is_same_v<StateType, typename TransitionType::StateType>);
210  static_assert(std::is_same_v<StorageType, typename TransitionType::StorageType>);
211  static_assert(std::is_same_v<TransitionType, TransitionType_>);
212  static_assert(std::is_same_v<ApplyHelperType, typename TransitionType::ApplyHelperType>);
213  static_assert(std::is_same_v<ApplyHelperType, std::monostate>);
214  static_assert(std::is_same_v<IsDeterministic, std::false_type>);
215  static_assert(std::is_same_v<TransitionContainer, TransitionContainer_<std::pair<const TransitionType&, ApplyHelperType>>>);
216  static_assert(std::is_same_v<InitialStateContainer, InitialStateContainer_<StateType>>);
217  static_assert(std::is_same_v<OptionalHelpedTransition, std::optional<std::pair<const TransitionType&, ApplyHelperType>>>);
218 
220  "StorageType should be a word and a stack.");
222  "TransitionType must be a derived class of PushdownMachineTransition");
223 
225  PushdownMachine() = default;
227  PushdownMachine(const PushdownMachine&) = default;
239  virtual ~PushdownMachine() override = default;
240 
254  virtual TransitionContainer getMatchingTransitions(const StateType& state, const StorageType& storage) const noexcept override final {
255  return this->getMatchingTransitionsFromCurrentLetter(state, std::get<WordType>(storage).front_opt(), std::get<StackType>(storage));
256  }
257 
269  virtual TransitionContainer getMatchingTransitionsFromCurrentLetter(const StateType& state, const std::optional<LetterType>& letter, const StackType& stack) const noexcept = 0;
270  };
271 }
TuringSim::Machine::PDM::PushdownMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::getMatchingTransitionsFromCurrentLetter
virtual TransitionContainer getMatchingTransitionsFromCurrentLetter(const StateType &state, const std::optional< LetterType > &letter, const StackType &stack) const noexcept=0
Get matching transitions for the next step.
TuringSim::Machine::Machine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::ApplyHelperType
TransitionType::ApplyHelperType ApplyHelperType
The type of the apply helper. Got from TransitionType.
Definition: machine.h:85
TuringSim::Machine::PDM::PushdownMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::operator=
PushdownMachine & operator=(PushdownMachine &&)=default
The default move assignment operator.
TuringSim::Transition::PDM::PushdownMachineStorage
std::tuple< Memory::Word::Word< WordAlphabet >, Memory::Stack::Stack< StackAlphabet > > PushdownMachineStorage
The type of the memory of a pushdown machine from the types of letters and symbols on the stack.
Definition: pushdownMachineTransition.h:15
TuringSim::Machine::PDM::PushdownMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::operator=
PushdownMachine & operator=(PushdownMachine &&)=default
The default move assignment operator.
TuringSim::Machine::PDM
Namespace of pushdown machines, that is whose storage is a word and a stack.
Definition: deterministicSimplePushdownMachine.h:6
TuringSim::Machine::PDM::PushdownMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::getMatchingTransitions
virtual TransitionContainer getMatchingTransitions(const StateType &state, const StorageType &storage) const noexcept override final
Get matching transition for the next step.
Definition: pushdownMachine.h:254
TuringSim::Machine::PDM::PushdownMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::PushdownMachine
PushdownMachine()=default
The default constructor.
TuringSim::Machine::PDM::PushdownMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::getMatchingTransition
virtual OptionalHelpedTransition getMatchingTransition(const StateType &state, const StorageType &storage) const noexcept override final
Get matching transition for the next step.
Definition: pushdownMachine.h:134
TuringSim::Machine::Machine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::InitialStateContainer
InitialStateContainer_< StateType > InitialStateContainer
The type returned by getInitialStates() const that contains initial states.
Definition: machine.h:256
TuringSim::Machine::PDM::PushdownMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::getMatchingTransitionFromCurrentLetter
virtual OptionalHelpedTransition getMatchingTransitionFromCurrentLetter(const StateType &state, const std::optional< LetterType > &letter, const StackType &stack) const noexcept=0
Get matching transition for the next step.
TuringSim::Machine::PDM::PushdownMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::LetterType
TransitionType::LetterType LetterType
The type of letters of the word.
Definition: pushdownMachine.h:81
TuringSim::Machine::PDM::PushdownMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::WordType
TransitionType::WordType WordType
The type of words.
Definition: pushdownMachine.h:192
TuringSim::Machine::PDM::PushdownMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::PushdownMachine
PushdownMachine()=default
The default constructor.
TuringSim::Machine::Machine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::InitialStateContainer
InitialStateContainer_< StateType > InitialStateContainer
The type returned by getInitialStates() const that contains initial states.
Definition: machine.h:106
TuringSim::Machine::PDM::PushdownMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::operator=
PushdownMachine & operator=(const PushdownMachine &)=default
The default copy assignment operator.
TuringSim::Machine::Machine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >
Base class for non deterministic machines.
Definition: machine.h:55
TuringSim::Machine::PDM::PushdownMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::PushdownMachine
PushdownMachine(const PushdownMachine &)=default
The default copy constructor.
TuringSim::Machine::PDM::PushdownMachine
The class to represent a pushdown machine.
Definition: pushdownMachine.h:32
TuringSim::Machine::Machine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::ApplyHelperType
TransitionType::ApplyHelperType ApplyHelperType
The type of the apply helper. Got from TransitionType.
Definition: machine.h:234
TuringSim::Machine::PDM::PushdownMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::~PushdownMachine
virtual ~PushdownMachine() override=default
The default virtual destructor.
TuringSim::Machine::Machine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::OptionalHelpedTransition
std::optional< std::pair< const TransitionType &, ApplyHelperType > > OptionalHelpedTransition
The type returned by getMatchingTransition(const StateType&, const StorageType&) const that contains ...
Definition: machine.h:250
TuringSim::Machine::PDM::PushdownMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::~PushdownMachine
virtual ~PushdownMachine() override=default
The default virtual destructor.
TuringSim::Machine::Machine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::StateType
TransitionType::StateType StateType
The type of the machine states. Got from TransitionType.
Definition: machine.h:67
TuringSim::Machine::Machine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::StateType
TransitionType::StateType StateType
The type of the machine states. Got from TransitionType.
Definition: machine.h:218
TuringSim::Machine::PDM::PushdownMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::WordType
TransitionType::WordType WordType
The type of words.
Definition: pushdownMachine.h:71
TuringSim::Machine::AcceptingStyle
AcceptingStyle
Whether the machine is accepting, alternating or nothing.
Definition: acceptingMachine.h:11
TuringSim::Machine::Machine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::TransitionContainer
TransitionContainer_< std::pair< const TransitionType &, ApplyHelperType > > TransitionContainer
The type returned by getMatchingTransitions(const StateType&, const StorageType&) const that contains...
Definition: machine.h:94
TuringSim::Machine::Machine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::TransitionType
TransitionType_ TransitionType
The type of the transitions.
Definition: machine.h:212
TuringSim::Machine::Machine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::StorageType
TransitionType::StorageType StorageType
The type of the machine memoryGot from TransitionType.
Definition: machine.h:75
TuringSim::Machine::PDM::PushdownMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::operator=
PushdownMachine & operator=(const PushdownMachine &)=default
The default copy assignment operator.
TuringSim::Machine::PDM::PushdownMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::StackSymbolType
TransitionType::StackSymbolType StackSymbolType
The type of symbols in the stack.
Definition: pushdownMachine.h:86
TuringSim::Machine::Machine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::IsDeterministic
std::true_type IsDeterministic
std::true_type
Definition: machine.h:262
TuringSim::Machine::PDM::PushdownMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::StackType
TransitionType::StackType StackType
The type of stacks.
Definition: pushdownMachine.h:197
TuringSim::Machine::PDM::PushdownMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::StackType
TransitionType::StackType StackType
The type of stacks.
Definition: pushdownMachine.h:76
TuringSim::Machine::Machine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::TransitionContainer
TransitionContainer_< std::pair< const TransitionType &, ApplyHelperType > > TransitionContainer
The type returned by getMatchingTransitions(const StateType&, const StorageType&) const that contains...
Definition: machine.h:242
TuringSim::Machine::Machine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::StorageType
TransitionType::StorageType StorageType
The type of the machine memoryGot from TransitionType.
Definition: machine.h:225
TuringSim::Machine::Machine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >
Base class for deterministic machines.
Definition: machine.h:203
TuringSim::Machine::Machine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::OptionalHelpedTransition
std::optional< std::pair< const TransitionType &, ApplyHelperType > > OptionalHelpedTransition
Useless in non-deterministic machine. Is guaranteed to exist for compatibility with deterministic mac...
Definition: machine.h:99
TuringSim::Transition::PDM::PushdownMachineTransition
Transition of pushdown machines, i.e. transition on a word and a stack.
Definition: pushdownMachineTransition.h:30
TuringSim::Machine::PDM::PushdownMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::PushdownMachine
PushdownMachine(PushdownMachine &&)=default
The default move constructor.
TuringSim::Machine::PDM::PushdownMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::PushdownMachine
PushdownMachine(PushdownMachine &&)=default
The default move constructor.
TuringSim::Machine::PDM::PushdownMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::StackSymbolType
TransitionType::StackSymbolType StackSymbolType
The type of symbols in the stack.
Definition: pushdownMachine.h:207
TuringSim::Machine::PDM::PushdownMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::PushdownMachine
PushdownMachine(const PushdownMachine &)=default
The default copy constructor.
TuringSim::Machine::Machine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::TransitionType
TransitionType_ TransitionType
The type of the transitions.
Definition: machine.h:60
TuringSim::Machine::PDM::PushdownMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::LetterType
TransitionType::LetterType LetterType
The type of letters of the word.
Definition: pushdownMachine.h:202
TuringSim::Machine::Machine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::IsDeterministic
std::false_type IsDeterministic
std::false_type
Definition: machine.h:113
TuringSim::Machine::Machine
Base class for machines.
Definition: machine.h:33