前言
在上一章笔者讲到我们目前使用最为普遍的标识方法,循环递进标识法与结构标识法,同时回答笔者关于标识的定义。
运算
在日常生活与观察中,我们注意到我们不仅需要标识区分事物,也需要应对事物从一个状态到另外一个状态的演进与变化。而我们对观察到的事物的动态演进与变化进行描述时,不得不面对一个问题,那就是动态演进到静态描述的转化问题。
对于这个问题的思考,催生出自然语言中的,表达动态的动词及其相关的谓语语法部分,以及数学体系中的运算符。就像是我们不能停止时间,同样我们不能静止动态演进与变化,那么我们只能选择让我们的描述体系具有动态演进与变化的功能。
还是上一章的例子,桌面上有个苹果,它被移动了。我们当时用了“桌面上有个苹果”,“桌面上有个苹果,它被移动了”的语言描述,还用了 b → c b\rightarrow c b→c 这个表达式进行描述。观察两种描述方式,“ 桌面 ”,“ 苹果 ”,可以静态描述, “ b , c ” “b\, ,c” “b,c” 如果将其想象成两幅画,那么它们也是静态的。当转化为动态描述时,语言描述加上了“ 移动 ”这个动词,表达式加上了 → \rightarrow →。再看两种描述方式本身,语言描述前后两句不同,表达式运算符 → \rightarrow → 左右两侧不同。由此,我们可以定义运算:对于描述系统 A A A,有两个描述 a , b ∈ A a,b\in A a,b∈A,若存在 a a a 到 b b b 的变化,那么称此变化为运算。
从标识认识运算
上一篇文章我们谈到了用有限个文字符号对超出其数目的事物进行标识,由此引出一维有序序列。另外,笔者在描述一段中所定义的表达式中采用了 a , a ′ a,a' a,a′ 两个符号对观察目标的状态的标识,其中引申出一个问题。接下来,我们就从这两方面来进行讨论。
先看第一个问题,一维有序序列。在数学表达式中,我们通常用下列方式表示一维有序序列: a 0 , a 1 , a 2 , a 3 , … {a_0,a_1,a_2,a_3,\dots} a0,a1,a2,a3,… 而在本文中,我们采用下列方式表示一维有序序列: a b c d e f … {abcdef\dots} abcdef… 我们可以发现,这种表示方式就是我们书写系统所采用的方式。
现在我们思考,两个一维有序序列如何比较异同。看下面例子 :
a
a
a
a
b
a
b
b
a
\begin{aligned} a\quad aa\\ a\quad b\\ ab\quad ba \end{aligned}
aaaababba 每一行的两个序列都不同。
由此,我们可以规定:两个序列长度,即组成序列的符号的数量不同,它们不同;相同长度的两个序列,若存在有对应位置符号不一样,那么它们不同。
现在,我们再来思考第一个问题是不是就一目了然了。接着,我们思考,既然序列有序,那么多个序列是不是也可以进行排序呢?看下面的例子: a , a a , a , b , a b , b a {a,aa,a,b,ab,ba} a,aa,a,b,ab,ba 从标识角度来讲,这个例子其实是一个长度为13的序列,那么我们怎么认为它是多个序列所组成的有序序列呢。其实我们如果把“ , , ,”看作是一个运算符,那么可以得到这么一个表达式: a , a a , a , b , a b , b a = a a a a b a b b a a,aa,a,b,ab,ba =a\ aa \ a\ b\ ab\ ba a,aa,a,b,ab,ba=a aa a b ab ba 可以看出,“ , , , ” 将一个序列分解成了六个序列。而将这个表达逆向来看的话,可以说“ , , , ” 将六个序列粘黏成一个序列,再看“ , , , ” 的位置,能想到什么?它们构成了一个结构。由此,我们就引申出了我们上一篇所提到的,结构标识法。
接下来,我们粘下面的几个序列: a b c a a a b a c b a b b b c c a c b c c a a a a a b a a c a\ b\ c\ aa\ ab\ ac\ ba\ bb\ bc\ ca\ cb\ cc\ aaa\ aab\ aac a b c aa ab ac ba bb bc ca cb cc aaa aab aac根据上面的示例我们可以得到下面的序列: a , b , c , a a , a b , a c , b a , b b , b c , c a , c b , c c , a a a , a a b , a a c a,b,c,aa,ab,ac,ba,bb,bc,ca,cb,cc,aaa,aab,aac a,b,c,aa,ab,ac,ba,bb,bc,ca,cb,cc,aaa,aab,aac 我们看,有什么规律没有,如果看不太清楚,再看下面的序列: 0 , 1 , 2 , 00 , 01 , 02 , 10 , 11 , 12 , 20 , 21 , 22 , 000 , 001 , 002 0,1,2,00,01,02,10,11,12,20,21,22,000,001,002 0,1,2,00,01,02,10,11,12,20,21,22,000,001,002从中再舍弃掉一些序列,变为下面的序列: 0 , 1 , 2 , 10 , 11 , 12 , 20 , 21 , 22 0,1,2,10,11,12,20,21,22 0,1,2,10,11,12,20,21,22这个序列是不是更加熟悉了,用数学概念来说,这个序列是三进制数排列,转化为十进制为: 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 0,1,2,3,4,5,6,7,8 0,1,2,3,4,5,6,7,8 现在,从上面三个序列可以看出规律了,从长度为1的序列到长度为2,再到长度为3,它们它们的右位总是以长度为1的序列的顺序排列,且构成循环,比如 00 , 01 , 02 , 10 , 11 , 12 00,01,02,10,11,12 00,01,02,10,11,12六个序列。接着,从这些最右位看,是以长度为1的序列循环过后,递进一位,再接着循环,直到递进位也以它的右位的顺序循环过后,又递进一位。如此循环递进,就是上一篇所提到的循环递进标识法。
说个题外话,最经典的循环递进系统就是我们常用的数字进制系统,而从上面例子也看到了,数字进制系统是不完全循环递进系统,完全的数字进制系统应用是在我们的计算机系统中。
回到正题,不管是结构标识法还是循环递进标识法,它们都在某种程度上改变序列,结构标识法是以“ , , , ” 改变序列,循环递进标识法是在结构标识法的基础上,以循环递进方式改变序列。而两者又都是序列符号的排序,排序也是一个运算,上面的例子完全可以转换成下面形式: a → b → c → … a\rightarrow b\rightarrow c\rightarrow \dots a→b→c→…从此我们可以知道,从标识角度方面看,运算是对序列改变,是对序列的长度,组成符号的改变。当标识本身的改变用以模拟一个系统的时候,那就是描述了。
现在,我们转到第二个问题, a , a ′ a,a' a,a′ 问题。看下面的图:
图中,如果在用函数的角度看, a a a 存在两个象,显然是不可取的,也会产生描述上的冲突,所以需要一个 a ′ a' a′ ,如下图所示:
在现实中,存在一对多的情况,怎么将之转化为多对一,或者一对一的映射关系。将之转换成我们所讨论的问题,是属于描述精度问题,这在后面的语义章节会进行讨论。
现在,我们回到正题。从标识的角度来看,运算是对序列的改变,而作为运算的标识符,在其中会起到什么样的作用呢?看下面例子: b → c b\rightarrow c b→c 此刻,若存在序列 b a ba ba,那么可以得到 b a → c a ba\rightarrow ca ba→ca换一种表达方式: c a = b → c ca=b\rightarrow c ca=b→c即是说,合理的运算可以使序列简化,同时,运算符可以作为结构标识法的粘连序列使用。
此篇与上一篇主要是讲述与定义基础的概念,下一篇进入中文编译设想的核心。