65.9K
CodeProject 正在变化。 阅读更多。
Home

创建 Python 中的图灵机 - 第 1 部分

starIconstarIconstarIconstarIconstarIcon

5.00/5 (9投票s)

2017 年 12 月 22 日

CPOL

3分钟阅读

viewsIcon

24831

在本系列中,我想向您展示如何在 Python 中创建一个简单的基于控制台的图灵机。您可以在 https://github.com/phillikus/turing_machine 上查看完整的源代码。在这一部分中,我将解释图灵机背后的基本理论,并在此基础上设置项目。

在本系列中,我想向您展示如何在 Python 中创建一个简单的基于控制台的图灵机。您可以在 https://github.com/phillikus/turing_machine 上查看完整的源代码。

在这一部分中,我将解释图灵机背后的基本理论,并在此基础上设置项目。

要求

  • Python 的基础知识
  • 理论计算机科学基础

什么是图灵机?

图灵机是一个 计算的数学模型,它基于规则表读取和写入磁带上的符号。每个图灵机都可以通过状态列表和转换列表来定义。 基于起始状态 (s0),图灵机依次遍历所有状态,直到达到最终状态 (sf)。 如果没有转换导致最终状态,图灵机将“永远”运行,最终会遇到错误。

转换由当前状态、磁带当前位置读取的符号、下一个状态以及必须写入磁带的下一个符号定义。 此外,它还包含一个方向,用于确定磁带头是否应向左、向右移动或根本不移动。 为了可视化此过程,让我们看看一个非常简单的图灵机,它将初始磁带的值递增 1。

一元递增

为了简单起见,我们将从一元图灵机开始。 一个用 '|' 表示。 因此,包含数字 3 的图灵机将如下所示

$|||#

$ 表示我们图灵机的起点,# 表示终点。 递增完成后,我们期望最终磁带看起来像这样

$||||#

要达到最终状态,我们的图灵机只需读取所有 '|' 并附加一个 '|'。

这可以用三个状态 s0s1sf 以及以下转换来表示

(s0, ‘$’, s1, ‘$’, Right)
(s1, ‘|’, s1, ‘|’, Right)
(s1, ‘#’, sf, ‘|’, Neutral)

也可以用以下状态转换图表示

我们从状态 s0 开始,我们希望读取 '$'。 然后我们切换到状态 s1 并写回 '$'。 然后,我们将磁头向右移动一个字符。

在状态 s1 中,只要我们读取 '|',我们就会停留在状态 s1 并写回 '|'。 这样,我们将一直移动到磁带的右端。

最后,当我们遇到“#”时,我们写入一个 '|' 并进入最终状态 sf。 由于我们完成了,因此此时没有理由移动磁头。

项目结构

虽然这是一个非常简单的图灵机,但我们可以使用相同的模型来创建任何复杂程度的机器。 有了这些知识,我们现在就可以开始规划我们项目的基本结构了。 为了表示整个图灵机,我们需要一个类,一个用于状态和转换的类,以及磁带。

此外,我们需要一个枚举来表示我们移动图灵机磁头的三个方向:左、右和中性(不移动)。

最后,我们需要一个类来组合所有这些组件并使用它们来处理图灵机。 为每个类添加一个文件后,我得到了以下结构

本系列的第一部分到此结束。 我们现在对图灵机有了基本的了解,并且已经设置了项目。 有了它,现在是开始编码的时候了! 在本系列的下一篇文章中,我们将实现代码,使我们的图灵机工作,并用上面定义的 Increment 机器来喂它。

感谢您阅读本文。 :) 如果您有任何问题、问题或反馈,请在评论中告诉我。

© . All rights reserved.