#ifndef TYPEASVALUE_EXAMPLE_TURING_SRC_MACHINE_H_ #define TYPEASVALUE_EXAMPLE_TURING_SRC_MACHINE_H_ #include "conditional/cond.h" #include "state.h" #include "tape.h" namespace machine { // (define (updatePosition direction position) // (cond ((= direction RIGHT) (+ position 1)) // ((= direction LEFT) (- Position 1)) // (else position))) template < typename Direction, typename Position > using updatePosition = tav::Cond< tav::Branch< tav::IsEqualValue>, tav::Add> >, tav::Branch< tav::IsEqualValue>, tav::Substract> >, tav::Else< Position > >; // (define (simulate transition tape state position) // (if (= state FINAL) // (cons '(position . tape) // '()) // (let ((current_state (transition state // (readSymbol position tape)))) // (cons '(position tape) // (simulate transition // (current_state NEXT) // (writeSymbol position // (current_state WRITE) // tape) // (updatePosition (current_state MOVE) // position)))))) template < template class Transition, typename State, typename Tape, typename Position > class simulate { static_assert( tav::Not>>::value, "machine head position out of bounds" ); private: template using current_state = typename Transition< State, tape::readSymbol >::template get; public: using type = tav::Cons< tav::Pair, tav::Eval, tape::writeSymbol< Position, current_state, Tape >, updatePosition< current_state, Position > >> >; }; template < template class Transition, typename Tape, typename Position > struct simulate { using type = tav::Cons< tav::Pair, void >; }; // (define (run program state tape position) // (simulate (transition program) // state // tape // position)) template < typename Program, typename State, typename Tape, typename Position > using run = tav::Eval::template state, State, Tape, Position >>; } #endif // TYPEASVALUE_EXAMPLE_TURING_SRC_MACHINE_H_