三段论

    亚里士多德的三段论是形式逻辑的开端。所谓三段论,是使用两个命题推论出另一个命题的演绎法。两个命题分别被称为大前提和小前提,推论被称作结论。例如:

        所有人都会死 (大前提)

        苏格拉底是人 (小前提)

        苏格拉底会死 (结论)

命题的类型有四种:

1、全称肯定(A):所有的人都会死

2、全称否定(E):没有一只鸟有三条腿

3、特称肯定(I):有些动物是人

4、特称否定(O):有些鱼没有腿

    根据三段论中的命题类型,三段论有24种不同的形式,其中最为人熟知的,就是被经院学者命名为Barbara的那种(三个命题都是全称肯定,有三个A):

        所有人都会死 (大前提)

        所有的希腊人都是人 (小前提)

        所以所有的希腊人都会死 (结论)

    另外有三种分别是Celarent:没有一只鸟有三条腿,所有的家禽都是鸟,所以没有一只家禽有三条腿(EAE);

Darii:所有的大学生都参加过高考,有些人是大学生,所以有的人是大学生(AII);

Ferio:没有一只狗会飞,有些动物是狗,所以有些动物不会飞(EIO)。

    这四种是三段论的最基本形式,所有其它形式都可以通过命题转换归结为这四种里的一种。

    罗素论述过三段论体系的形式上的缺点。尽管称作形式的缺点,但我认为罗素要表达的意思是:这是一个应用三段论的形式逻辑时引入的一个形而上学的错误,而非三段论形式本身的缺点。这个缺点便是:对个体和类别的混淆。“名字与谓语之间的区别,或者用形而上学的语言来说也就是个体与共相之间的区别,就这样被他抹煞了,这给哲学带来了多灾多难的后果。”

    “苏格拉底是人”和“所有的希腊人是人”这两个命题,不是同样的形式。“是人”作为一个谓语描述“苏格拉底”这个主语,这是一种“A是(is a)B”的形式。但“所有的希腊人”并不像“苏格拉底”一样,是“是人”的主语。“所有的希腊人是人”不是“A是(is a)B”的形式,而是这样一种陈述:“如果一个东西是希腊人,那么他是一个人”,是一种“如果x是( is a )A,那么x是(is a)B”。“苏格拉底”和“所有的希腊人”这两个词的区别,是元素与集合、个体与共相、实体与类型等这样的区别。这种区别在亚里士多德的三段论中是被忽视了的。亚里士多德本人是反对把“共相”看做是实体的,然而他却在自己的形式逻辑中把个体和类别(共相)混为一谈。

    这就让人想到了两个有意思的问题:一是语言究竟为我们引入了多少知识上的谬误,二是个体和共相的区别。

    自然语言通常是含混不清的,日常的使用或多或少会带来一些误解,但不致于造成交流上的困难。但在进行逻辑和形而上学的思考和讨论时,自然语言便带来了无穷的困难。尤其在形而上学里,名词背后的含义并不清晰,如果不能谨慎地加以分辨,逻辑的思考经常变成了修辞的游戏。

    即便是在形而上学之外,人们的思维也很容易被语言本身引入歧途。见怪不怪的是,人们经常热烈地讨论一些事物,但却未必明了自己使用的名词和语句背后的概念。比如人们经常热衷于讨论事物的“本质”,假如在某人对某事物的“本质”滔滔不绝地发表完论断之后,你问他到底“本质”是个什么样的概念,他是没有办法讲得清楚的。又如人们还喜欢讨论事物的“意义”,但“意义”这个名词指代的是什么,恐怕你在无数次使用了这个名词之后都没有认真考察过。

    越是深入的思考和讨论,我们越要面对更多的抽象,要分清哪些概念实有所指,哪些概念只不过是为了语言的方便而引入的一个名称,并不是一件容易的事。直到最后,对于同一个名词,我们找不到任何两个人对它有相同的认知,于是讨论就变成几乎是不可能的事了:要么每个人自说自话,要么大家一起玩弄着文字的游戏。“People talking without speaking, People hearing without listening”。

    人足够聪明,聪明到能够创造出许多“观念”,人又足够愚蠢,愚蠢到被自己创造的“观念”引入泥沼。自以为手握真理的人通常是愚不可及的,那些故弄玄虚给你讲述真理的人,也许不过是个被自己蒙骗的糊涂虫。“究竟有没有智慧这样一种东西,还是看来仿佛是智慧的东西,仅仅是极精炼的愚蠢呢?”

    描述形式逻辑,应该使用精确的数学语言,它所使用的符号不应该有任何歧义,就像现代形式逻辑所做的那样。

    计算机的编程语言,也是精确的数学语言。所以一段不论多么烂的代码,它表达逻辑的能力都是自然语言难以企及的。所以无论在代码里添加多少注释,最有表现力的依然是代码本身。所以Linus Torvalds说:”Talk is cheap, show me the code.“

    也因为如此,曾经流行的“中文编程”是个伪命题。代码里的单词不过是逻辑的符号而已,根本没有自然语言的功能,竟然有人为了选择用什么字符做符号而争论。松本行弘把Ruby设计成用日文字符的语言,会让日本人觉得它比现在更好用一点吗?ridiculous嘛!

    第二个问题是个体与共相的区别。共相问题是众多迄今未有定论的诸多形而上学问题中的一个。对共相问题的尝试始于柏拉图,而后是亚里士多德。后世的哲学家们关于这个问题要么是柏拉图式的,要么是亚里士多德式的,要么是综合了他们的。

    实体之间存在某些共性,使得我们可以以“类型”来划分不同的实体。尽管没有任何两个实体是相同的,但却存在某个实体跟另一个实体相比其他的实体”更加相似“。Sheldon曾吐槽过(大概):把番茄说成是水果,是一个小错误;把番茄说成是一座桥,是个大错误。经验也告诉我们,实体是可以分类的。但类型本身是不是实体,这是柏拉图和亚里士多德的分歧所在。(实体,我在这里理解为”存在于世界中的“,与之相反的是”不存在于世界而只存在于思想中“。除非你是巴门尼德的信徒,否则这两者是有区别的。)

    在柏拉图的理念世界里,类型本身也是实体,是与类型所包含的事物具有同等实在性的实体。现实世界里的事物,是理念世界中共相的”不完美的摹本“。理念世界里的实体不但存在,而且比现实世界”更加实在“。现实世界中有许多只猫,但理念的世界中只有一只猫,它是现实世界中所有的猫的原型(prototype)。

    在亚里士多德这里,类型并不具有实在性。共相是对多个实体的一种描述,是一个为了方便而设的名字。”所有的希腊人“并不是一个实实在在的事物,它只是一群每个都被称作”希腊人“的东西的统称。名称本身不具备实在性,所以罗素提到亚里士多德在三段论中把它当成一个实体来使用是形式上的错误。

    计算机语言在建立现实世界的模型时,把共相称作类型。多数编程语言在建立类型与对象(实体)的关系时,选择了亚里士多德的方式,把类型与对象区别开来。类型与亚里士多德的共相一样,是对众多对象共同具有的属性的描述。正常情况下,模型世界中的实体只有对象,而类型只不过提供一种方便的描述方式。但有所不同的是,亚里士多德共相是依附于实体的,有了实体才有实体的属性,然后才有共相。但在编程语言里,类型是先于对象被构筑出来的,似乎比对象更加”实在“,这就是柏拉图所认同的了。

    还有些编程语言,使用原型(prototype)的方式构筑对象,这与柏拉图的理念论几乎是完全相符的。原型是和依据它所构造出来的其他对象一样的实体,就像”现实的猫“分享着”理念的猫“的”猫性“一样,每一个构造出的对象都分享着原型对象的属性。而在这些语言中,并没有类型的概念对应着亚里士多德式的共相。

    把形而上学附会到码农的世界中,有点牵强,但很有趣。

    最后一句当然是:然并卵。


你可能感兴趣的:(语言,类型,逻辑,亚里士多德,共相)