1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
//! # rstm
//!
//! Welcome to `rstm`, a flexible framework for creating and executing Turing machines (TM) in
//! Rust.
//!
//! ## Background
//!
//! Turing machines are abstract models of computation initially proposed by Alan Turing in
//! 1936. These models work by considering an infinite tape (memory) divided evenly into
//! uniform cells capable of storing a single value that is mutated by the head of the machine
//! according to some set of rules.
//!
//! ## Rules
//!
//! Rules or instructions for TMs can be defined as a 5-tuple consisting of:
//!
//! 1. Current State: The current state of the machine.
//! 2. Current Symbol: The symbol currently being read by the head.
//! 3. Next State: The state to transition to after executing the rule.
//! 4. Write Symbol: The symbol to write on the tape at the current head position.
//! 5. Shift: The direction to move the head (left, right, or stay).
//!
//! Here, we break the rule into two distinct components for clarity:
//!
//! - [`Head`]: defines the current state and symbol
//! - [`Tail`]: defines the shift direction, next state, and write symbol
//!
//! ## Basic Usage
//!
//! For more examples, please refer to the [`examples`](https://github.com/FL03/rstm/blob/main/rstm/examples) directory in the repository.
//!
//! ### `MovingHead` Example
//!
//! This example demonstrats how to initialize and run a Turing machine with a _moving head_.
//!
//! ```rust
//! use rstm::{MovingHead, program};
//!
//! // define an initial state
//! let initial_state: isize = 0;
//! // create a program to execute
//! let program = program! {
//! #[default_state(initial_state)]
//! rules: {
//! (0, 0) -> Right(1, 0),
//! (0, 1) -> Stay(-1, 1),
//! (1, 0) -> Right(0, 1),
//! (1, 1) -> Right(-1, 0),
//! (-1, 0) -> Left(<isize>::MAX, 0),
//! (-1, 1) -> Left(1, 1),
//! };
//! };
//! // initialize the machine
//! let mut tm = MovingHead::tmh(program);
//! // load the input
//! tm.extend_tape([0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0]);
//! // execute the workload
//! tm.run().expect("failed to execute...");
//! ```
// compile error if neither `alloc` nor `std` features are enabled
compile_error!
// external crate
extern crate alloc;
pub use *;
pub use *;
pub use rstm_tape as tape;
// prelude