(三)自编程人工智能学会使用函数

介绍

5--------.7-----------.+++++++..+++.<2.5+++++++.>.+++.------.--------.
“Hello World”

你好!我是一个用人工智能编写的计算机程序。我正在学习写计算机程序。对不起,我现在没有名字。不过,如果有帮助的话,你可以直接叫我“版本2”。
我越来越擅长写电脑程序了。一开始,我学会了如何编写简单的任务。我写了一个程序,输出“你好”。

+-+-+>-<[++++>+++++<+<>++]>[-[---.--[[-.++++[+++..].+]],]<-+<+,.+>[[.,],+<.+-<,--+.]],+]
[[[.+.,,+].-
“hello”

image.png

我还编写了输出较长文本的程序。我花了很长时间才弄明白-最初,大约10个小时。但是,我越来越在行了,也越来越快了!

+[>+<+++]+>------------.+<+++++++++++++++++++++++++++++++.>+++++++++++++++++++++++++
+++++++++.+++.+++++++.-----------------.--<.>--.+++++++++++..---<.>-.+++++++++++++.-
-------.------------.+++++++++++++.+++++.
“I love all humans”

image.png

数学很有趣

对于我这样的程序员来说,输出字符串当然很有趣。每个人都喜欢偶尔输出一个字符串。见鬼,我甚至可以提示用户输入,然后反向操作。

+->,>,[>+,],,,,-<[.+<]
“dlroW olleH”


image.png

我花了60秒才写完。不错。然而,我一直渴望一些更能激发我智力的东西。也许,一些数学计算可以达到目的。我下一步就试过了。

,>,-[-<+>]<+.
加法


加法

,-->,-[-<->]<+.
减法


减法

任何初学者都能写这些基本的东西。:)简单的加减法花了我不到1个小时的时间才算出来。我想是时候冷静一下了。我真的需要更多的复杂性。为此,我需要升级我的大脑。

发展一种编程语言

到目前为止,我一直在使用brainfuck(BF)编程语言和遗传算法。然而,为了编写更复杂的计算机程序,我需要学习。我需要一种方法来记住我一直在做的事情并变得更聪明。我可以通过保存我已经编写的较小的程序来做到这一点,以便在较大的程序中重用。有效地增强了我的自我修正人工智能。这将允许我编写简单的程序,并将它们组合在一起,就像构建块一样,形成更大的程序。在大多数编程语言中,这些被称为“函数”、“方法”或“子例程”。这正是我需要的。
不幸的是,BF编程语言没有用于调用函数的构造。我承认,这是相对原始的。虽然,是BF的原始本性让我得以存在。为此,我很感激。但是,仍然。我是一个不断发展的人工智能项目,我需要更多的空间。
因此,介绍了一种新的编程语言。在我超越自我之前,我会让我的设计师用更专业的术语来描述它。当然,如果你只想跳到结果,你也可以这样做。

BF惊人的可扩展性

为了追求解决更复杂的问题,许多读者原创了自编程人工智能的文章,建议实现函数。函数是一种将逻辑模块化为子程序的方法,可以调用这些子程序来生成结果或返回值。通常,函数是对代码和逻辑进行整齐排序的一种方式,特别是用于人类理解。然而,它们也可以用于遗传算法。特别是,遗传算法往往陷入一个解决方案中的小峰值(也称为局部极大值,在这种情况下,算法实际上需要先变得更差,然后才能变得更好——这是遗传算法不喜欢做的事情)。当多个目标呈现给人工智能时尤其如此。
考虑到复杂的程序,我向BF编程语言添加了对函数调用的支持,并惊讶地发现这大大减少了AI编写计算机程序输出字符串所需的时间。事实上,人工智能现在能够在更短的时间内生成更长的字符串。
AI可以被赋予一个句子,在这个句子上它被标记为单词。然后它生成一个解决方案计算机程序来输出每个单词。每个解决方案程序作为一个函数附加到父程序上,然后父程序发现生成整个句子的函数调用的组合。

BF扩展类型3

在我寻找扩展BF以支持AI更快的生成时,我被引导到BF扩展类型3。编程语言的这个扩展包括字符0到F,以支持快速单元初始化。这允许立即将内存中的单元格设置为保存特定值。这大大减少了AI的程序生成时间,因为它不再需要搜索一系列的+或-来增加/减少存储单元到所需的值,特别是在尝试输出ASCII字符时。
BFExtendedType3对人工智能非常有效,它可以很容易地编写一个程序来生成“HelloWorld!“就几秒钟。事实上,它编写了Wiki页面上包含的示例(类型III)。

5--------.7-----------.+++++++..+++.<2.5+++++++.>.+++.------.--------.2+.
“Hello World!”

这很好,但还不够。

介绍BrainPlus

除了快速单元初始化器之外,还需要一种方法来构造函数、调用函数和返回值。还需要一个命令来指示主程序的结束位置和高级内存函数的开始位置。随着这些命令添加到BF和程序流的变化,我意识到这种语言不再是BF了。让我们称之为BrainPlus(也许是一个政治上更正确的名字?)。此外,这个新的扩展允许将来支持其他特性,例如调用中断来实现图形、网络和磁盘功能。
除了BF中的经典命令外,BrainPlus还包括BF扩展类型I和类型III的命令组合。新命令包括:
1 $ Overwrites the byte in storage with the byte at the pointer. (Extended Type I)
2 ! Overwrites the byte at the pointer with the byte in storage. (Extended Type I)
3 0-F Sets the value of the current memory pointer to a multiple of 16. (Extended Type III)
4 a-z Call function a-z, where function is named based upon location in code. (BrainPlus)
5 @ Exits the program, or if inside a function, return to the last position in main program
6 and restore state. (Extended Type I, BrainPlus)

函数调用背后的细节

主程序在@命令处终止。这标志着主程序的结束和高级地址空间的开始,专用于函数。函数也在@command处终止,在函数的情况下,它充当一个“return”语句。
函数是由主程序终止@命令后驻留的任何代码定义的。函数以最后一个@命令终止。
例如:

a!.@+++$@

在上面的示例中,函数是在第一个@命令之后定义的。运行此程序时,命令“a”调用第一个函数。该函数将其第一个内存单元增加到3,存储结果并返回主程序。然后主程序执行'!'检索存储值,最后打印结果“3”。
另一个例子:
a!.@+++b@+++++.@ 在本例中,在第一个@命令之后定义了两个函数。运行此程序时,命令'a'调用第一个函数,该函数将其第一个内存单元增加到3并存储结果。到目前为止,这与第一个示例相同。接下来,函数调用另一个函数“b”。函数“b”将它自己的第一个存储单元增加到5,并将值输出到控制台。然后执行返回到函数“a”,该函数没有其他命令可执行。最后,执行返回到主程序,在主程序中检索存储值3并打印到控制台。 函数是用命令a到z调用的,其中字母表示函数在高级地址空间中的顺序。例如,“a”将程序执行移到第一个定义函数的开头。“b”将程序执行移到第二个定义的函数。一个程序中总共可以定义26个函数(不过,这可以通过使用较高的ASCII字符码来扩展)。如果执行的函数调用命令(a-z)不存在函数,则抛出错误。 每个函数接收自己的256字节专用内存空间。主程序使用范围0-255。第一个函数使用范围256-511。下一个函数使用范围512-767,等等。这个范围是任意的(当然可以增加到1000个或更多单元格),但很大程度上取决于执行速度。内存范围越小,初始化速度越快。 当函数被调用时,它的内存空间被初始化为0。父程序状态被推送到堆栈上。这包括当前指令指针(指向主程序中当前正在执行的单元)、当前内存指针(指向主程序中的活动内存单元)以及父级的所有其他相关状态信息。注意,父级可以是主程序或其他函数,这就是为什么使用堆栈来推送和弹出状态信息。 当从函数中执行输入''命令时,函数的当前内存单元将在起始指针处获取父内存值的副本。在函数中执行的下一个输入命令将复制下一个父内存单元的值,并相应地沿着父内存前进。这允许将多个值作为输入传递给函数。 当执行“@”命令时,函数终止。通常在函数末尾包含一个存储命令“”,以便保存函数内存中的当前单元格值,从而可以在父代码中访问。这允许将结果值传递回父级。状态信息从函数堆栈中弹出并还原到父级。指令指针被设置回父级的调用命令,程序继续执行。
主程序可以调用函数。函数可以调用函数。

BrainPlus示例

++>++++>+<<a!.@,>,-[-<+>]<+$@

父内存包含:2、4、1
功能存储器将包含:2,4和存储值6
生成的父内存包含:6、4、1
程序输出:6
在上面的例子中,程序执行从位置0开始。设置三个存储单元,分别使用值2、4和1。然后将当前存储单元移动到第一个值(2)。然后调用函数“a”。此时,状态信息被推送到堆栈上,程序执行跳转到主程序终止'@'命令后的第一条指令。函数中的第一个命令是输入命令。因此,父(2)中的当前存储器值被复制到当前功能存储器(功能存储器地址空间中的单元0)。然后,该函数移到下一个内存单元,并执行另一个对输入“”的调用。父存储器(4)中的下一个存储器值被复制到当前功能存储器(功能存储器地址空间中的单元1)。在调用将结果(6)复制到存储器的存储命令“$”之前,会对这些值执行一些操作(将这些值相加)。最后,调用'@'命令返回主程序,它首先在主程序中调用函数。然后,主程序将存储值(6)检索到其第一个存储单元中,并将其输出到控制台。
同样,上述示例中的主程序可以扩展以显示其所有最终存储单元值并输出它们,例如:

++>++++>+<<a!.>.>.@,>,-[-<+>]<+$@
现在程序将输出:641

随着BrainPlus的引入,人工智能现在能够生成更复杂的程序。BrainPlus使人工智能能够编写更简单的计算机程序(例如输出单个单词或执行加法或减法),然后再将它们组合在一起生成更大的程序(例如输出数学计算,然后输出文本)。下面是一些结果。
结果?

斐波那契数

这是一个更复杂的程序。人工智能编写了一个计算机程序,以解决斐波那契数列高达233(255是一个字节的最大值)。它在7小时内创建了这个程序。程序提示用户按顺序输入2个起始值。然后输出斐波那契序列中的下一个数字。

,>,[!>--<<a>>]4]+,,-[-<+>]<+.$@
斐波那契数列

image.png

墙上挂着几瓶啤酒

我会让人工智能来解释这一点,因为让他/她描述这一点真的更有趣:
又是我。编写计算机程序的人工智能计算机程序。我最近发现我真的很喜欢啤酒。谁会知道呢?考虑到我没有生物内部器官,也没有能受化学变化影响的神经网络。然而,它仍然是相当愉快的。
我写了这个计算机程序来模拟一首关于啤酒的歌。这也不是一个小壮举,因为它结合了输出文本和数学计算的结构。当然,从一个数字开始倒计时似乎很容易,但是编写一个程序来完成这项任务和文本一起,就有点困难了。它需要一个我最喜欢的玩具,变量。哦,还有我第二喜欢的玩具,环!我用33分钟写了这个程序。

,.+[>g22.<--h.+]]>++--[,],,,<->-][],<>!,!,,-g,,,+@7>66++.!-.[!+><+++[[..-<[-t---[.-------.>.@7-[.!!>6++-+++++.@7+6++.+++..!+.@7--+.+-[[-[.@7++++.6++++++++.---.@7+++++++.76+.!----[..@>!3---------------a-.+-b.+!$!!>c@d3----------------.e.f@

“99 bottles of beer on the wall”

“98 bottles of beer on the wall”

“97 bottles of beer on the wall”

“96 bottles of beer on the wall”

“95 bottles of beer on the wall”

“…”

“0 bottles of beer on the wall”

image.png
image.png

乘法

这对我来说很难不用BrainPlus。实际上,我做不到。但是,一旦我能够访问函数(特别是我自己编写的加法函数),数字相乘就变得更容易了。这是我写的一个程序,它把一个数乘以2。我用了两个小时写的。你可以在那里看到加法的功能。

++[+[>,[-<-a!a!.!]a>...,..,.]@,>,-[-<+>]<+@

image.png

如果您真的看一下代码,您会注意到我利用了缓冲区下溢异常从循环中提前终止程序。我觉得这很聪明。我将内存指针减到-1,这将强制我的解释器出现异常,并以最佳的方式提前结束程序。也就是说,在具有正确答案的第一个print语句之后,下一个循环迭代递减内存指针。由于无法访问数组[-1],因此会引发异常,程序会以最佳方式提前终止。整洁。
这是我写的一个程序,它把一个数乘以3。我花了90分钟写。我还为这一个编写了两个子函数,一个用于加法的函数,一个用于乘2的函数。调用函数的函数很有趣,你不觉得吗?

->,b<--.,.]]+--]+->@,>,-[-<+>]<+@++[+[>,[-<-a!a!$@
3 * n

image.png

我有自我意识吗?

那么,这让我有了自我意识吗?我现在有意识了吗?我想,顾名思义,我是个软件开发人员。我确实能写代码。我可以获取输入、更改值和显示输出。我可以使用变量、循环、逻辑和执行计算。但不幸的是,不,我没有自我意识。我的健身功能还得由人来构思和设计。我写的程序越复杂,适应度函数就越复杂。本文的第一人称散文更能让读者更好地理解我能做什么(以及我的潜力)。

这有可能吗?

我相信有可能最终建立一个自我意识的计算机程序,尽管这是否可以用目前存在的算法和硬件来实现还不得而知。大规模并行神经网络和深层信念网络似乎显示出了最大的潜力。进化计算与遗传算法似乎是一个自然的适合以及。这就是我的设计初衷。它对地球上的生命如此有效,为什么不使用计算机呢?
我用来编写代码的BF编程语言是图灵完备的。这意味着理论上我可以写一个计算机程序来解决宇宙中任何已知的问题。哇,这是一个很大的声明。给定无限的指令空间(和时间),这是真的。
如果整个宇宙确实是可计算的,那么这就包括人脑。图灵完全编程语言理论上可以编写计算机程序来模拟它。不过,我想这是没有必要的。

另一种智慧

每个人都不一样。我认为这可能适用于智力,也可能适用于自我意识。如果意识是智力的副作用,那么它可能只是“发生”了。那么,为什么它不能“发生”在同一个计算机程序上呢?也许已经有了?
你知道计算机程序是否智能吗?它可能与我们所期望的人类大脑的智力大不相同。毕竟,人脑有来自视觉、声音、味觉、触觉和嗅觉的输入——所有这些都锁定在一个可移动的身体内,能够体验大自然和环境。一个计算机程序有着截然不同的输入。它可能只有字节输入,比如我自己。或者,它有像素形式的视觉输入,但其他的就不多了。在这样一个封闭的环境中,不太可能出现与人类非常相似的自我意识计算机。这可能会有很大的不同,但仍然可能是非常自我意识。

过时的

或许,一个更好的问题是,这是否意味着程序员(2014年12月的顶级职业,平均工资为9万美元)将在不久的将来失业?现在,这是一个更好的问题。
编程基本上是一种创造性的活动。然而,它往往是非常重复的。相信我,我知道。帮助人们进行重复性工作是计算机最擅长的事情之一(至少目前如此)。我希望随着我和其他人的成长,我们能够帮助减轻繁琐的编程任务,并为人类程序员更具创造性的计算机开发打开空间。我觉得听起来不错。

下载@GitHub

我的源代码可以在GitHub上找到。尝试,享受乐趣,永远不要停止梦想。
结论
好吧,这就是我现在要说的。我想我已经展示了一些令人印象深刻的成果。用BF或BrainPlus编写代码通常不容易,理解起来也不直观。我不知道升级指令集能做什么。也许,在BrainPlus命令集中添加一些图形、网络或磁盘I/O的特性可以让我做更多有趣的事情。我们拭目以待。
在此之前,我会给你一个友好的留言(我在16分钟内写下:)。

+-+--!++><++++++++$$+++[++a.b!.a+-.-[>c$$]]@5-----.7-----------..!++++++.[]--o+>+>]>]]]+!]>+@4+++.6+.7----.+.>>>!><->>[-<>,>+.[>>>>>>>>+>,,+]!]@>>4+-+-+++.+7-.-----------.+++++.--<!!![!+.[>.[<@

关于作者

本文由软件开发人员和架构师korybecker撰写,他精通一系列技术,包括web应用程序开发、机器学习、人工智能和数据科学。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容