没有数学,我们无法看透哲学的深度;没有哲学,人们也无法看透数学的深度;而若没有两者,人们就什么也看不透。 数学家B. 德莫林斯 1. 数学学科的地位和作用 美国数学家柯朗在《数学是什么》一书中提出: “数学,作为人类智慧的一种表达形式,反映生动活泼的意念,深入细致的思考,以及完美和谐的愿望,它的基础是逻辑和直觉,分析和推理,共性和个性。” 从数学学科本身来讲,数学是一门科学,这门科学有它的相对独立性,既不属于自然科学,也不属于人文、社会或艺术类科学;从它的学科结构看,数学是模型;从它的过程看,数学是推理与计算;从它的表现形式看,数学是符号;从对人的指导看,数学是方法论;从它的社会价值看,数学是工具。用一句话概括: 数学是研究现实世界中数与形之间各种形式模型之结构的一门科学。 数学在人类文明的进步和发展中一直发挥着重要作用。过去,人们习惯把科学分为自然科学、社会科学两大类,数、理、化、天、地、生都归属自然科学。但是,现在科学家更倾向于把自然科学界定为以研究物质的某一运动形态为特征的科学,如物理学、化学、生物学。数学是忽略了物质的具体运动形态和属性,纯粹从数量关系和空间形式的角度研究现实世界的,具有超越具体科学和普遍适用的特征,且具有公共基础的地位,与理、化、生等学科不属于同一层次,因此不是自然科学的一种。把科学分为数学、自然科学、社会科学三大类,这种观点更为学术界所认可。 数学的许多高深理论与方法正广泛深入地渗透到自然科学的各个领域中,当代科学的研究正日益呈现出数学化的趋势。 无论是电子计算机的发明,还是它的广泛应用,都是以数学为基础的。在电子计算机发明史上,里程碑式的人物艾伦·图灵(Alan Turing)和冯·诺依曼(von Neumann)都是数学家,而在当今计算机的重大应用中也无不包含着数学。信息技术已被广泛应用于方方面面,一项高科技成果常常对应一种或几种数学方法的应用。事实上,从医学上的CT技术到印刷排版的自动化,从飞行器的模拟设计到指纹的识别,从石油地震勘探的数据处理到信息安全技术,从天气预报到航天技术等,在形形色色的技术背后,数学都扮演着十分重要的角色,常常成为解决问题的关键。 王梓坤院士说过,“数学的贡献在于对整个科学技术(尤其是高新科技)水平的推进与提高,对科技人才的培育和滋润,对经济建设的繁荣,对全体人民的科学思维与文化素质的哺育,这四方面的作用是极为巨大的,也是其他学科所不能全面比拟的。” 离散数学(第3版)第3版序2. 用模糊性、矛盾和悖论创造数学 拜尔斯(William Byers)在《数学家如何思考》(How Mathematicians Think)一书中指出: 数学的核心并非如大多数人所认为的那样是依靠逻辑和规则的。 他通过许多例子指出,在逻辑非常重要的话题中,矛盾和悖论发挥了至关重要的作用。矛盾就像驾驶人在转错弯时遇到的禁入标志,而悖论就像四面八方都禁入的交叉路口。公路工程师从这些交叉点学到一些东西,或许会想出新的解决方案,如地下通道或立交桥。因此,深思熟虑后,不应该惊奇像数学这样有“公路交规”的学科不得不处理矛盾的情形。而且在这个过程中学到的经验教训可能在将来发挥基本的作用。 在清晰度和准确度要求很高的领域,拜尔斯被那些清晰性失效的情形吸引了。拜尔斯不但不把这种模糊性 (ambiguity)看作系统的弱点、失败,反而认为它们是创造过程的催化剂。既然不同的结果是可能的,就存在灵活性和开放性。仔细研究模糊性能展示隐藏的含义,打开通往新旅程的大门。 3. 数学教育的地位和作用 数学是人类社会进步的产物,也是推动社会发展的动力之一。数学与人类文明、人类文化有着密切的关系。数学在人类文明的进步和发展中,一直在文化层面上发挥着重要作用。 数学不仅是一种重要的“工具”或“方法”,也是一种思维模式,即“数学方式的理性思维”;数学不仅是一门科学,也是一种文化,即“数学文化”;数学不仅是一些知识,也是一种素质,即“数学素质”。数学训练在提高人的推理能力、抽象能力、分析能力,是其他训练难以替代的。 数学素质是人的文化素质的一个重要方面。数学的思想、精神、方法,从数学角度看问题的着眼点、处理问题的条理性、思考问题的严密性,对人的综合素质的提高都有不可或缺的作用。“胸中有数”中的“数”,不仅包含事务的数量方面,还应包含数学的思想、精神、方法等方面。 数学教育将在以下5个方面对大学生的培养发挥作用: ①掌握必要的数学工具,用来处理和解决本学科中普遍存在的数量与逻辑推理问题; ②了解数学文化,提高数学素质,将使人终身受益; ③培养数学方式的理性思维,如抽象思维、逻辑思维等,会潜移默化地在人们日后的工作中起到作用; ④培养全面的审美情操,体会数学是与史诗、音乐、造型并列的美学中心构架; ⑤为学生的终身学习打基础、做准备。 对每个人来说,为了更好地投身于建设事业,提高自身素质,必须以数学为立身之本。对于理工科学人来说,应掌握数学精髓,而且,掌握得越深入、越广泛越好。 4. 关于编程和数学 虽然数学是计算机的工具,在思维的本源上有相似性和共同性——编程语言与数学语言,但编程和数学不同的思维模型,说明了它们在上层需要构建各自不同的技能树。而学习和掌握一个技能点需要花时间练习,从而在大脑中训练出特定的结构。 所以,编程与数学不可能做到学一个另一个就自然而然地掌握了。它们两者的依赖关系是: 编程需要数学,数学则不需要编程。 另外,纵然数学是工具、是基础、是上层的依赖,但并不是说数学就高于一切,优于一切,是最强大的。因为最基础是必要的最开始,但不一定就是最强大的。例如,沙子是建筑的基础,但不能代表建筑的价值;无机物是有机物的基础,有机物是生命的基础,但生命的价值必然是高于无机物的。 可见,发展的过程环环相扣,关系的道路上谁也少不了谁,基础代表必要,发展则代表了未来。 5. 数学学习方法要点 通过数学学习培养类比、分析、归纳、抽象、联想、演绎推理、准确计算、学习新知识、运用数学软件、应用数学10种基本数学能力。 通过数学学习增强如下5种基本数学素养: 主动探寻并善于抓住数学问题中的背景和本质;熟练地用准确简明规范的数学语言表达自己的数学思想;具有良好的科学态度和创新精神,合理地提出新思想、新概念、新方法;对各种问题以“数学方式”的理性思维,从多角度探寻解决问题的道路;善于对现实世界中的现象和过程进行合理的简化和量化,建立数学模型。 数学学习需要循序渐进、逐步进步,不能一蹴而就、中间跳跃,要耐住性子积累知识和能力。培养个性化学习和研究能力、独立思考能力,课后多思考、多动手,通过与人讨论、研读文献提高数学素养与能力。 数学学习的特点使得习题训练在数学学习中有特别重要的作用,理解各部分知识的联系、明确解决问题的思路、数学思维的培养、书面表达能力的训练,很大程度上依靠做习题完成,不可以抄解答代替做题。 用简洁、严谨、规范的数学语言表达自己的数学思想,并有组织地书写,对培养数学素养极为重要。因此,解答数学问题要先思考,再组织语言,最后写到本子上。计算题最重要的不是答案是否准确,而是要注意到每一步计算的理由和算法是否表达得清楚。 除了做基础性的习题外,要在后续课程和综合课程中发现基础课程的实际应用,注重数学建模中各种知识的应用。 通过课程学习、小组讨论、教师交流、课外学习,对数学已有结论进行反思,提出进一步讨论的话题,并在老师的帮助下进行力所能及的探索、整理、发现,培养创新能力。对本科生而言,在校期间按需要翻阅一些科普文章,阅读普及性的书籍,以学习研究论文的研究方式,保持对数学的爱好和敏感。 6. 第3版修订的主要内容 2019年11月,教育部高等学校计算机类专业教学指导委员会计算机科学与技术专业数学类课程建设论证小组在西北工业大学召开了研讨会,会议由周兴社教授召集,马殿富教授起草了数学类课程的总体方案,具体包括4部分内容: 数学分析及高等数学、线性代数、概率论与数理统计、离散数学。鉴于此,本次修订删除了原第5章中的“离散概率”内容。 与本教材配套的教学辅导用书《离散数学解题指导》(第2版)于2016年出版,新增了应用案例。本次教材的修订也增加了相应的案例题目,采用二维码扫描方式给出每章一个案例的答案。新增应用案例24个: “命题逻辑”一章中的应用案例包括: 克雷格探长案卷录,忘却林中的艾丽丝(狮子与独角兽);“谓词逻辑”一章中的应用案例包括: 电路领域的知识工程,基于逻辑的财务顾问;“集合与关系”一章中的应用案例包括: 同余关系在出版业中的应用,拓扑排序在建筑工序中的应用,等价关系在软件测试等价类划分中的应用;“函数”一章中的应用案例包括: 逢黑必反魔术,生成函数在解决汉诺塔问题中的应用;“组合计数”一章中的应用案例包括: 大使馆通信的码字数,条条道路通罗马;“图论”一章中的应用案例包括: 网络爬虫,读心术魔术,高度互联世界的行为原理;“树及其应用”一章中的应用案例包括: 哈夫曼压缩算法的基本原理,决策树在风险决策中的应用,一字棋博弈的极大极小过程;“代数系统”一章中的应用案例包括: 组合电路物理世界中群的应用,群码及纠错能力;“自动机、文法和语言” 一章中的应用案例包括: 奇偶校验机、识别地址的有限状态机、语音识别;“数论与密码学”一章中的应用案例包括: 密码系统与公开密钥,单向陷门函数在公开密钥密码系统中的应用。 在这次修订工作中认真地审阅了原书,对其中的部分内容做了调整,更正了某些错误和疏漏之处。为控制篇幅,将可以作为课外读物的部分内容,如第2版的历史注记,一些定理证明,采用二维码扫描方式给出。 参考国防科技大学毛晓光教授、北京航空航天大学马殿富教授在离散数学实践教学中积累的经验,结合我们自身的做法,每章增加了约5道“计算机编程题”,并采用二维码扫描方式给出其中一道题的程序。 本书第5、7、10章由袁景凌编写,其余章节由贲可荣负责编写,其中的计算机编程题及程序由谢茜编写。贲可荣组织了本书的编写并统稿。在撰写本书过程中,参考了许多资料,特别感谢参考文献中的相关作者。同时,也欢迎读者对本书提出修改建议。 贲可荣2020年10月 离散数学是计算机科学与技术专业的核心基础课,在计算机科学与技术专业课程体系中起到重要的基础理论支撑作用。学习离散数学不仅能够帮助学生更好地理解与掌握专业课程的教学内容,同时也为学生在将来的计算机科学与技术的研究和工程应用中打下坚实的理论基础。随着计算机科学与技术的日益成熟,越来越完善的分析技术被用于实践,为了更好地理解将来的计算机科学与技术,学生需要对离散结构有深入的理解。 离散数学用数学语言描述离散系统的状态、关系和变化过程,是计算机科学与技术专业的形式化描述语言,也是进行数量分析和逻辑推理的工具。通过离散数学的学习,有利于培养学生的学科素质,进一步强化对计算机科学与技术学科方法的训练。通过离散数学的教学,对培养学生获取知识、应用知识的能力,对创新思维的培养有重要的作用。 依据《高等学校计算机科学与技术专业核心课程教学实施方案》,离散数学的教学实施方案按照3种类型设计,即科学型(计算机科学专业方向)、工程型(计算机工程与软件工程专业方向)、应用型(信息技术专业方向)。 根据科学型、工程型和应用型3种不同类型人才的专业素养与能力要求,以及其他相关专业课程的教学需要,离散数学课程的教学内容和教学要求也具有不同的定位,参见表1。科学型人才的培养目标要求学生具有坚实的数学基础,较强的抽象思维、形式化描述、推理和分析能力;工程型人才培养目标要求学生具有坚实的数学基础,能够综合应用相关的理论分析和解决实际问题;应用型人才培养目标要求学生能够熟练运用典型的离散模型进行系统的建模和集成。基于不同的教学内容和教学要求,完成教学计划的学时也不一样。表1列出的学时均指课上教学时间,其中最低学时是指完成本课程核心教学内容所需要的最少学时,建议学时是完成本课程中等教学要求所需要的学时,包含部分推荐知识单元和可选知识单元的教学。表1面向不同培养目标的离散数学定位培养类型科学型工程型应用型培养要求基础理论和核心技术研究 原始创新基本理论与原理的综合应用(创新性应用)计算机应用人才人才定位学术研究IT企事业应用领域信息化人才培养人数少较多多离散数学的基础熟练掌握形式描述、变换、推理和证明方法;熟练掌握离散系统的描述与分析方法;了解实际离散系统的建模熟悉形式描述、变换、推理和证明方法;熟练掌握离散系统的描述与分析方法;了解实际离散系统的建模简要了解形式描述、变换、推理和证明方法;掌握离散系统描述与分析方法;熟悉常用的实际离散系统模型涉及其他专业课算法与数据结构、数据库系统原理、操作系统、编译原理、软件工程、人工智能、数字逻辑、计算机网络算法与数据结构、数据库系统原理、操作系统、编译原理、软件工程、数字逻辑、计算机网络数据结构与算法、数据库与信息管理技术、计算机网络与互联网学时安排建议学时: 72~108建议学时: 72~90建议学时: 51~72离散数学(第3版)第2版序除培养目标外,实施方案还须考虑不同学校计算机专业的整体课程体系设计及离散数学在其中的作用,因为各学校重点建设的专业方向或研究方向是不一样的。例如,信息安全需要较多的数理逻辑和代数知识;网络需要较多的图论和组合数学知识;算法设计与分析需要较多的图论和组合数学知识;数据库和数据挖掘需要较多的集合论、数理逻辑的知识;软件工程与可信计算需要较多的集合论、逻辑知识等。因此,在确定教学内容和最低学时时,需要有一定的灵活性,以便适应大多数学校的基本教学要求,鼓励各学校创建自己的专业特色和优势发展方向。 本书涵盖集合论、数理逻辑、组合论、图论、抽象代数的基础知识,可满足计算机科学技术工程领域(工程型)高层次人才用离散结构的理论和方法对实际系统进行描述、分析的基本数学需求。 在这个知识框架中,离散数学课程划分为10个知识单元,分成3个层次: 第1层的4个核心知识单元与科学型一样,即集合关系与函数、基本逻辑、图与树、基本计数,分别包含通常离散数学中的集合论、数理逻辑、图论、组合数学的基础部分;第2层的2个推荐知识单元是特殊的图、代数结构,分别包含图论、代数结构中的重要内容,这些知识单元之间相互比较独立;第3层的3个可选知识单元是形式系统、高级计数、初等数论,包含了数理逻辑、组合学和初等数论中的部分内容,这些知识单元之间也是比较独立的。从知识结构上,还需要1个关于证明技术的单元,包含离散数学中经常使用的证明方法,如数学归纳法、逻辑演算、构造性证明、反证法、归约证明等。但在教学安排上,可以将证明技术分散到有关的知识单元中讲授。 按科学型人才培养目标,本书包括了集合基数,但缺少一阶逻辑形式系统的一致性、合理性、完备性证明,计算理论(递归函数、原始递归函数、图灵机、图灵可计算函数)等内容。本书涵盖应用型人才培养目标的全部内容: 集合、关系与函数,基本逻辑,图与树,特殊的图,证明技术,基本计数,代数系统简介,初等数论。 与第1版相比,本书减少了博弈树的部分内容,增加了命题逻辑和谓词逻辑的归结原理(消解原理),命题逻辑形式系统的一致性、合理性、完备性定理及证明,在初等数论中增加了“欧拉定理与费马小定理”,在递推关系中增加了“生成函数”等。 本书第1~4、6、8、9章及附录由贲可荣、高志华撰写,第5、7、10章由袁景凌撰写,贲可荣对全书进行了统一修订。高志华、袁景凌给出本书奇数题的答案。 贲可荣2011年3月数学源于实践汇于实践 回顾过去的一个世纪,数学科学的巨大发展,比以往任何时代都更牢固地确立了它作为整个科学技术的基础的地位。数学正突破传统的应用范围向几乎所有的人类知识领域渗透,并越来越直接地为人类物质生产与日常生活做出贡献。同时,数学作为一种文化,已成为人类进步的标志。因此,对于当今社会每一个有文化的人士而言,不论他从事何种职业,都需要学习数学,了解数学和运用数学。现代社会对数学的这种需要,在新的世纪中无疑将更加与日俱增。20世纪数学思想的深刻变革,已将数学这门科学的核心部分引向高度抽象化的道路。面对各种深奥的数学理论和复杂的数学方法,门外汉往往只好望而却步。 一个本质上简单的学科却难于学习。有些困难是表面的,其一是词汇。数学家用一些对普通人很生僻的词表达从实际事物中抽象出来的概念。如“四边形”和“平行四边形”有一些在其他领域遇不到的特定的精确含意,要研究数学就得学着用。另一个看得见的,但同样是表面的困难是使用符号。我们要解决问题,以某些给定的信息为基础决定一个未知数。设此未知数是某一个长度为尺计的数字。用x代表这个长度,以后就只用符号x,而不去说这么长一句话,肯定是有利的。然而,使用符号不会产生任何概念上的困难。 人们设想到的第三个困难是抽象性。但是,由于基本的抽象或概念是直接来自日常经验的,人们心中很容易保存它们的含义。事实上,数学家不断地诉诸物理对象和物理图像,以便不忘记这些抽象概念的含义。古希腊数学家用小石子代表各类对象,用小石子学会了自然数的基本事实。顺便说一下,“计算”一词,广义地表示任一个算术或代数过程,它的英文Calculus的拉丁语源就是小石子。甚至,更高级的数学抽象如微积分学中所学的导数和积分,说到底离这些初等概念仅一步之隔,甚至微积分的概念也有图像的物理的意义。要学会这些抽象概念,比学习初等概念并不要求更高的智力。数学的完全的形式是一系列概念和程序,例如求解某种类型方程的方法。还有一系列事实,例如定理。当然,程序和定理都要通过证明确认。要想教会人这些数学的元素,最容易的方法似乎莫过于用这些概念、过程、定理与证明的最终的、确定的形式教学生。但是,数学是一门老学科,它的某些重大的成就可以追溯到公元前3000年。过去5000多年里,数学家不仅极大地扩大了这个学科的领域,当他们不断认识了新的客体和现象,不断改进了自己的理解,他们也就重塑了这些概念、程序与证明来把这些成就组合起来。这些订正了的版本有许多就不再清晰易懂了。 此外,数学的分量在增加,最好把它组织起来,使关于同一主题的许多定理有合乎逻辑的次序。每一门学科的基础是公理,后面就是一串定理,每一个定理都用公理和前面已证的定理证明。把结果按这样的合于逻辑的次序安排,这种需要就要迫使数学家找出新的、不甚自然、不甚明白的证明。结果是许多证明都被除去了它们的直观、透明和易于理解的面貌,而被十分人为的证明代替了。 离散数学(第3版)第1版序表述上的有效性似乎导致忽视数学的另一个特点,而这个特点对于理解数学却是至关重要的。数学本身是一副骨骼。数学的血肉和生命在于用数学做什么。有意义的数学要为一种目的服务,这种目的用笛卡儿的话来说,就是使人成为大自然的主人和占有者。数学的意义在于数学本身之外,正如好的文学作品的意义在于纸面上文字的堆积之外。要懂得数学,就要知道为什么需要这个结果,它和其他结果关系如何,用它可以做一些什么事。 学校由于它的目的和义务繁多,有时能够,有时又不能够给数学一种更有启发性的讲法。有志于此的学生必须走得远一些,寻求一种完全的知识。要对数学有较彻底的理解与领会,就必须去掉那些纤巧的细节,深入其深层的思想之中;要知道它的目的和用处,知道创造它的人们的动机,以及这些概念和结构的创生背景。 创造性的活动,对学生来说则是再创造的活动,是数学的心脏。正是在这种活动中,数学家创造了最高成就,克服了最大的困难并使数学这门学科取得了最有意义的进展。创造过程在解决已有问题时必不可少。没有新观点、新研究方法和新目标的创造,数学就会反反复复重新组织老的证明,使它们更加严格,在这样的过程中日趋枯竭,丧失生命力。对已经得到的知识,重新排列其步骤,安排其定理的次序构成一个演绎的组织,这时常需要创意,但总体上说,这更像把书本重新排一个次序,而创造的活动可以比作写书。数学给人的满足——获得猎物时的兴奋,发现的激动,成就的感觉,以及成功时的欢乐——更多、更强烈的是在创造性的工作之中,而不是在最后按演绎的模式重写论证之中。 数学中有许多美的篇章。无疑,数学家从事数学活动也能获得其他创造活动提供的满足感,但是伟大的数学家情愿把数学的美作为一种额外报偿,激励他们奋斗的最深层的动力则是以数学为媒介在人类的探索活动中理解宇宙,也理解人类自身在其中的角色,并且探求如何利用自然现象和自然的力量为人类服务。那些做出巨大贡献的数学家们,像阿基米德、牛顿、拉格朗日、拉普拉斯、高斯、哈密顿、庞加莱,或者是一流的物理学家,或者在科学史中占据显要地位。这绝不是偶然的。几乎所有数学的目的和意义并不在于对一堆符号做一系列的逻辑阐述,而在于这些符号告诉我们关于外部世界的一些知识。 离散数学是计算机科学的基础 离散数学是计算机专业最重要的必修课程之一,它是许多计算机专业课程的基础。 离散数学是研究离散对象的数量和空间关系的数学,它包括多个数学分支,如本书所涉及的集合论、图论、组合数学、古典概率、自动机理论等,是计算机科学的理论基础,也是计算机应用的有力工具。另一方面,计算机科学的发展又促进了离散数学的发展。18世纪以前的数学基本上都属于离散数学的范畴,18世纪以后,天文学、物理学等的发展极大地推动了连续数学(如微积分)的发展,直到20世纪中期,尤其是20世纪80年代以后,随着计算机日益渗透到现代社会的各个方面,离散数学又重新受到高度重视。当然,离散数学涉及的内容极其广泛,其应用全然不是仅局限于计算机科学及其应用,而是涉及人们生活的方方面面。 由于数字计算机软硬件结构决定了它仅适于处理离散型信息的存储与计算,因此离散数学便成为计算机科学与技术的基本数学工具。某些理论上的“先见之明”,将会给以后学科的发展带来巨大的影响。例如,对可计算的研究所建立的图灵机是计算机的理论模型,随后这种理念导致了计算机的诞生。布尔的逻辑代数已成功地用于计算机的硬件分析与设计。谓词逻辑演算为人工智能学科提供了一种重要的知识表示方法和推理方法。这些都体现了离散数学的重要作用。对于离散数学的原理和方法,经常要求其在计算机上的可实现性;而一般的数学理论和方法有时仅给出存在性的结论,并不给出构造性的问题解答,因此难于满足实用性的要求。现代数字计算机的理论模型依然是20世纪30年代提出的图灵机,这是一种“离散”的机器,可用来处理“离散”的对象。当然,正如大多数计算机的早期应用,通过近似计算等手段,计算机也可以处理“连续”的对象,但现代的数字计算机仍然是一种“离散”的机器。事实上,目前计算机已经越来越多地用于处理各种“离散”的对象。 随着计算机技术的发展,离散数学作为计算机科学的一种数学工具,其作用显得更加重要。对于一种程序设计语言来说,我们需要了解一些相关的问题: 为什么会提出这种语言?它能解决什么问题?优势是什么?存在什么问题?它的语法、语义怎么样?利用该语言编写的程序必然是正确的吗?更深入的分析是,计算机到底能做些什么?不能做些什么?什么是可计算的,什么是不可计算的,以及计算的复杂性又怎样?只有懂得一些深刻的基础性数学知识,才能对这些问题给出较为准确的回答。 离散数学为什么作为计算机专业学生的基础课?美国数学会主席Lynn A. Steen回答了该问题: ...But todays growth industries are dominated by information,which is abstract and immaterial.Where the material world is modeled by calculus,the language of continuous change,the immaterial world of information requires discontinuous discrete mathematics. Both genetic codes and computer codes are intrinsically discrete. Discrete mathematics basically deals with fancy ways of arranging and counting.It can be used to enumerate genetic patterns and to count the branches in computer algorithms; it can be used to analyze the treelike branching of arteries and nerves,as well as the cascading options in a succession of eitheror decisions. It can tell us how many things are there as well as help us find what we want among a bewildering morass of possibilities. 离散数学的主要内容 由于数字电子计算机是一个离散结构,它只能处理离散的或离散化了的数量关系,因此无论是计算机科学本身,还是与计算机科学及其应用密切相关的现代科学研究领域,都面临如何对离散结构建立数学模型;又如何将已经用连续数量关系建立起来的数学模型离散化,从而可以用计算机加工处理。离散数学是数学里专门用来研究离散对象的一个数学分支,是计算机专业的一门重要的基础课。它所研究的对象是离散的数量关系和离散的数学结构模型。 20 世纪 70 年代,国外开始将离散数学作为一门大学课程。当时,有一些计算机科学家根据自己对计算机科学的理解,与一些数学家一起圈定了一些他们认为对计算机科学是必需的数学专题,结合计算机科学中的一些实例主要编著了一些命名为“离散数学结构和方法”或“离散数学基础”之类的书籍,开设相应的课程供大学里学习计算机专业和其他一些相关工程专业的学生选修。由于反映很好,渐渐在计算机专业中,“离散数学”即作为必修课开设。中国是在大约 20 世纪 80 年代初期,从翻译国外离散数学专著开始,逐渐编写了一些适合中国教学情况的离散数学的教材,并在计算机系中开设了相应的课程。 如上所述,由于各专家主攻计算机的方向和他们对计算机教学的理解不尽相同,因此,在“离散数学”名下的内容也不完全一样。本书根据ACM和IEEE/CS最新推出的Computing Curricula 2004,以及教育部高等教育司组织评审通过的《中国计算机科学与技术学科教程2002》中制定的关于“离散数学”的知识结构和体系撰写。全书共10章,主要包含数理逻辑、集合与关系、函数、图和树、组合计数、数论与递归关系、代数系统、自动机、文法和语言等内容,基本上涵盖了计算机专业所需的数学内容。离散数学这门课程主要介绍各分支的基本概念、基本理论和基本方法,这些知识将应用于数字电路、编译原理、数据结构、操作系统、数据库原理、算法分析与设计、人工智能、软件工程、计算机网络等专业课程之中。 学习离散数学的方法 离散数学是计算机科学系所有专业的基础数学课程,一方面有其实用性(应用数学的特征),另一方面有其本身作为数学基础课的理论的严谨性。所以,学习任何一个专题时,首先要精确严格地掌握好概念和术语,正确理解它们的内涵和外延。因为公理、定理或定律的基石都是概念。只有正确地理解了概念,才能把握定理的实质,熟练地将公理、定理应用于解决问题。完全地、精确地掌握一个概念的好主意是,首先深刻理解概念的内涵,然后举一些属于和不属于该概念外延的正反两方面的实例。如果对一些似是而非的例子也能辨别的话,应该说就真正理解了这个概念。对一些重要的概念,能记住一两个实例也很管用。这对牢固掌握一个概念是很有好处的。 读者应养成一种自觉的学习习惯,就是首先掌握好基本概念和术语,在此基础上理解每个基本定理的本质,最后通过学习和借鉴书中提供的例题独立完成每一次作业,并且在每次作业完成之后能自觉地归纳出其中用到的基本解题方法。注意,千万不要在完全理解相关概念和基本定理之前就匆忙做相应的习题。 学习数学的唯一途径是实践。仅看别人怎么做,是不可能学会弹吉他或投篮的,也不可能仅靠阅读本书或听课就会学好离散数学。必须积极主动地思考,在阅读数学书时,应该随时备好笔和纸,以便进行详细的推导和计算。在听数学课前,最好先阅读有关内容,这样就可以专注于自己对内容的理解是否与教授的理解相一致,还可以就一些难点提问。本书中有很多习题,有些是纯粹的计算题,有些测试对概念的理解,有些要求给出论证,建议读者多做习题。 学习和理解术语也很重要。在数学中,传统的做法是对一些简单、常见的词汇赋予特殊的含义,如集合、函数、关系、图、树、网络。这些词都有严格的定义,必须认真学习,否则就不能理解在书中读到的内容和教授讲述的课程。这些术语对有效的交流是必需的。术语能帮助你有效地与别人共享信息。在现实生活中,仅简单地计算出某些东西往往不够,还必须能够向别人解释,使别人确信你的解是正确的。 我们期待你成功地学好离散数学,并从中学到许多技术和观点,你将会发现它们在许多地方都是有用的。 我对数学和逻辑的感悟得益于我的老师们,他们是陈火旺先生、莫绍揆先生、王世强先生、康宏逵先生、齐治昌先生、丁德成老师、胡静婉老师,也获益于我的同学们,包括沈恩绍、宋方敏、王怀民、王戟、王献昌、王公宝。如果本书有什么新意的地方,首先归功于他们,错误和疏漏由我负责。 本书第1~4、6、8、9章及附录由贲可荣、高志华撰写,第5、7、10章由袁景凌撰写,全书由贲可荣统稿。武汉大学计算机学院院长何炎祥教授对全书进行了审校,特此致谢。 贲可荣2007年1月