#turing #state-machine #turing-machine #utm

no-std rstm

本软件包专注于构建图灵机的具体实现

4 个版本

新版本 0.0.3 2024年8月23日
0.0.2 2024年7月29日
0.0.1 2024年7月23日
0.0.0 2024年7月22日

#3#turing

Download history 173/week @ 2024-07-19 215/week @ 2024-07-26 17/week @ 2024-08-02

每月405次下载

Apache-2.0

125KB
3.5K SLoC

rstm

crates.io docs.rs clippy rust

license lines of code


该库目前处于开发的早期阶段,仍在逐步确定 API 的感觉。

该库专注于构建图灵机的具体实现。

入门指南

从源代码开始

首先克隆仓库

git clone https://github.com/FL03/rstm.git
cd rstm
cargo build --all-features --workspace

运行示例

cargo run -f F --example actor

用法

创建新的规则集

程序实际上是定义机器行为的规则集合。这些规则的创建由 ruleset! 宏来促进。该宏允许开发者以简洁易读的方式定义机器的规则集,同时进一步模拟 Petr Kůrka 在“图灵机的拓扑动力学”中定义的转换函数;δ: Q x A -> Q x A x {-1, 0, 1}.

ruleset! 是一个宏,允许您定义机器的规则集。其语法如下

    ruleset![
        (state, symbol) -> Direction(next_state, next_symbol),
        ...
    ]

该宏是干净的,这意味着开发者在使用宏时不需要导入 Direction 枚举及其变体。

示例:为三状态、两符号图灵机构建规则集

    use rstm::ruleset;

    // define the ruleset for the machine
    let rules = ruleset![
        (0, 0) -> Right(1, 0),
        (0, 1) -> Stay(-1, 1),
        (1, 0) -> Left(0, 1),
        (1, 1) -> Right(-1, 0),
        (-1, 0) -> Right(0, 0),
        (-1, 1) -> Right(1, 1),
    ];

示例

    extern crate rstm;

    use rstm::{ruleset, Actor, Program, State};

    fn main() -> Result<(), Box<dyn std::error::Error>> {
        tracing_subscriber::fmt().with_target(false).init();

        // initialize the tape data
        let alpha = vec![0i8; 10];
        // initialize the state of the machine
        let initial_state = State(0);
        // define the ruleset for the machine
        let rules = ruleset![
            (0, 0) -> Right(1, 0),
            (0, 1) -> Right(-1, 1),
            (1, 0) -> Right(0, 1),
            (1, 1) -> Right(-1, 0),
            (-1, 0) -> Left(0, 0),
            (-1, 1) -> Left(1, 1),
        ];

        let program = Program::new()
            .initial_state(initial_state)
            .rules(rules)
            .build();

        // create a new instance of the machine
        let tm = dbg!(Actor::from_state(initial_state).with_tape(alpha));
        tm.execute(program).run()?;
        Ok(())
    }

贡献

欢迎拉取请求。任何改进或修改应首先通过拉取请求和/或打开问题进行讨论。此外,请确保根据需要更新测试,并遵守功能门。

许可证

依赖项

~0.7–1.5MB
~31K SLoC