编写未知完整性的编程语言


91

设计语言时,确定一种语言是否图灵完备非常重要。对于许多深奥的编程语言来说,这也是一项非常艰巨的任务,但让它提高一个等级。让我们编写一些很难证明图灵完备的编程语言,以至于即使世界上最好的数学家也无法以任何一种方式证明它们。您的任务是设计和实现一种语言,其图灵完备性取决于数学中尚未解决主要问题

规则

  • 您选择的问题必须至少在10年前提出,并且在发布此问题时必须解决。它可以是任何可证明的数学猜想,而不仅仅是Wikipedia页面上列出的猜想之一。

  • 您必须提供语言规范以及现有语言的实现。

  • 当且仅当猜想成立时,编程语言必须是图灵完整的。(或仅当猜想不成立时)

  • 您必须提供一个证明,以证明根据所选的推测图灵是完整的还是不完整的。在运行解释器或编译程序时,您可能会假设访问了无限制的内存。

  • 由于我们关注图灵完整性,因此不需要I / O,但是目标是制作最有趣的语言,以便它可能会有所帮助。

  • 这是一场因此赢得最多选票的答案将会赢得。

目标标准

一个好的答案应该做什么?这是投票时要寻找的一些东西,但在技术上不是必需的


此对话已转移至聊天
丹尼斯

13
总的来说,我发现这里的答案令人失望。它们几乎是“从图灵完备的语言开始,然后测试猜想X是否为True / False,如果是,则终止或禁用关键特征。”
xnor

1
@xnor我同意你的看法,我希望这个赏金会引起一些更有趣的答案,但看来这不会发生。
精神主义奥扎伊克,2017年

2
我认为问题之一是,大多数猜想已被证明对无数个值都是正确的,但是反例对于无数个值也都是正确的。结果,几乎不可能证明图灵完整性。
fəˈnɛtɪk

1
我认为将Turing完整性与给定猜想一对一联系的要求是一个很强的要求。我认为,如果证明或反驳Turing完整性会分别决定两个不同的开放性问题,那将很容易。(即证明图灵的完整性决定了开放性问题A,反证了决定了开放性问题B)。
PyRulez

Answers:


48

勒让德

仅当Legendre的猜想为假(即存在整数n> 0使得在n ^ 2和(n + 1)^ 2之间没有质数)时,该语言才是图灵完备的。这种语言从Underload中获得了一些启发,尽管在某些方面与它有很大的不同。

Legendre中的程序由一系列正整数组成(特别禁止使用0,因为它实质上否定了该语言的全部用途)。每个整数对应于Legendre中的一个基本命令,或一个潜在的用户定义的命令。将其分配给哪个命令取决于其平方和下一个整数(等于OEIS序列A014085)之间的质数

语言的命令修改了一个堆栈,该堆栈可以容纳任意大的正整数。如果堆栈保持0,则会立即删除0。详细地,这些命令是:

  • 2(产生此命令的最小整数:1):将程序中的下一个整数压入堆栈。

  • 3(最小产生整数:4):弹出栈顶的整数并执行与其关联的命令。

  • 4(最小:6):弹出顶部整数。如果为1,则递增堆栈中的前整数。

  • 5(10):交换顶部的两个堆叠项目。

  • 6(15):递减堆栈中的前整数。如果结果为0,则弹出0并丢弃它。

  • 7(16):复制堆栈中的最高整数。

  • 8(25):暂停执行并打印堆栈内容。

这是基本的指令集,它无法执行任何有趣的操作,更不用说循环了。但是,还有另一个命令,只有在Legendre的猜想证明为假的情况下才能访问该命令。

  • 0(未知):从堆栈中删除所有项目,并将它们组合为一个新函数,该函数将执行从堆栈原始底部开始并在顶部结束的所有命令,可作为“命令号”等于的命令来访问程序源中的下一个整数对应的一个。

如果可以以某种方式访问​​此命令,则该语言将成为图灵完备的,因为可以在其中模拟一台Minsky机器。

当执行命令8或到达程序结尾时,程序终止,并打印对应于堆栈上每个整数的(Unicode)字符。

范例程序

1 2 1 3 1 10 4

这个简单的程序先按数字2,然后按3,最后按10,然后再执行4(命令:3),这会弹出并执行10(命令:5),将2和3交换。

1 5 3 15 2 1 6 7

该程序演示了间接整数与命令的对应关系。首先,使用三种不同的2命令编码方式将5推入,然后推15和1。然后弹出1,结果将15递增到16,最后执行。该程序在堆栈上以数字5的两个实例结束。

1 1 1 5 ? 24 1 15 1 31 ? 31 24 31

该程序演示了0命令的用法,使用?作为占位符编号。程序首先在功能9中存储“ 1 5”,然后在10中存储“ 15 31”,然后运行功能9(使用24),该功能将5压入堆栈,并反复递减直到达到0并被删除。然后,程序停止。

明斯基机

为了将Minsky机器转换为Legendre代码,必须使用0命令。因为除非Legendre的猜想为假,否则无法访问此命令,因此我使用了占位符?代替。

请注意,所有Minsky机器指令行名称都必须具有互不相同的A014085和基本命令以及24(9)和31(10)对应的整数。

初始化:
1 1 1 1 ? 24
x INC(A / B)y:

A:

1 y 1 24 1 ? 1 6 1 1 16 1 24 ? x

B:

1 y 1 24 1 ? 1 10 1 6 1 1 16 1 10 1 24 ? x
x DEC(A / B)yz:

A:

1 4 1 10 1 15 1 10 1 31 1 1 1 10 1 z 1 1 1 16 1 24 1 31 1 ? 1 24 1 15 1 y 1 6 16 1 24 16 1 ? 1 1 16 1 10 1 1 16 1 24 ? x

B:

1 4 1 10 1 15 1 10 1 31 1 1 1 10 1 z 1 1 1 16 1 24 1 31 1 ? 1 24 1 15 1 10 1 y 1 6 16 1 24 16 1 ? 1 1 16 1 10 1 1 16 1 10 1 24 ? x
x HALT:
1 25 ? x

要创建最终程序,请附加所有部分(用x,y,z替换其对应部分)并添加单个整数以启动链中的第一条指令。如果勒让德的猜想被反例证明是错误的,这应该证明语言的图灵完备性。

口译员

该解释器是用Python(3)编写的,并且已经在上述所有三个示例上进行了测试。使用-a /-allowZero标志允许吗?要使用-f /-file可以直接从文件运行代码,而-s /-stackOut可以将堆栈输出为Python列表。如果没有给出文件,解释器将进入一种REPL模式,最好与--stackOut一起使用。

import sys
import argparse
import io

class I_need_missing(dict): #used to avoid try/except statements. Essentially a dict
    def __missing__(self,key):
        return None 

def appropriate(integer,prev): #returns number of primes between the square of the integer given and the next

    return_value = 0

    if prev[integer]:
        return prev[integer],prev
    if integer == "?":
        return 0,prev
    for i in range(integer ** 2, (integer + 1) ** 2):
        t = False
        if i > 1:
            t = True
            for j in range(2,int(i ** 0.5)+1):
                t = i/j != round(i/j)
                if not t:
                    break
        return_value += t

    prev[integer] = return_value
    return return_value,prev

def run_command(commandseries,stack,functions,prev): #Runs the appropriate action for each command.

    command,prev = appropriate(commandseries.pop(0),prev)

    halt = False

    if command == 0: #store in given number
        functions[appropriate(commandseries.pop(0),prev)[0]] = stack
        stack = []

    elif command == 2:#push
        stack.append(commandseries.pop(0))

    elif command == 3:#execute top instruction
        commandseries.insert(0,stack.pop())

    elif command == 4:#pop, add 1 to new top if popped value was 1
        if stack.pop() == 1:
            stack[-1] += 1

    elif command == 5:#swap top two integers/?
        stack[-1],stack[-2] = stack[-2],stack[-1]

    elif command == 6:#subtract 1 from top of stack
        stack[-1] -= 1
        if stack[-1] == 0:
            stack.pop()

    elif command == 7:#duplicate top of stack
        stack.append(stack[-1])

    elif command == 8:#halt
        halt = True

    else:#run custom
        try:
            commandseries[0:0] = functions[command]
        except TypeError:
            print("Warning: unassigned function " + str(command) + " is unassigned", file = sys.stderr)

    return commandseries,stack,functions,prev,halt

def main(stack,functions,prev):
    #Parser for command line options
    parser = argparse.ArgumentParser(description = "Interpreter for the Legendre esoteric programming language.")
    parser.add_argument("-a","--allowZero", action = "store_true")
    parser.add_argument("-f","--file")
    parser.add_argument("-s","--stackOut", action = "store_true")

    args = parser.parse_args()
    allow_zero = bool(args.allowZero)

    #Program decoding starts
    pre = ""

    if not args.file:
        pre = input()
        if pre == "":
            return
    else:
        pre = open(args.file).read()

    mid = pre.split()
    final = []

    for i in mid:
        if i == "?" and allow_zero:
            final.append("?")
        elif i != 0 or allow_zero: #and allow_zero)
            final.append(int(i))

    halt = False

    #Functional programming at its best
    while final and not halt:
        final,stack,functions,prev,halt = run_command(final,stack,functions,prev)

    #Halting and output
    else:
        if args.stackOut:
            print(stack)
        else:
            for i in stack:
                print(i == "?" and "?" or chr(i),end = "")
            print("")
        if args.file or halt:
            return
        else:
            main(stack,functions,prev)


if __name__ == '__main__':
    main([],I_need_missing(),I_need_missing())

14

联盟关闭

如果联合闭集猜想不正确,则此编程语言是图灵完备的。

控制项

命令列表:
x ++递增x(INC)
x--递减x(DEC)
j(x,y)如果y为0,则将指令集x添加到指令队列的末尾

所有变量均初始化为0

句法

程序被编写为一组命令集。
Command1 Command2 Command3 ...
Command1 Command2 ...
...

为了确定程序是否关闭并集,每个集合仅考虑集合
j(x,y)!= j(a,b)
+(x)!= +(y) 中不同命令的列表。

如果任何命令类型(+,-,j)至少出现在一半集中,则它什么也不做。

如果指令队列末尾没有指令,则程序可以结束

无限循环,包括空循环,可以使用j(x,y)来实现

口译员

图灵完整性

如果所有三个命令(j(x,y),递增,递减)均可用,则可以模拟一台Minsky机器。

任何使用j(x,y)到达的仅j(x,y)的集合都是HALT
x ++是INC
x--是DEC
j(x,y)是JZ

如果联合闭集猜想是正确的,则将始终禁用三个命令中的至少一个,从而使该语言无法完成图灵完成。


我要做的是代替使用3个运算符,而是使用无限数量的值,并对每个值取模4以获得三个运算之一,再加上一个无运算符。程序启动时,它将检查集合的并集是否已关闭,然后删除集合中一半以上的所有元素。然后重复此操作,直到没有此类元素。如果猜想为真,则所有程序都与空程序相同,但是,如果为假,则可以表示所有可能的程序(这就是为什么要包含no-op的原因)。
精神主义奥扎伊克,

@WheatWizard解释器关闭的并集确定将不同变量上的同一运算符视为不同。x ++被认为与y ++不同。结果,可以创建无限个不同的集合。对于无限数量的可能集合,如果三个主要类型中的任何一个都不在一半以上,则说明它已经完成。
fəˈnɛtɪk

联盟封闭集猜想的证明很可能会将转换为三个算子中的一个算为完成,因为有可能将所有不同的算子留在程序中,您只需要从无限个算子中选出3个即可。保持价值。
fəˈnɛtɪk

13

费马素数

该语言适用于两个可能无限的磁带,其中磁带的每个位置都可以存储任意整数。开始时,两个磁带都充满-1。两个磁带上还有两个从0位置开始的磁带头。

解释器将首先读取输入,并将值从位置0开始存储到第一个(数据)磁带中。

然后它将读取提供的程序。对于遇到的每个数字,它将首先检查该值是否为Fermat素数。如果是,它将写到第二条(指令)磁带上,这是费马打底的,否则它将写入-1指令带。

接下来,检查指令指针处的值,然后执行以下操作之一:

  • -1 或更少:退出程序
  • 0:将数据磁带位置向左移动一个。将指令带位置向右移动一
  • 1:将数据磁带位置向右移动一。将指令带位置向右移动一
  • 2:增加数据磁带位置的值。将指令带位置向右移动一
  • 3:减小数据磁带位置的值。将指令带位置向右移动一
  • 4:如果当前数据磁带位置的值为零,则将指令磁带向右移动,直到达到或匹配的5值(或更大)或小于0。如果它是一个5(或更大),如果它小于,则再次右移指令指针,0然后退出程序。如果值为当前数据磁带位置不为零,则只需将指令磁带向右移动一
  • 5或更多:将指令指针移到左侧,直到达到相应的4值,或者发现小于的值0。如果是后者,请退出程序。

(通过匹配5(或更多)和4值,这意味着,当指令带遇到与初始命令相同的值(5(或更多)或4)时,在指令带上搜索适当的值时,将不得不跳过适当的数字搜索中的其他值(45分别(或更多))

循环执行,直到指令提示您必须退出程序。

程序退出时,从位置0开始在数据磁带上输出值,直到包含-1值的第一个磁带位置为止。

证明

请注意,该语言本质上映射到无IO的Brainfuck解释器,在该解释器中F_5必须能够执行任何类型的适当循环。

但是,根据费马素数猜想,只有5个费马素数F_0- F_4)。如果F_5存在,则该语言为图灵完备,因为我们知道Brainfuck是图灵完备。但是,如果没有,F_5您将无法执行分支或循环操作,从而将您锁定在非常简单的程序中。

实作

(使用ruby 2.3.1测试)

#!/usr/bin/env ruby
require 'prime'

CHEAT_MODE = false
DEBUG_MODE = false
NUM_CACHE = {}

def determine_number(n)
  return n.to_i if CHEAT_MODE
  n = n.to_i
  -1 if n<3

  return NUM_CACHE[n] if NUM_CACHE[n]

  i = 0

  loop do
    num = 2**(2**i) + 1
    if num == n && Prime.prime?(n)
      NUM_CACHE[n] = i
      break
    end
    if num > n
      NUM_CACHE[n] = -1
      break
    end
    i += 1
  end

  NUM_CACHE[n]
end

data_tape = Hash.new(-1)
instruction_tape = Hash.new(-1)

STDIN.read.each_char.with_index { |c,i| data_tape[i] = c.ord }
File.read(ARGV[0]).split.each.with_index do |n,i|
  instruction_tape[i] = determine_number(n)
end

data_pos = 0
instruction_pos = 0

while instruction_tape[instruction_pos] >= 0
  p data_tape, data_pos, instruction_tape, instruction_pos,'------------' if DEBUG_MODE

  case instruction_tape[instruction_pos]
  when 0 then data_pos -= 1; instruction_pos += 1
  when 1 then data_pos += 1; instruction_pos += 1
  when 2 then data_tape[data_pos] += 1; instruction_pos += 1
  when 3 then data_tape[data_pos] -= 1; instruction_pos += 1
  when 4 then
    if data_tape[data_pos] == 0
      count = 1
      instruction_pos += 1
      while count>0 && instruction_tape[instruction_pos] >= 0
        count += 1 if instruction_tape[instruction_pos] == 4
        count -= 1 if instruction_tape[instruction_pos] >= 5
        instruction_pos += 1
      end
      break if count != 0
    else
      instruction_pos += 1
    end
  else
    count = 1
    instruction_pos -= 1
    while count>0 && instruction_tape[instruction_pos] >= 0
      count += 1 if instruction_tape[instruction_pos] >= 5
      count -= 1 if instruction_tape[instruction_pos] == 4
      instruction_pos -= 1 if count>0
    end
    break if count != 0
  end
end

data_pos = 0

while data_tape[data_pos] >= 0
  print data_tape[data_pos].chr
  data_pos += 1
end

例子:

这将用换行符将其写到屏幕H(是的缩写Hello World!):

17 17 17 17 17 17 17 17 17 17
17 17 17 17 17 17 17 17 17 17
17 17 17 17 17 17 17 17 17 17
17 17 17 17 17 17 17 17 17 17
17 17 17 17 17 17 17 17 17 17
17 17 17 17 17 17 17 17 17 17
17 17 17 17 17 17 17 17 17 17
17 17 17
5
17 17 17 17 17 17 17 17 17 17
17

另存为example.fermat并以这种方式运行(注意:您始终需要输入):

$ echo -n '' | ./fermat.rb example.fermat

下一个示例将通过将输入的每个值加1来执行简单的Caesar样式密码。您显然必须替换?为第五届Fermat素数:

17 65537 5 17 ? 257

您可以通过启用作弊模式并2 4 1 2 5 3用作源代码来尝试其功能:

$ echo 'Hello' | ./fermat.rb example2_cheat.fermat

2
我为可怜的编码员不得不输入相应的素数感到遗憾5。我希望他们有一个好的键盘。
AdmBorkBork

2
@AdmBorkBork不用担心。它只具有比宇宙具有元素粒子更多的位。
fəˈnɛtɪk

@LliwTelracs实际上没有任何意义,因为宇宙中元素粒子的数量是Aleph-null(omega),从omega开始,它并不意味着数字的实际大小。(除非其aleph一个:P)
马修·卢

1
@MatthewRoh我犯了一个错误。我的意思是在可观察的宇宙中。
fəˈnɛtɪk

2
@MatthewRoh实际上,它可能是有限的,无限的,不可数的,甚至与集合论不一致!但是,我们永远不会知道:(
CalculatorFeline

10

椰子燕子v2

由于以前的版本存在错误,导致该比赛无效,并且我不希望该版本的以前版本的计数大为不同,因此该版本将作为新帖子提交。

如果可以对所有正整数证明Collat​​z猜想,则该语言不是图灵完备的。否则,该语言是图灵完整的。

该语言基于Cardinal

首先,使用公式
contVal = sum(sum(行的ASCII值)* 2 ^(第1行))计算程序的contVal。

接下来,在每个A或E处创建2个相反方向的吞下,并将所有条件转弯语句设置为等待初始化。
在E处创建的燕子朝左/右,在A处创建的燕子朝上/向下。

最后,代码将执行步骤,直到所有指针都已删除或contVal下降到一个为止。

在每个步骤中,如果contVal%2 == 0,它将除以2,否则,它将乘以3并加1。

命令:

0:将值设置为0
+ :将值递增1
>:将方向更改为右
v:将方向更改为向下
<:将方向更改为左
^:将方向更改为向上
R:将第一个指针之后的后续指针与指针的值进行比较第一个指针。如果相等,则直走,否则右转。
L:第一个指针之后的后续指针与第一个指针的值进行比较。如果相等,则直走,否则左转。
E:复制指针,但朝左和右方向
A:复制指针,但朝上和向下方向
?:如果值为0,则删除指针

说明:

如果可以针对所有正整数证明Collat​​z猜想,则使用该语言运行的任何程序的持续时间都是有限的,因为contVal将始终收敛为1,从而结束程序。

否则,我只需要证明该语言可以实现以下功能

增量:用+
常数表示0:用0表示
变量访问:变量在行进时存储为指针
语句连接:通过更改行进到操作的距离,可以更改执行操作的顺序
For循环:用这种语言

E   > V
    ^+R
      +
      A

将用作for循环>最多1(可以将更多代码添加到循环中)

同样,代码

Rv
^<

直到等于R循环中设置的条件值为止,将一直执行。


你也打败了我,我要去做科拉兹猜想。干得好,有趣的是。我只打算创造条件,只能够存储numbersif他们汇聚到1之间的语言
罗汉Jhunjhunwala

我糊涂了。Collat​​z函数在哪里体现出来?从第二次通读中,我认为您的意思是说该函数适用contVal于每个步骤(因此,如果猜想为真,则没有无限循环)-但我看不到答案中任何地方都明确指出了这一点。??
DLosc

抱歉,在执行此操作时,我认为我在某些时候不小心将其删除了
fəˈnɛtɪk

10

完美/完美

哇,那很有趣。

仅当存在无限个完美数时,完美/不完美才是完整的。如果存在,则称为完美,如果不存在,则称为不完美。在解决这个奥秘之前,它同时具有两个名称。

理想数字是一个除数等于该数字的数,所以6是一个理想数字,因为1+2+3=6

完善/完美具有以下功能:

完美/不完美是基于堆栈的,具有零索引堆栈。

命令:

p(x, y):将x推入第y个位置的堆栈。

z(x, y):将x推入yth位置的堆栈,摆脱之前在yth位置的内容

r(x):从堆栈中删除第x个项目

k(x):返回堆栈中的第x个项目

a(x, y):将x和y相加。与字符串一起使用时,会将它们按xy顺序放置在一起。

s(x, y):从x减去y。带字符串,从x删除最后一个len(y)

m(x, y):将x和y相乘。如果与字符串一起使用,则将x乘以len y。

d(x, y):x除以y

o(x):打印x

i(x, y):如果x的计算结果为true,则执行函数y

n():返回调用代码块的计数器。

q():返回堆栈的长度

t():用户输入

e(x, y):如果x是一个整数,如果x和y具有相同的值,则返回1。如果y是一个字符串,则它将得到y的长度。如果x是字符串,则将y转换为字符串,并检查它们是否相同,如果相同,则返回1。否则返回0。

l(x, y):如果x大于y,则返回1。如果有字符串,则使用字符串的长度。

b():停止程序。

c(x, y):先执行x,再执行y。

要获得与Python等效的效果and,请将两个值相乘。对于or,将值相加,对于not,将值从1中减去。这仅在值是1或0时才有效,这可以通过将数字除以自身来实现。

数据类型:整数和字符串。字符串用表示'',所有非整数都四舍五入。

句法:

代码由十秒内的嵌套函数组成{}。例如,一个将输入并打印添加的程序为:{o(a(t(), t()))}。在程序的后台,有一个计数器从0开始,每次执行一个代码块时,计数器就递增1。第一个代码块在处运行0,依此类推。一旦执行了十个代码块,则每当计数器达到一个完美的数字时,便执行第六个代码块。您无需使所有十个代码块都能正常工作,但是如果要进行循环,则需要7个代码块。为了更好地理解此语言的工作方式,请运行以下程序,该程序在每次计数器达到理想数字时都会打印计数器:{}{}{}{}{}{}{o(n())}

可以在以下位置找到解释器:repl.it/GL7S/37。选择1并在终端中键入代码,或者将代码粘贴到code.perfect选项卡中并在运行时选择2。尝试时会很有意义。

图灵完整性证明/缺少图灵完整性。

根据该软件工程堆栈交换文章,图灵完备必须能够具有条件重复跳跃的形式,并具有读取或写入内存的方式。它可以以堆栈的形式读取/写入内存,并且由于每次计数器达到一个完美数字时都会执行第6个代码块,因此它可以循环。如果存在无限数量的理想数,则它可以无限循环并完成图灵图,否则不是。

自位按位循环标记解释器,以5个字符(1或0)作为输入:

{p(t(),0)}{(p(t(),0)}{p(t(),0)}{p(t(),0)}{p(t(),0)}{p(0,0)}{c(i(e(k(s(q(),k(0))),0),c(r(q()),i(l(k(0),0),z(s(k(0),1),0)))),i(e(k(s(q(),k(0))),1),c(z(a(k(0),1),0),i(e(k(q()),1),p(k(s(q(),k(0))),1)))))}

它可以扩展为接受任意数量的字符作为输入。它可能需要无限的输入,但前提是存在无限的完美数字!


1
我认为您可能只是在为本地循环创建一个新值,因为它未与该函数共享。
fəˈnɛtɪk

3
就目前而言,您没有TC证明。您链接到的软件工程文章给出了一组粗略的要求,但是TC并不是一堆要检查的盒子。您将需要实现TC自动机(例如Minsky机器),或表明您的语言不确定。
精神分裂症O'Zaic,2017年

2
@WheatWizard在这里,我添加了一个按位循环标记解释器。可以对其进行修改以接受任意数量的字符作为输入。它可能以无限字符作为输入,但前提是存在无限完美数!
“ SparklePony同志” 17年

2
“一旦执行了十个代码块,则每当计数器达到一个完美数字时便执行第六个代码块。”那么解释器是否直接对完美数字进行计数?我觉得这与挑战精神背道而驰。实际的语言规范并没有多大关系,可以是图灵完备的加“仅在达到理想数字时才运行一步”的任何内容。
xnor

10

鞋底

如果Scholz猜想是真的,这种编程语言就是图灵完整的。

我之所以写这种语言,是因为@SztupY说过,不会有任何结果依赖于猜想而成为真实的图灵图

命令清单

+(x)      Increment x (INC)   
-(x)      Decrement x (DEC)  
j(x,y)    Jump to instruction x if y is 0 (JZ)  
x         End program (HALT) 

使用这些命令,该语言可以模拟Minsky机器

口译员

我强烈建议不要运行此程序。它使用非常慢的方法检查加法链。

图灵完整性

该语言使用计数器来计算运行的命令数,并根据Scholz猜想检查该计数器,以修改该语言的图文完整性。

如果Scholz猜想为真,则该程序的工作原理与正常的Minsky机器完全一样, 如果零 停止 ,则该机器具有
递增
递减
跳转

但是,如果Scholz猜想为假,则计数器最终将达到Scholz猜想不成立的值。由于该语言已设计为在达到Scholz猜想为假的数字时退出,因此该程序将在运行了那么多命令后每次退出。因此,所有程序的长度都将受到限制。由于这与图灵语言的完整要求不符,

“磁带不能固定长度,因为它不符合给定的定义,并且会严重限制机器可以执行的计算范围为线性有界自动机的计算范围”,

如果Scholz猜想是假的,那么语言就不会是图灵完整的


1
+1,因为这实际上使猜想要求难以接受,而不是在猜想为真/假时添加多余的内容以杀死语言
Gryphon

我不明白 您提供的命令恰好是模拟Minsky机器所需的命令,因此,仅此而已,无论Scholz猜想如何,您的语言都是图灵完备的。您的解释中一定缺少一些内容。
纳撒尼尔(Nathaniel)'18

@Nathaniel对图灵完整语言的要求之一是,该语言可能会陷入无限循环(停止问题)。我的代码在运行指令时开始计数,如果Scholz猜想为假,程序将在设置一定数量的指令后始终停止。
fəˈnɛtɪk

是的,但是您忘记了解释如果Scholz猜想是错误的,是什么导致它停止。再看看您的答案-根本没有答案。
纳撒尼尔(Nathaniel)'18

@Nathaniel该程序实际上是通过检查每个数字是否可以在scholz猜想中工作的。当找到与猜想不一致的数字时,它将自动退出。
fəˈnɛtɪk

9

订婚

订婚的Github

自述文件和规范位于github上的“ README.txt”下。

通常,“订婚”程序由成对的行组成,其长度是不同的孪生素数对或“订婚”对(不会发生重复)。通过在第二行中的对中找到第一行的“柔韧性子集”来执行程序。此类子集的数量,加上原始第二行与没有柔韧性子集的第二行之间的勒维什汀距离,共同决定要执行的命令。

我将摘录这篇文章的证据:

V. PROOF OF TURING COMPLETENESS

Now, no language can be Turing Complete with bounded program size. Therefore, if Betrothed
is Turing Complete, it must have unbounded program size. Since the lengths of the lines of
a Betrothed program must be twin prime pairs or betrothed pairs, and since both sequences
are unproven to be infinite or finite, Betrothed has unbounded program size if and only if
there are infintie betrothed pairs, there are infinite twin prime pairs, or both.

    Next: to prove that if Betrothed has an unbounded program size, then it is Turing
Complete. I will use the op-codes from the above table to demonstrate key factors of a
Turing Complete language; they are of the form  [index]<[ld]> .

  1. Conditional goto: 6<> 5<>, or if-popjump. This can be used to form a loop.
  2. Inequality to a constant K: 10<K> 
  3. Arbitrarily large variable space: you can use some separator constant C.

    With this, I have sufficient reason to believe that Betrothed is Turing Complete.

4
“现在,任何语言都不可能具有有限的程序大小。我对此声明感到困惑...一方面,确实是有限的程序大小,我们只能编写有限数量的不同程序,但另一方面,图灵完整性的一个通用证明是为不同的程序编写解释器图灵完整的语言,根本不需要程序的大小限制
Leo

1
好吧,传递给解释器的程序不需要放在解释器的代码中,而应该作为输入提供给解释器
Leo

7
@Leo。我要说的是,为了使该语言成为TC,它必须能够对要传递给解释器的程序进行编码(即,假设该语言没有输入命令。)想象一种具有以下命令的语言:b。这解释了一个BF程序,该程序放在其后,如b+++++.。但是,程序的大小限制为10个字符。尽管它可以解释BF,但它不能计算Turing机器可以计算的所有程序。
科纳·奥布莱恩

3
@EriktheOutgolfer与您的问题有关的主要问题是“它可以放入从输入中获取的BF程序...”为此,我强烈建议您阅读或重新阅读我以前的评论,尤其是第一句话。如果根据输入语言仅图灵完成,那么没有任何输入,图灵如何完成?也就是说,为了使该语言成为图灵完整的语言,该语言的程序本身必须对该程序进行编码。否则,将发现他们正在对输入中的程序进行编码,这不是有效的编程方式。
科纳·奥布莱恩

1
我认为这不是一个定点。此Esolang文章讨论了这个问题。(还存在一个问题,即以图灵完备的语言打印出所有可能的终止程序以及其输出的程序是否是图灵完备的演示;它不需要输入并且可以用有限长的程序来完成。)

5

和able平价

这种语言是基于是否存在具有相反奇偶性的友好数字

指令

x : End program if not on top line  
+ : increment stored value  
- : decrement stored value  
{ : set next goto x value to current x value
} : goto previous x value set by {  
j : Go down one line if the special value is an amicable number and the
    parity is opposite to the matching number (loops back to top). If the
    special value is not an amicable number and not on the top line, go up
    one line.  

控制流

程序从左到右反复循环,然后循环回到起始位置。如果遇到“ j”,它将检查该值以确定是否应更改行。如果该数字是与其匹配的奇偶性相等的友好数字,则它向下一行(循环回到顶部);否则,如果该数字是一个友好数字,则它不在上一行中向上一行。

仅当程序在顶行之外的任何行中到达x时,程序才能结束。

图灵完整性

假设有一对具有相反奇偶性的友好数字,该程序可用于模拟Minsky机器。

j,{和}可以用来模拟JZ(r,x),尽管它会检查友好数字而不是零。
+是INC(r)
-是DEC(r)
x是HALT

如果您不能离开第一行,则x和}命令什么都不做。除非程序为空程序,否则这将导致程序无法进入暂停状态。因此,在图灵完整性需要HALT状态的描述,该语言将是图灵不完整。

口译员


2

新队

免责声明:这有点混乱并且非常简单。这是我曾经写过的第一门语言,而猜想是我唯一理解的语言。我知道另一个用户对相同的答案有更长的答案,但是我还是决定写这个。

要用换行符书写,您必须有很多时间和换行符(\n)。这是基于勒让德猜想是正确的。每个运算符都必须落在以n = 1开头的Legendre猜想中的一个数字上。每当您有一个运算符时,都将取\ n的量并将其插入Legendre猜想中,并得到下一个素数\的范围。 n必须掉进去。因此,从开始做起,\n\n然后转移到一个运算符,然后\n在3个换行符处找到另一个运算符。现在,下一个是5,因此您添加\n\n并添加运算符,以确保最后一个运算符行中的换行符数量正确,并且处于我们开始的Legendre猜想的素数范围内。

数字(数组)就像变量。每次操作员运行(使用数字)时,它都会递增。

+ adds
- subtracts
/ divide
* multiply 
s sqrt
% mod
a push to vars
g sets stack to numbers
q pushes value of stack to numbers
i increment 
d decrement
r stops subtraction at 0
w turns back on subtraction past 0
[ starts loop
] ends loop runs until stack is 0
{ starts loop
} ends loop and loops until loops[ln] is 0
k increment loops

只要我们遵守规则的质数不受限制,该语言就具有非限定性的磁带。

明斯基机

\n\ng\nr\n\n[\n\nd\n\n\n\n]

这个怎么运作:

\n\ng     # the first two newlines are to get to a prime number of newlines (2) then sets the value of stack to the first variable in the array numbers (see code in link)

\nr       # gets to the next number and makes it so subtraction stops at 0

\n\n[     # starts the loop

\n\nd     # decrements stack 

\n\n\n\n] # ends loop

KhanAcademy上尝试一下。


@wheat它不需要使用非有限内存循环
Christopher

它只有在为真时才有效。我无法像现在在移动设备上一样立即完成撰写,但今晚要完成任务
Christopher

即使您有无限的内存,您仍然需要能够无限循环。
Pavel

我有循环。试图使它们无限
Christopher

现在他们坠毁了
Christopher

2

塔吉斯

Taggis是一种基于标签系统的语言。

Taggis的巡演完整性基于Collat​​z猜想

句法

Taggis程序的语法只是三个字符串(生产规则),三个字符串完全由字母a,b和c组成,并用空格分隔。

执行

Taggis唯一的程序状态是由相同的三个字符组成的字符串。

Taggis实现了TS(3,2)标签系统,其中在每个步骤中,都会删除当前“标签”的前2个字母,而位于该已删除部分中的第一个字母会在其末尾附加其对应的生产规则字符串。

例如,Taggis程序bc a aaa实现了3n + 1问题,其中迭代由相应的as 表示,并且3n + 1步骤被(3n + 1)/ 2 [1]替换,从而导致程序输出:

aaa // 3
  abc
    cbc
      caaa
        aaaaa // 5
          aaabc
            abcbc
              cbcbc
                cbcaaa
                  caaaaaa
                    aaaaaaaa // 8
                      aaaaaabc
                        aaaabcbc
                          aabcbcbc
                            bcbcbcbc
                              bcbcbca
                                bcbcaa
                                  bcaaa
                                    aaaa // 4
                                      aabc
                                        bcbc
                                          bca
                                            aa // 2
                                              bc
                                                a // 1 and halt because we then begin an infinite loop
                                                 HALT

图灵完整性

当然,这个简单的系统似乎太简单了,无法模仿Turing的完整性,但是事实证明,任何具有2个符号的Turing机器(包括通用机器的类)都可以转换为从头部去除2个字符的标记系统,和32 * m生产规则,其中m图灵机中的状态数。

已知的最小的只有2个符号的通用图灵机使用18个状态,因此相应的标签系统包含多达576条生产规则[2]。

但是,具有3个生成和2个删除的符号的所有标记系统的集合的计算类别与Collat​​z猜想有关[2]。如果Collat​​z猜想被证明是错误的,那么Taggis是图灵完备的。否则,它基于数学中另一个未解决的问题,找到了比

def taggis(inp, a, b, c):
    current = inp
    seen = set()
    while True:
        seen.add(tuple(current))

        yield current

        head = current[0]

        current = current[2:]

        current.extend([a, b, c][head])

        if tuple(current) in seen:
            return

def parse():
    program = input().split(" ")

    assert len(program) == 3, "There has to be exactly 3 production rules!" 

    productions = []

    for production in program:

        production = [{"a": 0, "b": 1, "c": 2}[x] for x in production]
        productions.append(production)  

    program_input = [{"a": 0, "b": 1, "c": 2}[x] for x in input()]

    k = 0   

    for step in taggis(program_input, *productions):
        print(' ' * k +''.join(['abc'[x] for x in step]))

        k += 2
    print(' ' * (k - 1) + 'HALT')

parse()
  1. 这相当于原始的Collat​​z函数,因为奇数的3n +1 n始终为偶数,因此可以自动应用除法

  2. 标签系统和类似Collat​​z的功能Liesbeth De Mol

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.