2.2 形式语言和非形式语言
概念只是我们对所认识的事物起的一个名字,词语是概念的自然语言形式,概念是词语的思想内容。
一个概念可以具有多种表达方法,对于软件设计来说,我们可以用自然语言描述概念。也可以通过定义一个类来描述,并在程序运行时实例化这个概念。通过数学或者数理逻辑,我们可以使用集合来描述一个概念。
比如 "商品" 这个概念,可以通过不同的方法表达。
自然语言中,商品是指可以通过货币或者其他物品交易的物品,可以是自然实体,也可以是虚拟物品。而社会经济中对商品的描述为,商品具有一个核心属性就是价格,有价格意味着可以交易。
自然语言中,概念和词语之间并不是一一对应的,这是需要日常特别注意的。
自然语言中,任何概念都必须通过词语来表达,但不是所有的词语都表达概念。在语言中,基本上都会将词分为虚词和实词两大类,只有部分实词(注意不是名词)可以表达概念。 自然语言中,任何概念都必须通过词语来表达,但不是所有的词语都表达概念。在语言中,基本上都会将词分为虚词和实词两大类,只有部分实词(注意不是名词)可以表达概念。
同一个概念可以由不同的词语表达,比如前面提到的土豆、马铃薯。 同一个概念可以由不同的词语表达,比如前面提到的土豆、马铃薯。
一个词在不同的的情况下(上下文),可以用来表达几个不同的概念,多义词就是这样,同一个词表达不同的概念,叫做这个词的词项。 一个词在不同的的情况下(上下文),可以用来表达几个不同的概念,多义词就是这样,同一个词表达不同的概念,叫做这个词的词项。
自然语言(Natural Language)就是人类讲的语言,它是自然人类发展中自然形成的,比如汉语、英语。
这类语言不是经过特别设计的,而是通过自然进化的。它的特点是语法规则只是一种规律,并非需要严格遵守的规则,这种语言含有大量的推测,以及对话者本身的认知背景(比如东西方不同的文化背景形成了大量的哩语)。认知背景赋予了词汇、概念的不同含义,比如,豆腐脑这个词,不说东西方差异,就是国内南北都会有争议。
著名的白马非马争论在于自然语言的不确定性:
从概念上说,白马这个概念不是马这个概念,所以白马非马。 从概念上说,白马这个概念不是马这个概念,所以白马非马。
从谓词("是" 这个谓词)逻辑来说,白马这个概念代表的事物集合属于马这个概念代表的事物集合。所以白马是马(白马属于马,但是白马这个概念不是马这个概念)。 从谓词("是" 这个谓词)逻辑来说,白马这个概念代表的事物集合属于马这个概念代表的事物集合。所以白马是马(白马属于马,但是白马这个概念不是马这个概念)。
正因为如此,才会产生大量的诡辩,让交流效率降低。
逻辑学中的形式语言开始发挥作用。形式语言(Formal Language)是用精确的数学或机器可处理的公式定义的语言 [14]。例如数学家用的数字和运算符号、化学家用的分子式等,以及编程语言中的一些符号(Token)。计算机编程也是一种形式语言,是专门用来表达计算过程的形式语言。
形式语言需要严格遵守语法规则,例如 1+1=2 是数学中一种形式语言。
形式语言来源于形式逻辑,特别是形式逻辑中的符号逻辑。亚里士多德的《工具论》为形式逻辑奠定了基础,中国古代的周易的卦爻可以看做一种朴素的形式逻辑,后来很多人牵强附会将计算机的起源和二进制关联到周易上。虽然中国古代有了形式逻辑的朴素思想,但是遗憾的是没有脱离朴素的辩证法。中国古代哲学不缺乏更有价值的内容,但是周易的形式逻辑和计算机并无关系。
形式逻辑的含义用一句话表述为:用一套特别的(形式的含义)、显性的规则来约束逻辑推理规则。
由于形式逻辑也在不断演化,现代形式逻辑和古希腊也不太一样。19 世纪以前的形式逻辑主要是传统逻辑,19 世纪中叶以后发展起来的现代形式逻辑,通常称为数理逻辑,也称为符号逻辑。
莱布尼兹倡导建立"普遍的符号语言",通过推理演算和机械化的思想一步一步严谨的完成逻辑推理。如果需要建立符号推理系统,就需要定义符号、推理规则作为系统的要素。
弗雷格完成了《概念文字》[15]一书,建立了一个初步的逻辑体系(一阶逻辑体系),通过概念系统来消除二义性,避免偷换概念,并通过推理结构来完成严格的推理。
这个时候的概念依然是通过定义完成的,直到康托尔创立了集合论,通过集合来描述概念,集合中的元素就是概念的内涵,集合能被用到的地方就是外延。集合论的建立,标志现代形式逻辑的建立,也就是符号逻辑。
实际上,弗雷格建立的一阶逻辑体系可以看做一套逻辑体系模板,用它可以拓展出更多的逻辑体系。例如,在人们认识到概率前,认为逻辑推理是确定的,当引入概率后就不行了,因此哲学家们又发展出来概率归纳逻辑。
总之,知道形式语言和自然语言之间的区别,可以避免无意义的争论。软件工程师就是一个对现实业务形式化的工作岗位,将需求这种自然语言转变为代码这种形式语言。
正因为如此,需求和沟通的矛盾不可能避免,除非提出需求的人也是用形式语言,那么软件工程师的价值也就没有了。
使用形式语言可以精确的定义一个概念,并使用精确的语义规则和计算机沟通,这就是软件工程师编写软件的过程。通过计算机语言来描述一个概念,其实就是面向对象中的一个类,这里定义商品有两个属性名称和价格:
如果用集合的枚举法来表述商品就是:
计算机语言和数学语言是一种形式化的语言,可以精确地描述一个概念,但是自然语言只能给出模糊的概念描述。自然语言翻译成计算机语言的不确定性,带来了无休无止的争吵,但这也是软件设计者的主要工作。