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

无std rstm-core

本包专注于为图灵机构建具体实现

2个版本

0.0.3 2024年8月23日
0.0.2 2024年7月29日

#5 in #turing

Download history 111/week @ 2024-07-26 14/week @ 2024-08-02

每月 125 次下载
用于 rstm

Apache-2.0

115KB
3K 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
~32K SLoC