主题: 荏苒语如何理解“假如”(counterfactual) |
From: sicusa |
日期: 2021/8/1 上午12:51 |
收件人: "list@gilatod.art" <list@gilatod.art> |
在荏苒语中,任何文段会先被编译成底层的代码(这是一种结构化的树形代码,类似于 Lisp 而非汇编),为了简单起见我会略过代码的细节而仅概括其内容与目的。
我们先从一句简单的称述句开始:
Ae'a jata bilatom.
亚夜 是 虚无。
这句话被荏苒语编译器编译过后会得到一个指令,用中文的伪代码表示是:
声明 "是" {主语 = 亚夜, 表语 = 虚无}
可以看到这个指令由三部分构成:
1. 指令头:用来标记指令的类型。这里出现的是用来向推演系统增添一个新的事实的指令:“声明”。
2. 动词词根。
3. 参数表:句法元素。
荏苒语的推演系统(相当于计算机的 CPU)读取这段指令,就相当于立刻为系统内增加了一个事实“亚夜是虚无”。
当下一次我们试图向推演系统询问“亚夜是否是虚无”,或者“亚夜是什么?”的时候(这些问句也会被转换成相应的底层代码,这里不再赘述),推演系统就会去到相关的事实里去找有没有符合问题或断言的(这里面有一大堆细分结构和优化,也是推演系统最复杂的部分)。
现在关键来了:“声明”指令可以有第四个部分,被称为“约束表”(Constraints)。
约束表可以看成是状语的集合。例如,我们可以给刚才那一句话加一个副词 jepaf(抽象的来说):
Jepaf, Ae'a jata bilatom.
抽象地来说,亚夜是虚无。
这句话会被编译成:
声明 "是" {主语 = 亚夜, 表语 = 虚无} [抽象地来说]
伪代码便多了一个约束表,这个表里有一个约束:抽象地来说。
荏苒语的副词分为描述性副词(以 f 结尾)和限定性副词(以 t 结尾)。这里的 jepaf 就是描述性的,也就是说,它会被推演系统视作为构成事实的一部分。这条指令的工作流程如下:
1. 首先 ("是", {主语 = 亚夜, 表语 = 虚无}, [抽象地来说]) 这个三元组(也就是“抽象地来说,亚夜是虚无”这句话)会被“对象化”(也就是和“亚夜”、“虚无”这些概念一样变成一个被记录下来的名词性实体)
2. 接着推演系统又会自动添加一条新的事实:这个实体(也就是这个句子)是抽象地来说的。
这样,“抽象地来说”就作为一个补充性事实修饰到原本的事实(原句)上去了。它不会改变“亚夜是否是虚无”、“亚夜是什么?”等提问的结果。
但如果副词是限定性副词,则产生出来的约束会是一个虚约束(virtual constraint)。例如
Jepat, Ae'a jata bilatom.
(限定性)抽象地来说,亚夜 是 虚无。
只有抽象地来说时,亚夜才是虚无的。
会被编译成:
声明 "是" {主语 = 亚夜, 表语 = 虚无} [(虚)抽象地来说]
虚约束的特殊之处在于它不会在声明指令执行时被录入为对对象化后的主句的修饰性事实(也就是上面工作流程的第二步),而是仅存在于三元组中。
荏苒语推演系统在对某一质询寻找可作为证明的事实时会有一个关键步骤:它会判断这个事实(对象化后的原句)是否满足它的三元组的约束表中的每一个约束。只要出现不满足的情况就会认定该事实无法作为证明,因而跳过。
当约束不是虚约束的时候,“原句满足该约束”已经作为一条新的事实被录入推演系统了,所以只要后来不再反驳、撤销这个新的事实,关于约束满足性的判定一定是真的。
但如果约束是虚约束,除非我们后来手动录入能让这个判定满足的事实,原句始终不会被推演系统认为是有效的。
事实上,约束除了是副词外,还可以是完整的副词性从句,甚至可以有它自己的主语。所以这一句就好理解了:
Loemut Ae'a, jata bilatom.
(限定性)死亡 亚夜,(她)是 虚无。
只有亚夜死了,她才是虚无的。
除非我们之后录入“亚夜死了”的事实,原句将一直无法被作为有效的事实来参与逻辑推演。
这样,我们就通过原句对象化之后的三元组和约束之间的关系对既定事实和限定性(假设性)事实做出了区分。而这里的关键是,原句甚至包括约束在内这一切都是被对象化的,也就是说,都可以参与推演系统的内部推演,例如,我们可以为系统添加诸如“所有抽象地来说的事实都是低可信度的”,“动词是‘飞行’的事实发生的场景很大概率是天空”之类的“元事实”(关于事实的事实)。
所以我们将之前介绍的一切反过来,对于一个无法成立的事实(本身包含不满足的约束),荏苒语的推理系统有能力做到用已被录入的元事实来寻找可能令这个事实成立的约束。
—————————————————————
Hôth méluèmcuâ lan’áï.
愿你在此寻到光辉。