KeyError 发表于 2023-9-8 22:16:01

Python图灵机

图灵机是离散数学的一个概念,
比较深, 不是很容易懂。



from time import sleep

function = type(lambda x : 0)

class nsSet:    #非空集合
    def __init__(self, init: set):
      if isinstance(init, set) and (init != set()):
            for i in init:
                if not isinstance(i, str):
                  raise TypeError("the value isn't a string")
                if ' ' in i:
                  raise ValueError("space can't in value")
            self.set = init
            pass
      else:
            raise ValueError("the init value isn't a no space set")

    def __contains__(self, item):
      if isinstance(item, nsSet):
            for i in item.set:
                if i not in self.set:
                  return False
            return True
      else:
            return item in self.set

class TuLing:
    '''
Q: 所有状态
E: 字母表
q: 初始状态
B: ' '
A: 接收状态集合
fun: 动作函数
'''
    def __init__(self, Q: nsSet, E: nsSet, q: str, A: nsSet, fun: function):
      '''
fun:
def fun(状态, 扫描到的值):
    ...
    return [将扫描到的数改成此值, 'L'/'R'(L向左移, R向右), 下一个状态]
    或
    return None    #不定义
'''
      if isinstance(Q, nsSet) and isinstance(E, nsSet) and isinstance(q, str)\
         and isinstance(A, nsSet):
            if A in Q:
                if q in Q:
                  self.q = Q
                  self.e = E
                  self.iq = q
                  self.a = A
                  self.fun = fun
                else:
                  raise ValueError("the init status not in status set")   #初始状态不包含在状态集合内
            else:
                raise ValueError("the can acceptability status not all in status set")#并不是所有可以接受的状态都在状态集合内
      else:
            raise TypeError("type error")   #某个参数类型错误
      pass

    def Start(self, inputs: str):
      if isinstance(inputs, str):
            if '' != inputs:
                  for i in inputs:
                        if i not in self.e and i != ' ':
                            raise ValueError("value not in char set")   #有字符不在字母表里
                  dai = list(inputs)
                  index = 0
                  nowq = self.iq
                  
                  while True:
                        print(''.join(dai))
                        print(' '*index + '^')
                        print(' '*index + nowq)
                        re = self.fun(nowq, dai)
                        if re == None:
                            break
                        print('改写后的值:', re)
                        print('L\R:', re)
                        print('下一个状态:', re)
                        print('--------------------')
                        dai = re
                        if re == 'L':
                            if index == 0:
                              dai.insert(0, ' ')
                            else:
                              index -= 1
                        elif re == 'R':
                            index += 1
                            if index == len(dai):
                              dai.append(' ')
                        else:
                            raise RuntimeError("fun not return a correct direction")    #re不是'L'也不是'R'
                        nowq = re
                        sleep(0.5)
                  if nowq in A:
                        print("接受")
                        print(''.join(dai))
                  else:
                        print("拒绝")
                        
# 这是演示值
Q = nsSet({'0', '1', '2', '3', '4', 'e'})
E = nsSet({'1'})
q = '0'
A = nsSet({'e'})
def fun(status, value):
    if status == '0':
      if value == '1':
            return [' ', 'R', '1']
      else:   #由于字母表只有'1'和' ', 所以可以用else
            return None
    elif status == '1':
      if value == '1':
            return [' ', 'R', '2']
      else:
            return [' ', 'R', '3']
    elif status == '2':
      if value == '1':
            return [' ', 'R', '2']
      else:
            return [' ', 'R', '4']
    elif status == '3':
      if value == '1':
            return [' ', 'R', '3']
      else:
            return [' ', 'L', 'e']
    elif status == '4':
      if value == '1':
            return ['1', 'R', '4']
      else:
            return [' ', 'R', '3']
    else:   # status == 'e'
      return None
tu = TuLing(Q, E, q, A, fun)
tu.Start("11 1 11")

歌者文明清理员 发表于 2023-9-8 22:17:26

学习

歌者文明清理员 发表于 2023-9-8 22:17:55

https://fishc.com.cn/forum.php?mod=collection&action=view&ctid=2109

学习编程中的Ben 发表于 2023-9-8 22:32:57

失踪人口回归!

liuhongrun2022 发表于 2023-9-8 22:46:23

学习编程中的Ben 发表于 2023-9-8 22:32
失踪人口回归!

几天前就回归了

sfqxx 发表于 2023-9-8 22:57:39

{:10_254:}

nbyzx 发表于 2023-9-9 07:28:24

瞅瞅是啥

风眠 发表于 2023-9-9 12:53:37

风眠 发表于 2023-9-9 12:53:56

干什么的啊?

yinda_peng 发表于 2023-9-9 14:05:20

看一看

yinda_peng 发表于 2023-9-9 14:06:26

如果我没有猜错这个概念最初是不是跟图灵当时二战破译德军密码有关

KeyError 发表于 2023-9-9 19:45:14

风眠 发表于 2023-9-9 12:53
干什么的啊?

脑子一抽就写出来了,没啥用途

风眠 发表于 2023-9-9 20:11:03

KeyError 发表于 2023-9-9 19:45
脑子一抽就写出来了,没啥用途

1822989620 发表于 2023-9-14 08:38:38

{:5_108:}

凌凌祺 发表于 2023-9-14 08:43:37

1

wk012233 发表于 2023-9-14 08:46:03

1

Lynn_oyl 发表于 2023-10-2 21:08:09

疯狂学习中

macolma 发表于 2023-10-3 17:18:58

支持你啊!

Mike_python小 发表于 2023-10-3 17:24:49

{:10_254:}

python爱好者. 发表于 2023-10-3 20:46:35

{:10_257:}
页: [1] 2
查看完整版本: Python图灵机