引言

本文旨在利用计算机领域相关知识(含架空)将《命运石之门》世界观的相关设定以及内部逻辑进行汇总和抽象,形成一个较为完备的体系。(同时预热一下鸽了6年的匿名代码)
文章内容尽量不涉入太多过于专业的计算机相关术语。意在分享,所以仅以通俗易懂的方式展现石头门世界观的深邃与计算机的魅力。

起初想到这样的拟合是在和群友探讨石学时产生的脑洞,之后也在逐步完善其理论体系,希望能达到一个抛砖引玉的作用,引发各位的思考,发展石学研究。

本文将分为三个大篇章,即:基础篇进阶篇实例篇

  • 基础篇将笼统的介绍世界观中关于“世界线变动与世界重构”、“单一世界多可能性世界线”、“因果决定收束”等部分,以及石头门中涉及的三种穿越仪器在本体系下的作用机理。
  • 进阶篇则是介绍凶真的Reading Steiner对本体系的影响、剧场版中的“R世界线”的定义即存在的必要性,以及本体系中本人(以及相关贡献者)引入石学的新概念:行动概率等。
  • 实例篇将会引用以上提到的各种概念来解释《命运石之门》系列作品中的相关的,能自圆其说的剧情,大部分内容可能会以类似于QA的形式呈现。

注:本文首发于百度贴吧:命运石之门吧、微博(石头门超话)、知乎、B站专栏

==未经许可谢绝转载==


前言

在正文开始前,我需要大家从现在起就建立起一个可能全新的思考共识:世界就是一个计算机程序

因此我们需要跳脱于低维的人物视角层面,以一个较高维的角度来审视剧情。这样更有利于对本文甚至是对石头门本身的理解,望周知。

也因此本文之后提到的各种理论和设定也基于这个 “共识”。

撒,哈吉马璐哟!

1.1 历史进程|即时演算算法

1.1.1 世界的架构

我们将“世界”这整个框架分为以下几个区域。分别是:

  1. 世界的核心区域——对象区
  2. 使世界能得以运行的程序区
  3. 能够让程序得以优化和合理运行的静态全局事件区以及高速缓存/回收区

它们的分布大致如下图所示

【插入图片】

我也会在之后的章节中详细介绍到它们。

1.1.2 什么是历史进程

在对历史进程下定义前,请大家随我亲自创造出一个世界。

首先打开手中的笔记本军事版,进入 世界模拟器,在工作台里找到【对象区】。

我们在对象区进行如下操作:

  1. 新建一个class类对象:世界(world)
  2. 随后再创建一个 星球(plant)对象,命名为 地球(earth)
  3. 紧接着,新建两个生命体对象,分别命名为亚当和夏娃。

【插入图片】

这样我们的类对象就建立好了。

接下来我们转到【程序区】,对我们的对象进行初始化

例如,地球这个对象的 是否有生命体 属性(HasLife)我们置为True,然后设置亚当夏娃的性别年龄以及出生坐标(这里我们将坐标设置在地球上)等等属性。

全部设置好之后,我们使用如下代码,让世界运行起来。

1
2
World.Run();//在某个随机线程上运行世界
print(world);//返回结果是<type_id=Line1>,得到世界运行时所在的线程ID

这里的Line1指的是程序区里其中一条线程,而且我们规定每个世界只能在一条线程上实际运行

之后,亚当和夏娃便被系统根据我们的初始化自动初始化他们的记忆,并在地球上生活了。

我们的“生命体对象”内置有许多方法(函数)供这些生命体自行探索,例如:

1
2
3
4
EatFood(object.name);//进食
SelfTalk(txt,object);//自主交谈
Sex(object);//与某人共度一晚
MakeNewFuns(string FunctionName);//创造新功能

其中,我们提供了这些智慧生命体MakeNewFuns()的功能,让他们能够自己丰富自己的世界。当然,我们也会限制他们开拓的上限,确保他们不会发现自己本身的存在只是程序。

回到正题,当整个世界在Line1线程上启动运行之后,我们提供了足够的自由度给这些“自由生命体”,而他们在该世界上截至目前为止的所作所为就被称为历史进程

如下图所示,他们经历过的,被他们称之为历史的部分则是Line1线程上被涂黑的部分。

【插入图片】


自2012年Amadeus宣布问世之后,各路科学家以及计算机大牛介入,制造出了和Amadeus类似的人工智能的“生命体”。

但是这类生命体依托于计算机程序,且不像Amadeus一样知道自己是身为AI存在的。我们通过代码创造出了他们并对他们初始化之后,他们便拥有着自己的意识,在自己认为的世界里像人类一样生活。

而政府在2035年研发出了一款名为 WinWDL 的操作系统,内置了这样的应用程序,民间称为 地球模拟器,可以方便人们观察和预测未来。

(架空)

1.1.2 事件思想

即时演算算法

为了更好的模拟现实,世界模拟程序使用了这样一个算法:即时演算算法

前面我们提到的 “生命体的自由活动” 也是得益于该算法的强大。

简单来说,此算法可以通过生命体的自由意识,以因果逻辑的形式主动提供事件。

举个例子,当亚当和夏娃都自发的调用了自身的函数Sex()之后,本算法会随机性的自动在对象区创建一个新的生命体对象,并设置父母属性为亚当夏娃,然后将其诞生时长设置为10个月等等。

所以,本算法因为能够实时的反应生命体的想法并对世界历史进行演算和拓展。也就是说前面我们提到的,世界进程的“画黑线”这一步骤,就是由该算法实现的。

该算法被广泛利用于世界模拟程序的各个地方,甚至不只是正在运行的线程(如:Line1),就连其他线程也能够实时推演(这将在下一章节中着重提及)。

随机事件

即时演算算法还引用了“随机事件”的概念。即是说:除了通过因果关系扩充世界进程外,算法自身也会随机产生一些事件。

如在线程时间戳[^1] 为2000年的时侯,算法生成了一个随机事件“地震”,地震时间和坐标设置为2009年的涉谷。那么,当前线程(当前世界)就产生了一个必须发生的事件,那就是2009年涉谷地震。

这个事件是无论里面的生命体怎么处理也是改变不了的,除非能够退回到该算法生成这条事件语句之前。这可能吗?事实上,是可以的,但是这只是对于我们程序员来说,而对于线程里面的生命体来说,这就宛如洪荒之力不可逆转(这将在下一章节着重提及)。


总而言之,某线程上的世界得以正常运行,就是对象区的对象和算法提供的有限个事件的有机结合的体现。这里需要大家拥有这种事件思想

1.1.3 初识行动概率

通过对以上相关概念的介绍,我们知道了即时演算算法的灵活性和随机性,当然也知晓了该算法对于程序里的人来说,拥有“预测未来”的能力。比如能预测亚当夏娃哪一次执行的Sex()会产生新的生命体,比如能预测2009年的涉谷地震等等。

但是,该算法也并不是万能的。这也是“即时”一词的体现。比如,算法可能能够预测你未来一天的所有行动,但是不能预测你未来一年内的行动(除非有严格的因果关系来保证)。

不仅如此,当出现程序也无法预知结果的时候,世界进程甚至无法预计哪怕一天的未来。

这是算法不完备的体现,也是灵活性的体现。举个简单的例子,在线程中实际运行的某个世界上,有人玩了一下摇摇乐的游戏,若该游戏保证完全随机和公平,那么算法就无法提前预测出玩这个玩家抽到的号码。算法只能停止预测未来,先在这一时刻随机出结果后,才能继续运行。

(就像你看视频一样,网络好的时候能缓存出后面的内容,网络不好的时候进度条停滞不前)

上述例子尤为重要,算法虽然能够按照因果律安排未来,但是不能强行安排未来(除非是前面提到的是算法自身发出的随机事件:涉谷地震)。

当且仅当某事件会发生的概率高达**86.332%**时,算法才会“慢慢前进”进行演算。

这就是行动概率,关于行动概率,我会在进阶篇展开进行讨论。


1.2 时间机器|全局事件接口

通过前面的描述,我们已经初步了解一个世界在一个线程中是如何运行的。

而接下来我们将着重讲解作为程序员又该如何通过一些可用的函数接口对世界的历史进程进行合理规划

可能有人会问,已经有十分智能的AI算法帮助实时演算历史进程了,为什么还需要我们进行人工干预呢?

诚然,AI确实强大,但是AI只能演算进程却不能干预历史。这虽然保证了世界的自由运行,但是对于站在高维的我们来说,如果虚拟世界的发展并不是我们所期望的那样的话,就很困扰了。

例如,我们仅仅在对象区创建单细胞生命体,让其直接在地球上自由活动。可最终并没有进化出人类,反而是进化出了恐龙。显然这不是我们想看到的,而算法对此也无可奈何,所以我们就不得不进行人工干预了。

而在上一篇章中,我们对“事件思想”这一核心概念花了很多笔墨,主要是需要大家理解一点:历史进程是通过一个个事件的集合来推进的。

所以,要想干预世界历史进程的发展,我们需要的控制接口被定义为“全局事件接口”。

1.2.1 什么是全局事件接口

部分事件接口的使用

在计算机应用程序开发当中,程序员一般会在制作一款应用时留有供自己进行软件测试的*“interface”*,而这些被预留出来的“功能”一般是不能让用户直接使用的,所以会在软件正式发行的版本中去除。
当然,也有一些接口基本不会对软件造成影响,那么如果制作组想的话就会留下来,等待用户的发现。

如我们熟知的《魂斗罗》如果通过手柄按下了“↑↑↓↓←→←→BABA”,就会进入“作弊模式”。这些喜闻乐见的模式也被游戏届冠以“彩蛋”等称号。
(当然,彩蛋往往也不单单指程序员调BUG时所用的接口,还有很多制作组精心设计到游戏中的neta等等)

回到正题,“世界模拟器”同样也有这样供我们调BUG用的“功能开关”。

由于接口众多,这里仅列出常常使用的接口:

1
2
3
SaveProcess(World);//保存进程
LoadProcess(World);//读取进程
InsertThings(object,SetTime);//插入

前二者可以对世界发展进行保存和读取,类似于文字冒险类游戏的存档与读档。(Anonymous;Code)

最后一个函数是本节的重点内容,即在世界历史进程中设定的某个时间点(SetTime)直接插入某一事物object,这个事物可以是文本信息text、数据流datas甚至是一个实体的对象。(Steins;Gate)

特别是直接Insert一个对象时,如果时间点设置为当前时间,那么从下层的生命体的视角上来看,相当于调用接口者直接从某不知名的空间(狄拉克之海)直接将实体到“现实”中。(Chaos系列)

为什么是全局

全局(global)的接口进行的操作可以作用于所有线程,在一定程度上使得世界的历史进程在跨线程推演时也能够保留我们Insert进去的事件,不会被覆盖。

这是出于对历史演变的 稳定性 考虑。

上述描述中出现了“一定程度上……保留”、“跨线程推演”的字样,这表明事实上Insert的事件也是可以被覆盖掉的。这将在下一节展开讨论。

1.2.2 石头门中的接口发展

被科研界称之为命运石之门(Steins;Gate,下称SG)的世界是目前在几乎没有人为干预下发展得 的世界,该世界包含了与现实世界几乎一样的配置,地球人的科技发展水平也与现实高度相似。

当然,这也是我们军事上迫切需要模拟出来的世界。由于目前仍处于发展期,所以我们尚未进行过多的干预。

可是让我们没想到的是,这个世界的人类似乎没那么好控制……

在SG里,某个名为冈部伦太郎(Okabe Rintaro)的人类由于自己瞎搞的实验,阴差阳错与我们的Insert()接口产生了对接。

简而言之就是,他那被称为“电话微波炉(暂定)”的机器连通了本接口,使得本因作为世界模拟器对象的他们也能够自己对世界历史进程进行篡改。

一开始由于性能压制,只能传输字节不多的text文本信息,这被他们一些人称为D-mail,然而之后他们又进一步探索,开发出了能够传输记忆的机器,在他们看来这叫Time Leap,更离谱的是,他们之后开发出了能够传输实体Object的 时间机器。

虽说强大的AI算法能够帮助我们进行历史推演,而且算法还会对对象出现进行初始化的操作,初始化之后的他们的记忆等各种属性都会根据算法的因果逻辑自动重写,这可以有效减轻我们的担忧,但貌似事情还是没能得到改进……

(架空)


1.3 过渡线|跨线程推演

1.3.1 线程在石头门中的地位

1.3.2 推演的过程

(因果逻辑的推演)

1.3.3 推演导致的信息隐藏现象

1.3.4 以事件划分线程范围

(AF理论)

1.4 世界重构|实体指针

1.4.1 实体指针的含义

1.4.2 关于面向对象

1.4.3 重构实例

(举例说明,串一下前面的内容)