TuringSim
C++ framework to simulate abstract computing models
acceptingMachine.h
1 #pragma once
2 
3 #include <string>
4 #include <functional>
5 #include <type_traits>
6 
7 namespace TuringSim::Machine {
11  enum struct AcceptingStyle {
12  NonAccepting,
13  Accepting,
14  Alternating,
15  };
16 
20  namespace Acceptance {
24  enum NodeType {
25  Accept,
26  Reject,
27  Universal,
28  Existential,
29  };
30 
37  template<typename CharT = char, typename Traits = std::char_traits<CharT>>
38  std::function<std::basic_ostream<CharT, Traits>&(std::basic_ostream<CharT, Traits>&)> debug(NodeType node) {
39  std::function<std::basic_ostream<CharT, Traits>&(std::basic_ostream<CharT, Traits>&)> f =
40  [node] (std::basic_ostream<CharT, Traits>& os) -> std::basic_ostream<CharT, Traits>& {
41  switch(node) {
42  case Accept:
43  return os << "T";
44  case Universal:
45  return os << "A";
46  case Reject:
47  return os << "_|_";
48  case Existential:
49  return os << "E";
50  }
51  };
52  return f;
53  }
54 
59  bool decideForEmptySet(NodeType node);
60 
65  std::optional<bool> toBool(NodeType node);
66  }
67 
73  template<typename TransitionType, AcceptingStyle acceptingStyle>
75 
79  template<typename TransitionType_>
80  class AcceptingMachine<TransitionType_, AcceptingStyle::NonAccepting> {
81  public:
85  typedef TransitionType_ TransitionType;
86 
92  typedef typename TransitionType::StateType StateType;
93 
100  typedef typename TransitionType::StorageType StorageType;
101 
105  typedef std::false_type IsAccepting;
106 
112  typedef std::false_type IsAlternating;
113 
116  AcceptingMachine() = default;
117 
120 
123 
128 
133 
135  virtual ~AcceptingMachine() = default;
136  };
137 
141  template<typename TransitionType_>
142  class AcceptingMachine<TransitionType_, AcceptingStyle::Accepting> {
143  public:
147  typedef TransitionType_ TransitionType;
148 
154  typedef typename TransitionType::StateType StateType;
155 
162  typedef typename TransitionType::StorageType StorageType;
163 
167  typedef std::true_type IsAccepting;
168 
174  typedef std::false_type IsAlternating;
175 
178  AcceptingMachine() = default;
179 
182 
185 
190 
195 
197  virtual ~AcceptingMachine() = default;
198 
206  virtual bool isAcceptingConfiguration(const StateType& state, const StorageType& storage) const noexcept = 0;
207  };
208 
212  template<typename TransitionType_>
213  class AcceptingMachine<TransitionType_, AcceptingStyle::Alternating> {
214  public:
218  typedef TransitionType_ TransitionType;
219 
225  typedef typename TransitionType::StateType StateType;
226 
233  typedef typename TransitionType::StorageType StorageType;
234 
238  typedef std::true_type IsAccepting;
239 
245  typedef std::true_type IsAlternating;
246 
249  AcceptingMachine() = default;
250 
253 
256 
261 
266 
268  virtual ~AcceptingMachine() = default;
269 
277  virtual Acceptance::NodeType isAcceptingConfiguration(const StateType& state, const StorageType& storage) const noexcept = 0;
278 
282  virtual bool isInitiallyUniversal() const noexcept = 0;
283  };
284 }
TuringSim::Machine::AcceptingMachine< TransitionType_, AcceptingStyle::Accepting >::operator=
AcceptingMachine & operator=(const AcceptingMachine &)=default
The default copy assignment operator.
TuringSim::Machine::AcceptingMachine< TransitionType_, AcceptingStyle::NonAccepting >::operator=
AcceptingMachine & operator=(AcceptingMachine &&)=default
The default move assignment operator.
TuringSim::Machine::AcceptingMachine< TransitionType_, AcceptingStyle::Accepting >::AcceptingMachine
AcceptingMachine()=default
Default constructor.
TuringSim::Machine::AcceptingMachine< TransitionType_, AcceptingStyle::Alternating >::StateType
TransitionType::StateType StateType
The type of the machine states. Got from TransitionType.
Definition: acceptingMachine.h:225
TuringSim::Machine::AcceptingMachine< TransitionType_, AcceptingStyle::Alternating >::IsAlternating
std::true_type IsAlternating
Whether the machine is alternating. It is std::true_type for this specialization.
Definition: acceptingMachine.h:245
TuringSim::Machine::AcceptingMachine< TransitionType_, AcceptingStyle::NonAccepting >::operator=
AcceptingMachine & operator=(const AcceptingMachine &)=default
The default copy assignment operator.
TuringSim::Machine::AcceptingMachine< TransitionType_, AcceptingStyle::Accepting >::StateType
TransitionType::StateType StateType
The type of the machine states. Got from TransitionType.
Definition: acceptingMachine.h:154
TuringSim::Machine::AcceptingMachine< TransitionType_, AcceptingStyle::NonAccepting >::TransitionType
TransitionType_ TransitionType
The type of the transitions.
Definition: acceptingMachine.h:85
TuringSim::Machine::AcceptingMachine< TransitionType_, AcceptingStyle::Accepting >::IsAlternating
std::false_type IsAlternating
Whether the machine is alternating. It is std::false_type for this specialization.
Definition: acceptingMachine.h:174
TuringSim::Machine::AcceptingMachine< TransitionType_, AcceptingStyle::Alternating >::AcceptingMachine
AcceptingMachine()=default
Default constructor.
TuringSim::Machine::AcceptingStyle::NonAccepting
@ NonAccepting
A computation machine that does not accept anything.
TuringSim::Machine::AcceptingMachine< TransitionType_, AcceptingStyle::NonAccepting >::AcceptingMachine
AcceptingMachine()=default
Default constructor.
TuringSim::Machine::AcceptingMachine< TransitionType_, AcceptingStyle::Alternating >::IsAccepting
std::true_type IsAccepting
Whether the machine is accepting. It is std::true_type for this specialization.
Definition: acceptingMachine.h:238
TuringSim::Machine::AcceptingMachine< TransitionType_, AcceptingStyle::Accepting >::StorageType
TransitionType::StorageType StorageType
The type of the machine memoryGot from TransitionType.
Definition: acceptingMachine.h:162
TuringSim::Machine::AcceptingMachine< TransitionType_, AcceptingStyle::Alternating >::TransitionType
TransitionType_ TransitionType
The type of the transitions.
Definition: acceptingMachine.h:218
TuringSim::Machine::AcceptingMachine< TransitionType_, AcceptingStyle::Accepting >::TransitionType
TransitionType_ TransitionType
The type of the transitions.
Definition: acceptingMachine.h:147
TuringSim::Machine::AcceptingMachine< TransitionType_, AcceptingStyle::Alternating >::operator=
AcceptingMachine & operator=(const AcceptingMachine &)=default
The default copy assignment operator.
Acceptance
Types of nodes for alternating machines, with helping functions.
TuringSim::Machine::AcceptingMachine< TransitionType_, AcceptingStyle::Alternating >::StorageType
TransitionType::StorageType StorageType
The type of the machine memoryGot from TransitionType.
Definition: acceptingMachine.h:233
TuringSim::Machine::AcceptingMachine< TransitionType_, AcceptingStyle::Accepting >::isAcceptingConfiguration
virtual bool isAcceptingConfiguration(const StateType &state, const StorageType &storage) const noexcept=0
Whether a given configuration is accepting.
TuringSim::Machine::AcceptingMachine< TransitionType_, AcceptingStyle::Accepting >::AcceptingMachine
AcceptingMachine(AcceptingMachine &&)=default
The default move constructor.
TuringSim::Machine::AcceptingMachine< TransitionType_, AcceptingStyle::Alternating >::~AcceptingMachine
virtual ~AcceptingMachine()=default
The default virtual destructor.
TuringSim::Machine::AcceptingMachine< TransitionType_, AcceptingStyle::Accepting >::~AcceptingMachine
virtual ~AcceptingMachine()=default
The default virtual destructor.
TuringSim::Machine::AcceptingMachine< TransitionType_, AcceptingStyle::NonAccepting >::AcceptingMachine
AcceptingMachine(const AcceptingMachine &)=default
The default copy constructor.
TuringSim::Machine::AcceptingMachine< TransitionType_, AcceptingStyle::Alternating >::isAcceptingConfiguration
virtual Acceptance::NodeType isAcceptingConfiguration(const StateType &state, const StorageType &storage) const noexcept=0
Whether a given configuration is accepting, rejecting or quantified.
TuringSim::Machine
The namespace that contains machines. To run them, see TuringSim::Runner.
Definition: acceptingMachine.h:7
TuringSim::Machine::AcceptingMachine< TransitionType_, AcceptingStyle::Accepting >::AcceptingMachine
AcceptingMachine(const AcceptingMachine &)=default
The default copy constructor.
TuringSim::Machine::AcceptingMachine< TransitionType_, AcceptingStyle::Accepting >::IsAccepting
std::true_type IsAccepting
Whether the machine is accepting. It is std::true_type for this specialization.
Definition: acceptingMachine.h:167
TuringSim::Machine::AcceptingMachine< TransitionType_, AcceptingStyle::Alternating >::AcceptingMachine
AcceptingMachine(AcceptingMachine &&)=default
The default move constructor.
TuringSim::Machine::AcceptingMachine
Base class for accepting machines.
Definition: acceptingMachine.h:74
TuringSim::Machine::AcceptingMachine< TransitionType_, AcceptingStyle::NonAccepting >::StorageType
TransitionType::StorageType StorageType
The type of the machine memoryGot from TransitionType.
Definition: acceptingMachine.h:100
TuringSim::Machine::AcceptingStyle
AcceptingStyle
Whether the machine is accepting, alternating or nothing.
Definition: acceptingMachine.h:11
TuringSim::Machine::AcceptingMachine< TransitionType_, AcceptingStyle::Alternating >::AcceptingMachine
AcceptingMachine(const AcceptingMachine &)=default
The default copy constructor.
TuringSim::Machine::AcceptingMachine< TransitionType_, AcceptingStyle::Accepting >::operator=
AcceptingMachine & operator=(AcceptingMachine &&)=default
The default move assignment operator.
TuringSim::Machine::AcceptingMachine< TransitionType_, AcceptingStyle::Alternating >::operator=
AcceptingMachine & operator=(AcceptingMachine &&)=default
The default move assignment operator.
TuringSim::Machine::AcceptingMachine< TransitionType_, AcceptingStyle::NonAccepting >::~AcceptingMachine
virtual ~AcceptingMachine()=default
The default virtual destructor.
TuringSim::Machine::AcceptingMachine< TransitionType_, AcceptingStyle::Alternating >::isInitiallyUniversal
virtual bool isInitiallyUniversal() const noexcept=0
Whether we only want all initial states to success, or only one.
TuringSim::Machine::AcceptingMachine< TransitionType_, AcceptingStyle::NonAccepting >::AcceptingMachine
AcceptingMachine(AcceptingMachine &&)=default
The default move constructor.
TuringSim::Machine::AcceptingMachine< TransitionType_, AcceptingStyle::NonAccepting >::IsAccepting
std::false_type IsAccepting
Whether the machine is accepting. It is std::false_type for this specialization.
Definition: acceptingMachine.h:105
TuringSim::Machine::AcceptingMachine< TransitionType_, AcceptingStyle::NonAccepting >::IsAlternating
std::false_type IsAlternating
Whether the machine is alternating. It is std::false_type for this specialization.
Definition: acceptingMachine.h:112
TuringSim::Machine::AcceptingMachine< TransitionType_, AcceptingStyle::NonAccepting >::StateType
TransitionType::StateType StateType
The type of the machine states. Got from TransitionType.
Definition: acceptingMachine.h:92