aboutsummaryrefslogtreecommitdiff
path: root/example/turing/src/machine.h
diff options
context:
space:
mode:
Diffstat (limited to 'example/turing/src/machine.h')
-rw-r--r--example/turing/src/machine.h98
1 files changed, 98 insertions, 0 deletions
diff --git a/example/turing/src/machine.h b/example/turing/src/machine.h
new file mode 100644
index 0000000..2404d9a
--- /dev/null
+++ b/example/turing/src/machine.h
@@ -0,0 +1,98 @@
+#ifndef TYPEASVALUE_EXAMPLE_TURING_MACHINE_H_
+#define TYPEASVALUE_EXAMPLE_TURING_MACHINE_H_
+
+#include "conditional/cond.h"
+
+#include "state.h"
+#include "tape.h"
+
+namespace machine {
+
+// (define (simulate transition tape state position)
+// (if (= state FINAL)
+// tape
+// (let* ((current_symbol (readSymbol position tape))
+// (current_state (transition state current_symbol))
+// (direction (nth MOVE current_state))
+// (next_symbol (nth WRITE current_state))
+// (next_state (nth NEXT current_state))
+// (next_position (cond ((= direction RIGHT) (+ position 1))
+// ((= direction LEFT) (- Position 1))
+// (else position))))
+// (simulate transition
+// (writeSymbol position next_symbol tape)
+// next_state,
+// next_position)))
+template <
+ template<typename, typename> class Transition,
+ typename State,
+ typename Tape,
+ typename Position
+>
+class simulate {
+ private:
+ using current_symbol = tape::readSymbol<Position, Tape>;
+ using current_state = Transition<State, current_symbol>;
+
+ using direction = tav::Nth<state::field::MOVE, current_state>;
+
+ using next_symbol = tav::Nth<state::field::WRITE, current_state>;
+ using next_state = tav::Nth<state::field::NEXT, current_state>;
+ using next_position = tav::Cond<
+ tav::Branch<
+ tav::IsEqualValue<direction, tav::Char<'R'>>,
+ tav::Add<Position, tav::Size<1>>
+ >,
+ tav::Branch<
+ tav::IsEqualValue<direction, tav::Char<'L'>>,
+ tav::Substract<Position, tav::Size<1>>
+ >,
+ tav::Else<
+ Position
+ >
+ >;
+
+ static_assert(
+ tav::Not<tav::LowerThan<next_position, tav::Size<0>>>::value,
+ "next position out of bounds"
+ );
+
+ public:
+ using type = tav::Eval<simulate<
+ Transition,
+ next_state,
+ tape::writeSymbol<Position, next_symbol, Tape>,
+ next_position
+ >>;
+};
+
+template <
+ template<typename, typename> class Transition,
+ typename Tape,
+ typename Position
+>
+struct simulate<Transition, void, Tape, Position> {
+ typedef Tape type;
+};
+
+// (define (run program state tape position)
+// (simulate (transition program)
+// tape
+// state
+// position))
+template <
+ typename Program,
+ typename State,
+ typename Tape,
+ typename Position
+>
+using run = tav::Eval<simulate<
+ state::transition<Program>::template state,
+ State,
+ Tape,
+ Position
+>>;
+
+}
+
+#endif // TYPEASVALUE_EXAMPLE_TURING_MACHINE_H_