• 计算机的起源

    2006-11-14

    《逻辑的引擎——数学家与计算机的起源》读书笔记

     

    莱布尼茨提供了最初的想法

    现代计算机的起点是莱布尼茨的一个梦想:将人的理性还原为计算,并且有强大的机器能够执行这些计算。

    17世纪,数学得到了大的发展,主要有两项成就作为基础:

    (1)       处理代数表达式的技巧已经被系统化,这种技巧沿用至今;

    (2)       笛卡尔和费马分别论证了,如何通过用一组组的数对表示点,从而将几何还原为代数。

    在这一时期,各种数学应用的要求提出了极限概念,牛顿和莱布尼茨分别独立的发明了微积分。

    莱布尼茨青年时的想法是找到一个人类思想的真正的符号系统,以及操纵这些符号的恰当的计算工具。莱布尼茨认为,人类需要一种普遍文字(Universal Characteristic),即一个不仅真实,而且包含了人类全部思想领域的符号系统。莱布尼茨本人一直在用代数符号说明一个恰当选取的符号系统的重要性,并且发现了只包含01的二进制表示方法。

    莱布尼茨的计划分成三步:

    (1)       创造一套涵盖人类知识全部范围的纲要或百科全书;

    (2)       对其背后的观念进行选择,并为其中每一个提供适合的符号;

    (3)       演绎规则可以归结为对这些符号的操作。也就是莱布尼茨所说的“推理演算”(calculus ratiocinator)。

     

    布尔将逻辑变成了代数

    布尔认识到,在逻辑推理中,像“河马”、“人”这样的词的重要之处,在于它所描述的所有个体的类(class)或集合(collection),不仅如此,他还认识到这种类型的推理可以用一种关于这些类的代数来表达。

    布尔的经典著作是《思维的法则》(The Laws of Thought),他的伟大成就是证明了逻辑演绎可以成为数学的一个分支。

     

    一个逻辑转换为代数的推理的简单例子:

    SusanJoe的对话,Joe找不到支票簿了,Susan在帮他。

    Susan:你是不是在买东西时将它忘在超市了?

    Joe:没有,我给他们打过电话,他们没有找到,如果我把它忘在那里了,他们肯定就可以找到。

    Susan:等一等,你昨天晚上肯定在饭馆开过一张支票,我看见你把支票簿放在夹克的口袋里了,如果你从那时起就没有再用过它,它就应该还在那里。

    Joe:你说对了。我没有用它,它就在我的夹克口袋里。
    结局是,支票簿果然在Joe的口袋里。

     

    在以上的推理中,他们处理的是如下的命题:

    L = Joe把支票簿忘在了超市;

    F = Joe的支票簿在超市找到了;

    W=Joe昨晚在饭馆开了一张支票;

    P=昨晚开了支票之后,Joe把支票簿放在了他的夹克口袋。

    H=Joe从昨晚起就没有再用过他的支票簿。

    S=Joe的支票簿仍然在他的夹克口袋里。

     

    推理形式如下:

    前提:

                如果L,那么F

                F

                WP

                如果WPH,那么S

                H

    结论:

    (结论1        L

    (结论2        S

     

    数学法则:

    X=1表示命题为真,X=0表示“非X,XY=1表示“XY”,“如果X,那么Y”可以表示为:X1-Y=0

     

    上述推理的方程表示:

    1 L(1-F) = 0;

    2 F = 0;

    3 WP = 1;

    4 WPH(1 – S) = 0;

    5 H=1.

     

    2)带入(1)得到,L=0;得到结论1

    3)和(5)带入(4),得到S=1,得到结论2

     

     

     

     

    弗雷格建立了完备的逻辑体系

    弗雷格的贡献极其重要,他提出了把普通数学中一切演绎推理都包含在内的第一个完备的逻辑体系。他用逻辑分析工具来研究语言的开拓性工作为哲学的主要发展提供了基础。

    弗雷格1879年出版了一本小册子《概念文字》(Begriffsschrift),副标题是“一种模仿算术语言构造的纯思维的形式语言”。这部著作被誉为“也许是自古以来最重要的一部逻辑学著作”。

    弗雷格试图找到一个能够包含数学实践全部演绎推理的逻辑系统,布尔把普通代数作为出发点,用代数符号来表示逻辑关系。由于弗雷格需要用它的体系将代数构造出来,因此需要引入自己的符号来表示逻辑关系。弗雷格发现那些连接命题的关系也可被用于分析命题的结构,他把这些关系充当了他的逻辑的基础。而这成为现代逻辑的基础。

    为了令人信服的证明一切数学如何可能被建立在逻辑的基础上,弗雷格必须找到某种不用逻辑来发展他的逻辑的方法。他的解决办法是用精确的语法和句法规则将他的概念文字转换成一种人工语言,这就使得把逻辑推理表示为机械演算即所谓的推理规则成为可能,这些规则仅仅与符号排列的样式有关,这也是第一次用精确的句法构造出形式化的人工语言。概念文字就成为我们今天使用的计算机编程语言的前身。

    弗雷格试图用逻辑术语来定义自然数,然后再用他的逻辑导出他们的性质。他用了集合的概念,例如:3这个数字等同于所有这些集合的集合。一般而言:一个给定集合的元素数目可以被定义为:能够与给定集合一一对应的那些集合的集合。但是,这里面存在一个问题,这个问题被伯特兰罗素发现了,罗素指出,用集合的集合进行推理很容易产生矛盾,它的例子是:如果一个集合是它自身的一个成员,将这个集合称之为异常,反之称之为正常。那么,对于所有正常集合组成的集合E,它是正常的还是异常的。

    弗雷格的“概念文字”体现了莱布尼茨所憧憬的逻辑的普遍语言,但是,存在两点缺陷:

    (1)       他的演绎体系过于庞大,一个简单的逻辑关系需要用及其复杂的逻辑表达式表达;

    (2)       在概念文字的逻辑中,他的规则没有为判定某个结论是否可以从给定前提中推导出来提供计算步骤。

    但是,重要的是,由于概念文字的确完全包含了普通数学中所用到逻辑,所以用数学方法研究数学活动本身就成为可能了。

     

    (待续)

     

  • 刚刚翻译了可用性领域比较有名的SUMI的一份样例问卷,贴出来大家参考,如有翻译不当之处,请指教。

    详情可以去看http://sumi.ucc.ie/

    软件满意度评估问卷

    Software Usability Measurement Inventory SUMI))

     

     

    问卷包括50个问题,请回答所有的问题。

    每个问题包含三个选项。如果你赞成问题的描述,请选择第一个选项,如果你既不赞成也不反对,或者你认为无法评价这个问题,请选择中间的选项,如果你反对问题的描述,请选择第三个选项。

    对一个问题进行赞成或者反对的判断,并不需要您具备准确的理由,只需要您大体上感觉如此就可以了。

     

    1.  这个软件对您的输入响应很慢。

    2.  我愿意将这个软件推荐给别人。

    3.  软件的说明和提示信息是有用的。

    4.  这个软件有时候会突然停止运行(死掉)。

    5.  开始学习操作这个软件时存在很多问题。

    6.  用这个软件时有时候我不知道下一步该干什么。

    7.  我很喜欢用这个软件。

    8.  我发现软件给出的帮助信息不是特别有用。

    9.  如果软件突然停止运行了,想重新启动它并不容易。

    10.          学习软件的操作命令需要花费太长的时间。

    11.          我有时候会怀疑我是否使用了正确的命令。

    12.          使用这个软件是令人满意的。

    13.          软件系统的信息显示是清楚地并可理解地。

    14.          如果我只用一些常用的命令,我会觉得更安全。

    15.          软件文档提供了很多信息。

    16.          软件会破坏或者打乱我日常安排工作的方式。

    17.          用这个软件精神上是一种刺激。

    18.          当我需要时,界面上从来没有足够的信息。

    19.          当我使用软件的一条指令时候我能确信的知道它的含义。

    20.          我会坚持使用我认为最好的工具。

    21.          我认为这个软件存在不一致性。

    22.          我不愿意每天使用这个软件。

    23.          我可以理解软件提供的信息并且按照提示去做。

    24.          当我想做一些非标准的操作时,软件难于使用。

    25.          使用软件之前需要阅读过多的信息。

    26.          这个软件理应使用一些更简单的方式完成任务。

    27.          使用这个软件感觉到挫折感。

    28.          这个软件帮助我克服了使用过程中遇到的所有问题。

    29.          软件的运行速度足够快。

    30.          我必须不断的回头去看操作指南。

    31.          用户的需要,在软件中很明显的被充分的考虑到了。

    32.          有很多次我用这个软件的时候感觉很紧张。

    33.          菜单的组织和信息的编排相当合理。

    34.          软件可以减少用户的敲击键盘的次数。

    35.          学习使用软件的新功能是困难的。

    36.          完成一项任务需要太多的步骤。

    37.          这个软件有时候会让我头疼。

    38.          防止错误的信息不够。

    39.          可以容易的让软件做你希望做得事情。

    40.          我将不会学习软件提供的所有功能。

    41.          软件并不总是按照我所期望的完成功能。

    42.          软件的界面显示非常吸引人。

    43.          在不同的平台下,软件的帮助信息的数量和质量都不同。

    44.          可以相对比较容易的从一个任务的一部分转移到任务的另一部分。

    45.          在软件使用中容易忘记该怎么做。

    46.          软件的运行表现偶尔会显得不可理解。

    47.          软件确实非常难以使用。

    48.          在各个场景下,可以容易的一眼看出都有哪些操作选项。

    49.          不容易获得进出系统的数据文件。

    50.          我在使用软件的过程中不得不经常寻求帮助。

  • 全新的Office12(Office2007)采用了革命性的界面,自Win95以来应用软件大多具有的界面元素被全面革新。试用一个月,感觉很好。

    (1)主界面风格和新的Calibri字体(注意,原来的菜单变样子了)。

     office_12_1

    (2)选中一部分文本后会自动用渐变的方式弹出格式框,可以方便的修改文本格式。

    http://yuezh.blogbus.com/files/1148958098.jpg

    (3)全新的主菜单和最近文件列表,是不是简洁了很多?

    http://yuezh.blogbus.com/files/1148958221.jpg

    (4)光标进入表格后,系统会自动出现表格相关的菜单项。如红圈所示,使用方便。

    http://yuezh.blogbus.com/files/1148958306.jpg

    (5)Office终于可以直接输出PDF了,这让我非常高兴!

    http://yuezh.blogbus.com/files/1148958378.jpg

  • 小品

    2005-12-10

    甲:久仰久仰

    乙:失敬失敬

    甲:听说您是研究web2.0的专家?

    乙:过奖了,其实我现在正在研究money 3.1,听说您是网络扫黄1.1的旗手?

    甲:取笑了,其实我现在正在研究fuck4.2

  •   ///


      /// 对矩阵(二维数组)的前若干列进行排序,排序的列数以及每个排序列的排序顺序由orderList确定,orderList包含几个值,
      /// 就对前矩阵的前几列进行排序。
      ///
      /// 张越,2005.4.15
      ///

      /// 需要排序的矩阵
      /// 排序顺序数组(true:降序,false:升序)
      ///
      private string[][] SortMatrix(string[][] dataList , bool[] orderList)
      {
       //基本条件判断
       if(dataList.Rank == 0)
       {
        return dataList;
       }
       if(dataList.GetLength(0) <2)
       {
        return dataList;
       }

       if(orderList.Length > dataList.GetLength(0))
       {
        return dataList;
       }

       if(orderList.Length == 0)
       {
        return dataList;
       }

       //首先对第一列排序
       dataList = this.SortDataList( dataList , 0 , orderList[0] );
               
       for(int colIndex=1;colIndex   {
        Stack stkArr = new Stack();
        ArrayList arrIndex = new ArrayList();
        
        stkArr.Push(dataList[0]);
        arrIndex.Add( 0);

        for(int i=1;i    {
         //判断优先于此列的前面各列是否相同,否则不能排序
         bool canSort = true;
         for(int m=0;m     {
          if(dataList[i][m] != dataList[i-1][m])
          {
           canSort = false;
          }
         }
                       
         if(canSort)
         {
          stkArr.Push( dataList[i] );
          arrIndex.Add( i );
         }
         else
         {
          //对队列中的数据进行排序
          //清空队列
          if(stkArr.Count > 1)
          {
           int subLine = stkArr.Count;
           string[][] subList = new string[subLine][];
           for(int m=0;m       {
            subList[m] = (string[])stkArr.Pop();
           }
                                  
           //排序
           subList = this.SortDataList( subList , colIndex , orderList[colIndex]);

           //将排序好的数组归回到矩阵中去

           for(int m=0;m       {
            int matrixIndex = (int)arrIndex[m];
            dataList[matrixIndex] = subList[m];
           }

           //记录排序行位置的数组清零
          }

          stkArr.Clear();
          arrIndex.Clear();
          stkArr.Push( dataList[i] );
          arrIndex.Add(i);


         }
         if(i == dataList.GetLength(0) -1)
         {
          if(stkArr.Count > 1)
          {
           int subLine = stkArr.Count;
           string[][] subList = new string[subLine][];
           for(int m=0;m       {
            subList[m] = (string[])stkArr.Pop();
           }
                                  
           //排序
           subList = this.SortDataList( subList , colIndex , orderList[colIndex]);

           //将排序好的数组归回到矩阵中去

           for(int m=0;m       {
            int matrixIndex = (int)arrIndex[m];
            dataList[matrixIndex] = subList[m];
           }

           //记录排序行位置的数组清零
           arrIndex.Clear();

          }

         }
        }

       }


       return dataList;
      }