谓词逻辑及形式系统 (语义)【中】

一、概述

一、什么是语义
简单地说,所谓语义,不管是自然语言的语义还是形式语言的语义,基本上就是两个系统之间的映射关系。自然语言的语义,是语言符号和我们大脑中概念之间对应;而形式语言的语义,则是符号系统和某个学科的知识体系之间建立的对应关系,现在研究最多的是符号系统与数学结构之间的映射关系,以及符号系统与哲学体系之间的对应关系。如果要用一个统一的概念表达符号系统所对应的其它学科知识体系,那么这个概念就是【模型】。
有了模型的概念,对什么是语义的定义就可以简明扼要地表示为:
语义:符号系统 → 模型
模型,在我们日常生活语言中,通常称作“语境”、“上下文”、“世界”、“背景”、“客观环境”等,但是这些表达通常意义模糊,无法准确、精确地把握模型的基本概念。

模型的概念,在数学中,又称作结构,这是对任何数学分支、数学对象的一种统称。上世纪1930年代,法国的布尔巴基学派曾经企图用“结构”这个概念统一所有的数学分支。虽然没有获得学界完全的接纳,但相当一部分数学家是认可这样的定义的,而且就算不认可的数学家迄今为止也未曾提出过比“结构”更强有力的概念作为数学研究的统一概念。结构作为一个严格的数学概念,用不太严谨的语言表述就是:一个非空集合、以及在这个集合之上所定义的集合元素间的关系和对集合元素的操作。例如,自然数可以看做是一个结构,它是由所有非负整数构成的集合、加上大小关系以及相应的加法乘法运算构成。不过在逻辑学,模型是更广泛使用的概念,故我们这里通常使用“模型”作为基本的术语。

一个一阶谓词逻辑系统,就是这样的形式语言符号系统,它的的句法成分就是我们前面内容所介绍的常项、变项、谓词、量词和句子。它的句法规则就是我们用统一的归纳法所定义的规则程式:
1. 设定基本概念为该语言的良形表达式(wff);
2. 如果表达式A是wff,则操作φ(A)生成的表达式也是wff;
3. 如果表达式A是wff且表达式B是wff,则操作ψ(A, Β)生成的表达式也是wff
4. 本语言的任何表达式是wff当且当该表达式是由上述1-3规则生成。

由这样的句法规则生成的句子的集合,称作一阶语言(first order language)。通常一阶语言的句法层面称作该语言的形式层面。一阶语言的形式层面就是一个由有限多、或无限多没有任何意义的符号按照上面的规则建立的字符串集合。如果要让我们的一阶语言产生意义,就必须要创建/设定一个模型,按照一定的映射规则建立该语言元素与模型对象之间的对应,或者称作绑定。这里要注意的是,这个被映射模型,并不属于一阶语言,模型只是某个特定学科、知识体系的数学化表示,或者称作‘建模’,或者称作XX理论的形式化。
一阶语言的这个特点,或者说形式语言的这个特点,和自然语言大不相同。任何人类使用的日常语言,其词汇、特别是实词本身就带有“天然的”语义。这些词汇的语义已经作为该语言母语话者大脑认知世界的一部分。而且,对相同的词汇,不同语言体系的语义是不相同的。例如,’勉强‘在日语中,是‘学习’的意思。换句话说,同一语言符号,对应不同的模型,所产生的映射关系亦不相同。

因此可以说,自然语言基本元素的语义,原则上说是天然的,不是人为规定的,但是许多科学新发现导致了新概念新术语的出现,这些新词,或者是旧词新用——重新定义,或者是全新的造语。伴随着网络的发达,由于网络交际的需要,交际参与者会创造许多‘经济实惠’的特殊词汇。例如在中国,由于严格的网络管制,甚至促使网民利用各种手段创造出独特的微语言体系,造成了特定语境下的网络语言。从这个意义上说,人对于自然语言词汇的语义并非被动接受,相当一部分是重新创造的。如果用我们现在的术语表述的话:
网络语言符号→特定的概念系统

而一阶语言,或者更广义地说,形式语言的基本元素则没有固定的(predefined)语义,或者说根本就没有语义,只有在和一个特定的模型人为‘绑定’之后才产生语义,这时我们可以说,这个语言得到了‘解释’ (interpretation)。而‘解释’,并不属于这个形式语言的一部分。为什么?因为我可以拿这个语言和其它结构建立绑定关系,这个时候语言中的元素得到新的‘解释’。换句话说,形式语言的语义论不属于相关形式系统的一部分,因为其语义解释端看和哪个模型绑定。形式语言的这种特性,使得它可以作为多种学科的基础语言,这也是为什么逻辑学是多门学科精密化基础的原因。形式语言和模型之间的这种‘解释’、‘绑定’关系,用我们的日常生活语言表示,就是‘描述’、‘描写’,例如,某部小说的作者,用一种淡淡哀愁的笔触描写了1930年代中国农村的景象。这时,‘笔触’代表的就是作者使用的语言,‘1930年代中国农村的景象’就是作家心目中的‘世界’,可看做是当时中国农村某个局部的‘模型’。
语言和模型之间是相互独立的,这就像自然语言,既可以用来描写想象的世界,例如西游记,也可以用来写科学论文,例如关于天文学中的星体运动。这时,西游记中的人神鬼的世界、论文中的星体,和语言之间是相互独立的,因为汉语除了可以描述想象的世界、宇宙中星体,还可以干别的,例如在网上灌水。总之,语言工具、载体,和语言对应的世界相互独立的。

由此我们可以得出结论:语义学不属于形式系统的组成部分,但仍然是理论所关注的重点,这个重点就是——语言符号和所描述世界之间的对应关系:解释、绑定、指称、描述、描写、表达、表述

二、 谓词逻辑语义表达的基本工具

既然语义的本质就是映射关系,那么熟悉中学数学的我们自然会想到,表达这种关系的最恰当工具就是函数。没错,函数就是逻辑学表达语义的基本工具。函数可以把这种映射关系形式化,可以精确地定义什么是“映射”,“映射”的各种状态和性质。但是如果要用函数表达映射关系,我们还需要一个非常重要的工具,那就是集合。因为集合可以精确表达什么是符号系统,什么是模型,而函数的本质就是两个集合之间建立的映射关系

因此,在开始学习谓词逻辑语言的语义之前,需要熟悉函数、集合的概念。关于集合和集合论,后面的内容会介绍,也可参考任何离散数学教科书的相关内容,这里就不展开了。而对于函数,由于逻辑学所定义的函数和我们常见的数学函数相比有许多独特的性质,我们会在后面深入讨论。这里可以说的就一句话,逻辑中的函数,都是离散的,而我们中学时代熟悉的初等函数是连续的。

在命题逻辑部分,我们已经看到了函数的作用,当时我们将命题逻辑的语义定义为从句子到逻辑真值之间的映射,亦即,
设语义函数为V,设S是某个命题逻辑语言的所有句子的集合,设真值集合为{0,1}
那么我们就可以将该语言所有句子的语义定义为
V:S → {0,1}
当时,我们将语义函数称之为‘赋值函数’(valuation)。赋值函数,使得我们可以根据真值表对该语言内每一个句子都能赋予一个唯一的真值

命题逻辑语言的学习使我们可以看到逻辑学是如何定义和表示语义的——确定逻辑命题句的语义就是求真的过程。由于命题逻辑语言只关注复合句的语义而完全忽略原子句的语义,而复合句的语义则来自于逻辑连接符的语义定义。而逻辑连接词其语义是固定的,和具体的模型无关。因此,命题逻辑的语义相对是最简单的,只要通过真值表我们就可以知道句子的语(zhen)义(zhi)。

而谓词逻辑虽然我们仍然使用赋值函数这个名称,但是情况有了本质的变化。首先,我们已经深入到单句的内部,要了解单句本身的结构,这样,我们要处理名称、属性,加上量词,这使得事情变得非常复杂,复杂得使我们不得不重新建立语义论,而不能以命题逻辑的语义论为基础加以改造。

首先,谓词逻辑中的基本元素,常项、变项、谓词、量词等,不像句子,它们没有真值,因此无法用赋值函数赋予它们特定的值。因此,在赋值函数之外,我们会引进【解释函数】的概念。它的任务就是将语言中的这些非句子的基本元素和模型中的对象建立一对一的赋值关系。形式化的表示就是:
设ƒ为解释函数,设形式语言为L,设模型/结构为D,则:
ƒ:L → D

这样,对于句子,我们有赋值函数,对于其它成分,我们有解释函数,这是命题逻辑语义所没有的。

三、谓词逻辑语义论的研究方法

有了基本概念和工具的理解,我们就会不难理解一阶语言语义学习的基本内容了。

1. 扩充的函数概念:当我们有了一个句法上严格定义的形式语言之后,我们需要用“解释函数”对谓词逻辑语言中所有的元素,包括常项、变项、属性、命题、量词进行‘解释’,这时,常项要对应一个具体的概念或实体,变项要对应概念和实体的一个范围,属性要对应一个集合,而量词则对相应集合范围的界定。这远比我们在命题逻辑中句子对应真值这单一的情况复杂多了。

由于一阶语言符号系统要面对各种不同的模型,因此实际的映射关系并非整齐划一,会出现各种不同情况。这些情况如果以函数作为工具表述的话就是我们在中学函数学习中出现的三个概念:函数定义域和值域之间映射的三种状态:单射、双射和满射。这个问题我们会在后面详细阐述。

2. 确定模型的定义。由于谓词逻辑中涉及到概念、属性,而这些东西只能和特定的语境、学科、世界相关,所以我们先要确定我们的形式语言要和哪个具体语境相关。例如我们可以用一个特定的谓词逻辑语言和《西游记》绑定,这个时候,这个语言的每个常项都和《西游记》中某个具体人物产生对应关系;在此基础上我们可以建立《西游记》中的人物关系表,确定每个人物的行为举止,例如神仙可以飞天,凡人不可,但神仙凡人都可以行走。我们也可以用这个形式语言绑定代数中群的结构,这个时候,每个常项对应着某个自然数,变项则对应于某个自然数范围;然后确定确定基本关系自然数的大小关系和基本运算;最后,我们根据自然数的性质,进一步确定关于群的公理系统。因此,从某种意义上,我们的谓词逻辑语言真是一种万金油系统,它的语义是什么,你说了算。如果将谓词逻辑,包括形式语言、推理规则全面应用到某个数学理论,那这个逻辑就换了顶帽子,一个非常高大上的、非常耀眼的名称——数理逻辑。而数理逻辑对数学的应用最深入的部分就是关于算术、或者用一个让你颤抖的名词,关于数论的研究。可以说现代数理逻辑的所有内容包括非常“高大上”的哥德尔定理都是关于逻辑在算术应用方面的内容。而谓词逻辑的语义论和数学一旦挂钩,由于数学本身的确定性、可定义性,就产生了专门的研究一阶谓词逻辑语义和特定数学结构之间映射关系的数理逻辑学分支——模型论。因此可以说,谓词逻辑语义论是模型论的起点

3. 赋值函数。和命题逻辑语言一样,谓词逻辑语言对命题逻辑句子的语义解释也是通过赋值函数进行的。由于谓词逻辑语言是命题逻辑语言的超集,所以命题逻辑语言的复合句的语义解释、亦即、它的语义赋值函数不变,仍然有效。不过在本章学习中,我们会深入研究各种句子之间的真值【等价】问题,也就是说,许多句子的句法形式不同,但是它们的真值却总是相同的。而等价关系是所有形式系统进行符号变换、或者说逻辑表达式形式变换的理论依据。这种等价关系就相当于我们在中学数学中学到的许多等式关系一样,例如 (a+b)² = a²+2ab+b²,同样,我们也会接触到类似的逻辑等式。顺便说一句,现代逻辑学研究,有两个研究路线,一个是将逻辑当做推理规则研究。另一个是将逻辑当做代数研究,这个时候,我们只关注抽象的逻辑符号和逻辑式,就像我们在中学中关于实数的代数一样,只关注抽象的代数式和代数式之间的关系一样,这就是我们在《离散数学》中所学到的逻辑知识。正因为如此,我们从一开始就呼吁、提醒要将符号逻辑的学习过程看做是学习外语和代数的过程。

在研究赋值函数的时候,我们需要学习两个重要概念:分析真(analytical)和合成真(synthetic)。简单地说,所谓分析真,就是说命题的真值和模型、结构无关,它的真是建立在逻辑关系上的,就像上面的数学等式,和具体的数无关。而合成真,则相反,一个句子的真值和所对应的结构、模型相关。例如1+1=10,在十进制算术中是错误的,句子真值为假,但在二进制算术中,句子真值为真。换句话说,当我们对形式语言和特定的结构、模型挂钩之后,我们要区分哪些句子的真值依赖模型、哪些不依赖如果句子间的等价关系不依赖模型,那么就称作逻辑等价;逻辑等价的另一个术语就是重言式,或永真式(tautology)。而和重言式相反的句子则称为“矛盾式”(contradiction),亦即,在任何模型中真值为永假。那些依模型不同而真值不同的句子称作contingency,对此好像没有统一的译法,有的叫“偶然式”,或“适然式”,还有的叫“可满足式”、“权变式”,我这里权且翻译作“可变式”,相对于永真式、矛盾式的真值不可改变。

4. 模型的概念

模型的概念是全新的,我们在本文开头做了简单的介绍,基本意思就是谓词逻辑语言所对应的世界、语境,它的数学表述就是结构的概念,因此我们对模型概念的定义、性质描述等,形式化表示都将以结构概念展开。而结构概念本身又是从集合、函数、关系这三个概念定义的。有了严格的模型概念,有了严格定义的一阶语言,再加上赋值函数和解释函数,我们就可以全面定义一阶谓词逻辑的语言——一阶语言的语义了。但是不要忘了,由于【模型】概念的引入,我们的赋值函数就不再是单一的了,因为句子的真值会随着模型不同而改变。因此在确定赋值函数之前我们先要确定模型。相对于命题逻辑的单一赋值函数V,在谓词逻辑中,赋值函数会有多个,具体多少个取决于你所选择的模型数量,因此对每个模型M,我们都会有相应的赋值函数就是VM和解释函数VI。(其中字母V代表valuation,赋值函数,M代表model,模型,I代表interpretation,解释)。

5. 语义解释中的替换问题

在用模型的概念进行语义解释时,我们预先假定形式语言和模型之间有一种理想的对应,每个语言元素都可以对应一个模型中的对象。现在的问题是,如果在我们的谓词逻辑语义建立之后,模型发生改变,例如又添加了新的对象,或者语言和模型之间原本就不存在一对一的满射情况下,如何确定谓词逻辑句子、特别是带全称量词的句子的真值就成了问题。举个简单例子,在一次考试中,我们班所有同学都及格了。因此,这句话为真。可是有一天从别的班调来一位新同学在那次考试中不及格,这时这个句子的真值就不再为真了。这个时候,我们需要的是另一种方法,这种方法比赋值函数方法繁琐,但可以保证在上述问题出现时仍然可以确定句子的真值有效。这个方法就是在赋值函数赋值之前,对句子中所涉及的所有命题真值做一次扫描。还拿上面的例子,在给“我们班所有同学都及格了”赋予真值之前,需要对班里每个同学是否及格逐一调查,因为我们班所有同学都及格了=A同学及格且B同学及格且C同学及格……。换句话说,全称量词的一个句子真值相当于多个单一名称句子合取真值,我们需要一个评估函数,对每个这样的单一名称的句子真值进行评估,这样,当模型中的对象发生改变时,由于赋值函数在应用之前我们先对关于每个对象的命题句进行了扫描,这样在进行赋值时就不会出现语言符号和对象之间数量不匹配的情况。为了应对这种现象,当谓词逻辑语言的句子出现量词的时候,就需要将命题分拆为多个以专有名称为主词的句子,同时设定一个特殊的赋值函数获取每个这样的句子真值,这时,如果句子的一般形式为∀xφ(x),那么对这个句子的赋值函数就是
VM(∀xφ(x)),要获得这个句子的语义,就要知道x所代表的个体范围内的元素集合{a1,a2,..an}使得句子φ(a1),φ(a2),..φ(an)的真值都为真。因此为了扫描每个这样的句子,我们将设定一个特殊的赋值函数g使得g(φ(a1))∩g(φ(a2))∩,..∩g(φ(an))为真,因此我们有 VM(∀xφ(x)) = g(φ(a1))∩g(φ(a2))∩,..∩g(φ(an))

这样,一个通用的一阶语言的赋值函数就成为:VM,g(ψ),其中ψ代表一阶语言的任意句子。

除了以上的内容,谓词逻辑的语义部分还要引入“同一性”的概念和相应的逻辑运算,除此之外我们还要深入‘关系’的概念在语义的作用,最后讨论几种逻辑学常用但是在数学很少看到的函数表示法。

二、量词的语义

1. 命题逻辑的最小元素是单句,也就是不包含逻辑连接符的句子,所以,命题逻辑的研究对象是复句:复句的句法和语义。而谓词逻辑则深入到单句内部,将单句分解为两部分:主词和谓词。在亚里士多德的传统逻辑中,对单句的分析是根据词项:主词词项和谓词词项进行的。而在弗雷格的一阶逻辑中,一个逻辑系统,通常是由以下部分组成:
1. 逻辑连接符:¬、∨、∧、→、↔︎
2. 量词:∀、∃
3. 个体常项:a、b、c、x、y、z...(或该系统定义的特定的个体词系统),相当于亚氏逻辑中的主词
4. 谓词常项:P、Q、R...(或该系统定义的特定的谓词系统)

其中1-2是一个逻辑系统固有的成分,而3-4则因逻辑系统的定义不同而不同。这一点以前也说过,就和程序语言一样,前者相当于语言中的关键字和预定义运算符,例如+、-、*、/、%等,后者则相当于用户定义的常量、变量名,以及函数名;语言只规定了定义的方法和格式,因每个应用程序可根据要解决的问题种类具体定义每个常量、变量和函数名。其实,现代程序设计语言就是从逻辑语言演化而来,通过逻辑的学习,我们可以看到这种演化的痕迹。

由于命题逻辑的基本成分是单句,定义它的语义相对就比较简单,用一个真值表基本就可以解决。不过出于形式化和精确化的需要,我们定义了称作“赋值函数”(valuation)的工具,用来给每个wff赋予一个真值。
而谓词逻辑的成分,如上可知,比命题逻辑要多很多,语法句式相应也比较复杂,我们无法像命题逻辑那样,采用单纯的“赋值函数”、根据真值表取得真值了。其中最大的问题,正如我们前面介绍的,谓词逻辑的所有成分没有真值。
当然,广义的谓词逻辑,包括了命题逻辑,应当是命题逻辑的超集,在这种语境下,谓词逻辑又称作“一阶逻辑” (first order logic);描述这种谓词逻辑的语言称作“一阶语言” (first order language);基于谓词逻辑系统的论证过程称作“谓词演算”或“一阶谓词演算” (predicate calculus or first order predicate calculus)。因此,命题逻辑的赋值函数仍然适用于具有复句结构的谓词逻辑句子。

现在让我们把上面所说的符号化一番
1. 设:L为某个有定义的一阶语言;
2. 设:T为真值集合:{0,1}
3. 设:V为赋值函数,这个函数的定义域是L,值域是T,则赋值函数的一般形式为:
V:L → T(注意:这里的箭头表示函数从定义域到值域的映射关系,而不是蕴含逻辑连接符)
这样我们就可以重复命题逻辑复句的语义了:
(i) V(¬φ) = 1 当且当 V(φ) = 0
(ii) V(φ ∧ ψ) = 1 当且当 V(φ) = 1 且 V(ψ) = 1
(iii) V(φ ∨ ψ) = 1 当且当 V(φ) = 1 或 V(ψ) = 1
(iv) V(φ → ψ) = 1 当且当 V(φ) = 0 或 V(ψ) = 1
(v) V(φ ↔︎ ψ) = 1 当且当 V(φ) = V(ψ)
除此之外,谓词逻辑还定义了含有量词句子的赋值函数,这一点是命题逻辑没有的:
(vi) V(∀φ) = 1 当且当 V([c/x]φ) = 1,其中c代表L中的任意个体常项
(vii) V(∃φ) = 1 当且当 V([c/x]φ) = 1,其中c代表L中的至少一个体常项

这里,需要对(vi)和(vii)做进一步的说明和解释。
一、“∀φ”代表语言L中任意一个含有量词的句子;
二、“V(∀φ) = 1”表示∀φ这个句子的语义解释在某个特定语境中真值为“真”
三、“V([c/x]φ) = 1,其中c代表L中的任意个体常项”,这句话是在说明全称量词的意义是:用语言L中定义的所有个体词替换x,都可以使这个命题成真:V(∀φ) = 1。
换句话说,当含有全称量词的某个命题为真时,相当于多个个体谓词句子和合取:
设L中个体常项的集合是: C = {c1, c2,…cn} ; V(∀φ) = V(∀φ(c1) ∧ ∀φ(c2) ∧ ∀φ(c3) ∧ … ∀φ(cn))

举个例子
1.
a. 张晓华、李建、王立波这三个人都很聪明。
这句话可以理解为:
b. 在张晓华、李建、王立波这三个人组成的集合中,所有人都很聪明。

用我们上面定义的一阶语言:
个体常项:张晓华、李建、王立波
谓词常项:很聪明
量词: 都,或者 所有...都

如果用全称量词符号∀代表“所有...都”,用φ代表“人很聪明”,那么这个句子的语义解释就是:V(∀φ) = 1 当且当 V(φ(张晓华) 且 φ(李建) 且 φ(王立波)) = 1

翻译成自然语言就是:
张晓华、李建、王立波这三个人都很聪明 = 张晓华很聪明且李建很聪明且王立波很聪明。

由上面可以看出,全称量词的一个句子,相当于使用语言中所有的名词作主词加上谓词形成的多个句子的合取。这跟我们的直觉一致。再举个例子:
他这学期的所有科目的成绩都是A。如果所有科目的意思是:{语文、数学、物理、化学、生物},那么这句话的意思就是:
他这学期的语文成绩是A、他这学期的数学成绩是A、他这学期的物理成绩是A、他这学期的化学成绩是A、他这学期的生物成绩是A。
上面的公式:
(vi) V(∀φ) = 1 当且当 V([c/x]φ) = 1,其中c代表L中的任意个体常项
表达的正是这个意思。

如果用类似编程语言的方式表达,那含有全称量词的命题句的语义确定是这样的:
对于 每一个个体常项ci 在{c1,c2,… cn} 其中i是从0开始的自然数
如果V(∀φ(c[i])) = 1,那么继续考察下一个个体常项c[i+1]直到c[n]
如果V(∀φ(c[i])) = 0,那么考察停止,该命题的真值为0
如果V(∀φ(c[n])) = 1,那么该命题的真值为1

这里最有意思的地方是:我们将语义解释,对全称量化句子的语义解释,变成了一个算法,通过对每个含有具体个体常项命题句真值的解释,最后得到全称量化命题句的语义解释。这一点,对于那些对逻辑与计算感兴趣的朋友可以说是非常好的启发。当然,一般意义上的符号逻辑只关心论证,不关心计算,而一旦逻辑的关注点加入计算,就产生了许许多多新的领域,例如递归论,研究函数的可计算性。什么是可计算性?假如我们把上面例子中的个体常项的集合元素的个数设为无穷,用上面的公式就无效了,为什么?我要考察集合中每个元素看关于这个元素的命题句是否为真,那么我就得永远做下去,永无尽头。也就是说,我无法在有限的步骤之内得到一个确定的结果。那么上面那个赋值函数,就不是可计算的,因为我们永远无法知道:对所有个体常项来说,含有这些个体常项的命题的合取是否为真,也就无从知道全称命题的真值。

存在量词的语义解释和全称量词基本上一样,唯一不同的是,全称量词要求语言中所有的个体常项代入命题句中真值唯一,而前者只需要一个个体常项代入命题为真即可。如果用上面的程序语言格式,同样是对每个常项扫描,只要遇到一个常项使命题为真,就停止扫描从而获得整个命题的真值。

小结:

  • 谓词逻辑的语义解释涉及单句内部的成分,而这些成分没有真值,故语义解释的方法和机制和命题逻辑不同;
  • 命题逻辑可以看做是谓词逻辑、或者叫一阶逻辑的子集,因此谓词逻辑中关于复句的语义解释,使用命题逻辑的方法仍然有效;
  • 量词的语义解释:相当于对语言内所有名词进行扫描,把每个名词代入句子看是否为真,如果所有这样句子的合取的真值为真,那么全称量词句子的真值为真,如果有一个或以上的名词代入句子使得命题为真,那么存在量词句子的真值为真。
  • 从量词的语义解释方法可以看出,逻辑学的方法可以转化为一系列确定的步骤产生确定的结果,这样的过程称作算法。而算法是数理逻辑的分支递归论、或者称可计算理论的核心概念。
  • 我们将讨论模型以及单句内部成分的语义问题——解释函数

三、模型

既然谓词逻辑语言中除了句子,其它成分没有真值,那么如何来确定它们的语义呢?正如我们在开篇所述,所谓语义就是符号系统其它系统(大,可以包括我们生活的现实世界或者人类的精神世界,,可以仅仅是一句话、一顿饭之间建立的对应关系
当我们只谈论符号系统时,我们是在谈论句法,当我们只谈论符号外的任何系统,我们是在谈论哲学、或者专业知识,只有当我们谈论符号与外部系统之间关系时,我们才是谈论语义。当然,语义并非是符号与外部世界的全部,例如如果我们是在谈论特定的符号系统,如自然语言,和特定的外部系统,如人的精神,这二者之间的对应,那么这个对此进行研究的就是语言哲学。如果符号系统是我们现在正在学习的人工语言——谓词逻辑语言,而外部系统是形式化了的数学理论——数学结构,那么对此进行研究的就是数理逻辑的模型论数学哲学

所以,谈语义,实际上是在谈论关系,符号系统和任意其它外部系统之间的关系,而不仅仅是谈论符号系统本身。那么作为入门的我们,如何把握、或者说学习、理解所谓外部系统呢?换句话说,我们该学习哪些外部系统呢?其实,就像哲学一样,我们并不是要深入某个专业知识成为该专业的专家后才能学习逻辑的语义,站在逻辑学的角度,我们只需确定这个所谓外部系统的基本框架和形式定义。这个过程是这样的:
一、确定我们所说的外部系统的确切含义,可以用形式化的工具精确地描述出来;
二、不管外部系统的基本内容是什么,这些系统的共同组成部分有哪些?如何表达?
三、给这些外部系统起一个比较科学的、不会引起歧义的名字。

现在我们就来谈谈这个问题。先从第三个问题谈起。起名字,对中国人来说是人生一件马虎不得的大事,古来早就有“名不正则言不顺”的箴言。科学也一样,科学家对新的研究、新的发现和新的理论都会起一个一般人不太熟悉名称,以示之“新”。我们现在正在谈论的“外部系统”,是为了帮助大家理解而临时起的名称。真正的术语,叫做【模型】。我们见过许多实物模型,例如地产开发商在销售楼盘时会先在售楼中心展示未建楼盘和小区的模型;除此之外,我们还见过汽车模型、时装中心展示的模特模型,等等。

如果抽去模型的物质属性来形式化地描述的话,那就是,把建模对象按比例缩小,省略、忽略或者去除跟建模目的无关的元素和成分,只留下建模对象需要的元素和成分,然后用和实物完全不同的材料和方式仿造建模对象。这段话可以归结为几个关键词——简化、抽象、形式化

  • 这里的简化,有两个意思,第一就是我们对“简化”理解的一般意思,去繁就简,还有一个意思就是:缩小规模,降低复杂度,如果是实物模型,那么只展示建模者想展示的内容,规模控制在视觉可以容纳的范围之内。例如地图是对实际上是地理状况的简化,一般的地图不可能做得和原对象一样大必须缩小到人的视觉可以看到的范围。小地图也就一本书大小,大地图充其量也就一墙之大。同样,地图也不可能把实际地理范围内所有对象都包括在内,总会有所取舍。
  • 而“抽象”的意思是,对模型中的一些对象无法、或者不必详细一一列举或展示,而是用一个“替代物”表示即可。例如在世界地图上找北京,恐怕我们能找到的就是也就是“北京”这两个汉字和旁边一个小点。如果较真,这两个汉字和那个小点和北京城有什么关系呢?根本没有!只是地图的制作者认为不必告诉你北京是什么,只要标出位置和名称即可。这个时候名称和位置的代表——“北京”和那个小点就是对北京的抽象。“红楼梦”是一个抽象,是对曹雪芹那部73万字著作的指称。我们电脑桌面上的“快捷方式”也是抽象,一个应用程序当在电脑中运行时,需要调用许多电脑的本地资源,所以,对用户来说通过点击“快捷方式”我们启动了电脑的一个应用程序,但是在内部,实际上要调用许多程序使这些程序互相配合工作。但是,作为用户的我们关心这个吗?根本不!我们只要知道那个快捷方式代表那个应用程序就够了。这个快捷方式和后面被代表的应用程序也是抽象和被抽象的关系。有例如文学作品中有这样一种表现形式:失散多年的情侣一朝相逢,只有泪千行,沉默良久,心中的万语千言只化作三个字:你好吗?这个时候也是一种抽象,用“你好吗”代替了原本的万语千言。
  • 形式化是什么呢?好像这个词在国内被“神圣化”或者被“妖魔化”了。“神圣化”是说好像什么东西一说形式化就显得“高深”、阳春白雪;“妖魔化”是说那些所谓“形式化”的东西一定是枯燥无味符号而已。其实形式化的意思很接地气。比如对我们人类脸部进行“形式化”,就是忽略你是男的女的,忽略你的颜值,然后做出结论,所有人都是一个鼻子两个眼睛一张嘴。你觉得还有比这更简单的“形式化”吗?售楼中心那些楼盘模型其实也是形式化,它只让你看到楼盘的外表,你无法知道这个楼盘的内部结构,如,如何供电、供水、下水道系统,也无法知道这个建筑物使用的是什么材料,总之,除了对这个建筑物的外表,你不会从这个模型获得关于这个建筑物的任何知识。这就是形式化。例如a+b=b+a,就是跟楼盘模型类似的形式化:你只得到了这是加法运算以及运算形式的外表——“形式”,而不知道这里a和b是什么意思(我可没说a和b一定是数哦)。

由此可见,所谓【模型】,就是一个简化了的、抽象化了的、形式化了的外部系统

现在谈谈第一个问题:【模型】在我们的逻辑系统中的确切含义。如果通过上述讨论你对【模型】概念有了感性的认识,这里我们的描述就比较理性化了。
首先,我们要确定这个模型所包含的所有基本元素,使用的工具就是集合(domain、universe of discourse 或论域、域)。即作为目标的外部系统中的所有对象,或者我们谈论话题的最大边界范围。也就是说,我跟你谈数学的时候你千万别跟我谈人生,否则,‘ideal’这个词我无法定义(懂抽象代数的人大概知道我在说什么)。

最后谈谈第二个问题:一个模型有哪些组成部分。一个模型,大致上要规定构成这个模型的基本要素,还要规定各个元素之间有那些关系,最后,各个元素,包括基本元素和复合元素有哪些功能,换句话说,它们能干什么,在模型中起什么作用。如果用集合论的语言表述:
1. 定义一个论域:U = {x : S(x)},其中的S(x)表示作为该模型的元素的共同性质;
2. 定义模型中元素的关系 R = {<x,y> : x∈U 且 y∈U}
3. 定义模型中对元素的操作 F = {f(x) : x∈U},其中f(x)是函数,F是由f(x)构成的集合。

有了模型的概念,我们就可以定义谓词逻辑语言中那些无法赋予真值的元素的语义了,所以接下来介绍的就是——解释函数(interpretation function)了。

四、解释函数

在前面我们曾经把全称量词的语义定义为关于论域中每个元素命题的合取,把存在量词的语义定义为关于论域中每个元素命题的析取。这里,我们描述谓词逻辑语言的语义所使用的语言就是集合论的语言。现在,为了讨论方便,我们再把这些定义形式化地重复一遍:
(vi) V(∀φ) = 1 当且当 V([c/x]φ) = 1,其中c代表L中的任意个体常项
(vii) V(∃φ) = 1 当且当 V([c/x]φ) = 1,其中c代表L中的至少一个体常项

(vi)相当于V(∀φ) = 1 当且当 V(φ(a1) ∧ φ(a2) ∧ … ∧ φ(an)) = 1
(vii)相当于V(∃φ) = 1 当且当 V(φ(a1) ∨ φ(a2) ∨ … ∨ φ(an)) = 1

在这个过程中,我们其实少了一个最重要的步骤,这个步骤就是对每个子命题句中ai的定义,这里的ai,是形式语言中的任意符号,i表示从1开头的任意自然数。现在的问题是,在没有ai确切语义的情况下,你凭什么说V(φ(ai)) = 1。换句话说,在不知道句子的主语是什么的情况下,你凭什么说这句话对还是不对?
对这个问题的回答是:对于一套符号系统,这个符号系统的基本元素是a1,…,an,如果使这些符号能够得到相应的语义解释,我们必须要有一个【模型】。这个【模型】中的论域是该模型所包含的所有对象的集合。如何才能让符号和对象建立语义解释关系呢?说成大白话就是:某个符号ai,怎么才能让它代表某种意思?我们前面已经说过,形式语言的符号系统本身没有天然的语义,符号的语义,端看你把它“绑定”到什么【模型】上。接下来,我们就来谈论这个问题。

首先要搞清几个术语
形式语言的语义研究,实质上就是符号系统与【模型】之间的对应关系研究,因此我们需要熟悉几个关键词,以及表示这些关键词的拉丁字母:
1. 【符号系统】:通常是用“L”表示,L的意思是language,语言。
2. 【模型】:用“M”表示,M就是模型,相对应的英语是model。
3. 【】:这里的域,是指模型中对基本元素集合的定义,通常用“D”表示,对应英语单词是domain。
4. 符号和模型域中的元素建立对应关系的过程称作【解释】,英语是Interpretation,所以关于解释的符号通常用“I”表示。
5. 建立解释关系后,被解释的符号称作【常项】,相当于自然语言中的专有名词或名称。这种词的特点就是一旦赋予了解释一般不会再改变,例如“孔子”、“汉武帝”等名称。如果用编程语言,相当于程序中的符号常量,例如,pi=3.1415926。这个时候,符号pi就具有了不变的的语义解释:代表圆周率的值。常项,通常用“c”表示,相当于英语的constant。
6. 建立解释关系后,对应于符号的模型域中的对象,称作【指称】(reference),或者【指称义】(denotation)。reference多用于自然语言的语义研究,而denotation则是程序设计语言语义学的专用术语——denotation semantics。模型中的指称客体,通常用“e”表示,相当于英语的entity(【实体】)。
7. 【解释函数】:建立符号和指称实体之间对应关系的过程,书中称作【解释】(interpretation),有些书特别是面向计算机专业的数理逻辑书籍称作【绑定】(binding),反正意思就是使符号和实体对应。如果你是程序员,那么这个对你就更好理解了,其实就是定义一个变量后给变量赋值。在谓词逻辑语义学中,这个过程通过一个称作【解释函数】的机制完成。定义一个函数“I”,设该函数的定义域为符号集合L,值域为模型域中的对象集合D,这样的函数就称作解释函数。它的定义为:
I : L → D
解释函数的一个实例就是:
I (c) = e
意思是,解释函数接受一个符号,返回一个所对应的实体。例如,上面的例子“孔子”,“孔子”是两个汉字,
I (“孔子”) = 孔子
这里我们用带引号的“孔子”代表符号,用不带引号的孔子代表孔子这个实体的概念。

有了上面的术语、概念和说明,下面看一个例子:

(93) Some are white. [1]

这里没有任何上下文,我们无从知道这句话究竟在说什么。为了使这句话的意思更明确,我们先确定“指称”的域,D,这样我们就可以确定这句话的主题范围。假定D是雪花的集合,如果用a代表一片雪花,那么,a is white 就可以理解为:名称a所代表的实体“雪花”具有“白”这种属性。这里,我们从模型的域中,任意选取了一个指称对象,然后给它冠以“a”的名称,并以命题句“a is white”的形式陈述关于“a”的性质。如果用这种办法定义前面关于量词语义的定义,我们需要做的第一件事就是要对D中的所有实体赋予一个名称,这些名称的符号表示就是L中的符号元素。不过这种办法有一个缺陷就是,在定义符号系统L的时候,我们不知道有多少符号合适。一旦建立和特定模型的解释/绑定关系时,符号的数量和实体数量可能不匹配,如果实体数量多于符号数量就要增加符号,如果可以定义的符号用尽,就必须改变符号系统的定义。举个例子,车牌号。例如我们可以用三个拉丁字母和三个阿拉伯数字组合形成车牌号。如果规定字母和数字不能混合,只能是XXX-999的形式,那么这个车牌号系统只能对应从26个字母取3得到的排列和从0-9这10个数字取3的排列的和。所以,每当有新的车主申请车牌号,就得从这种排列和的方法中找出尚未使用的字母数字组合。但是当城市人口增加,买车的人数超过了这种组合方式最大容许量,那么只能修改组合方式,例如增加字母或数字的位数以适应新的需要。
为此,用解释函数对指称实体冠名的办法就必须改变。当然,如果预先知道模型域的大小是固定的,不会改变,前一种办法也是一种不错的办法。而面对不断膨胀或收缩的模型域,就得有另外一种办法。后面便会分别介绍这两种方法。第一种,我们称作替换法(Interpretation by substitution),第二种,称作评估法 (Interpretation by means of assignments)。

五、替换法

上面我们讨论了一阶谓词逻辑语义中的解释函数。如果这个名词对你过于抽象难以理解的话,不妨想象一下风景画。一副写实的风景画必然是对自然界的某一部分的描述,但这个描述并非百分之百地还原自然,而是由作画者的主观感受决定取舍。这个时候画中的每个元素都对应着作画者眼中自然界中相应的元素,例如一棵树、一块石头、一株草、一朵花等。我们可以把这幅画看做是对自然界某个部分的映射,从而建立画与自然之间的“解释函数”:只要找到画中的一个元素,我们就可以找到相应自然界的对应元素,换句话说,在画板上由各种颜料组成的某个区域,可以看做是一种符号,这个符号对应着自然界中某个空间中的某个自然物,画中所有元素与所有自然物对应关系的集合,就是一种“解释函数”。当然,这个比喻不是很严谨,因为逻辑语义学中的元素必须是离散了,可数的,可枚举的,而自然物,例如,天,河流等,是连续的,是无法精确划分成离散的个体。不过这个例子可以让我们重新复习一下前面讨论过的一些概念:模型、域和符号系统。

所谓【模型】在这里就是作画者所选取的自然空间,而且这个空间应当不是那个自然空间本身,而是作画者本人有所取舍的概念化的自然空间。这个空间可能会忽略一些作画者认为不需要表现的元素,或者,因人类视力所限无法看到或看清的元素,因此画画的对象是自然空间的“模型”而不是自然空间本身。

所谓【】,就是在这个模型中出现的所有元素的集合。就像上面所说,元素必须离散、可数的,这个只有在【模型】中才办得到。比如“天”,自然界中的天应当是不可数的,但是在作画者看来,所谓的“天”无非就是在画布上由其它元素隔开的几块不同区域,因此是“可数的”。

所谓【符号系统】这里就是风景画中的所有元素的集合。所以,这幅风景画的“语义”就是:作画者根据自己的视觉可及和主观感受在大脑中对某个自然空间景色“建模”,形成【模型】;在这个模型中,确定要画的所有元素,这就是【域】;而完成的作品,用颜料组成一个【符号系统】。当熟悉画中自然景观的观画者看到这幅画时就会联想实际的自然景观,从而形成从画到景观的【映射】关系。

理解了【模型】、【域】、【符号系统】、【解释】、【解释函数】,我们就可以进入正题,谈谈【替换法】和【评估法】。

替换法又称作替换解释(interpretation by substitution)。这种方法其实在前面的量词的语义处已经说明,主要是用来说明量词的语义。前面我们已经给出了精确的一阶谓词逻辑语言的描述,这里再用比较通俗的语言重复一遍:【全称量词】的语义就是:当我们说:“所有的人都会死”时,存在一个模型,这个模型中的元素都具有“人”的性质。同时,存在一个【符号系统】使得模型中的每个元素都对应着该符号系统中至少一个符号,说白了,就是每个人至少都有一个名字。所以,“所有的人都会死”的语义就是用每个人的名字【替换】“所有人都”出现的位置,例如,“张三会死”、“李四会死”,…同时用“合取”连接符将对应【域】所有元素的名称都替换一遍,这样,量化句就转化为N个个体名称+谓词句的合取操作。此时,解释函数的任务就是保证域中的所有元素都被赋予了至少一个名称。这个说明如果用一阶语言表述的话就是

类似地,我们还可以建立一般谓词的“语义”:在【域】中存在一个子集合,这个子集合与【符号系统】中的某个符号具有对应关系。所以,“张三很聪明”的意思就是:在人这个【域】中,存在一个子集合,这个子集合与汉语这个符号系统中“很聪明”具有对应关系,而张三是这个子集合的成员,使得“张三很聪明”这个句子为真。
这样,我们就可以为“谓词”建立解释函数:
                                              

其中,I是解释函数,A是谓词,a是名称,I(A)是域中的子集,I(a)是域中的个体元素,Aa相当于A(a),是逻辑句子的一般表示法。所以上面公式的通俗解读就是:
等号左面:A的解释函数I(A)的意思是:
等号右面:由名称a所对应的个体集合,使得“a是A”这个句子为真。
上面的公式还可以写成:
                                               

意思是:名称为a的个体是名称为A的谓词所对应个体子集的成员

无论用什么样的方式表示,用域中子集合的方式表示谓词语义通常称作“外延语义”。这种语义最常见的应用就是,当我们无法用“语言”说明某个事物或事件时,通常用是“举例”方法。例如,到外地或国外旅游,品尝到一种美味小吃,但是这种食品叫什么或者是一种方言或者是外语单词,我们无法从自己熟悉的语言中找到相应名词。要向自己的亲友解释,最好的办法就是把实物放在他们面前,“眼见为实”、“百闻不如一见”。这实际上就是用概念的外延在解释概念。
这种解释法的核心,就是替换,将全称量词句替换成个体名称的合取运算,将个体名称+谓词句替换成是这个句子为真的域元素的集合。
如果谓词是二元的,亦即,有两个个体词,那么其语义就成为所对应域元素有序对的集合
                                       
或者,
                                         

这里要注意的是,I(a)和I(b)可能分属两个不同,或者两个相同的域。如果是不同的域,例如D1和D2,就会写作D1xD2;如果是相同的域, 在多域的情况下,通常会用D^n
的方式表示,其中n是D的指数,例如上面的例子两个相同的域,故写作是D²。

有了上面的讨论,我们就可以给出谓词逻辑语言中关于【模型】的形式定义,以及谓词逻辑句子语义的赋值函数的定义
模型
相对于谓词逻辑某个语言的模型是由【域】和解释函数构成;域是一个非空集合;而解释函数有两种:个体名称的解释函数和谓词的解释函数。
如果c是语言L中的一个个体符号,那么I(c)的意思就是c所对应域中的个体元素;
如果B是语言L中的一个n元谓词符号,那么I(B)的意思就是域中的某个子集合,满足
                                                    

赋值函数
如果M是对应语言L的模型,其解释函数I是语言L中个体名称到域D的映射,那么,


就是基于M的赋值函数。这样,关于一阶谓词逻辑语义的赋值函数就成为

好了,现在小结一下:

谓词逻辑语言的语义是基于模型的映射关系。
1. 模型:由域和解释函数构成;解释函数的任务是为域中的元素起名字;
2. 赋值函数:对谓词逻辑中的每个句子分配真值
3. 谓词逻辑的语义称作外延语义,这种语义的实质不是定义,而是举例,用实例说明概念。
4. 所谓替换法就是利用赋值函数对句子赋予真值一种方法,它将量化句子中的变量用符号系统(亦称语言)中的名称一一替换,如果是全称量词则进行合取运算,若是存在量词则进行析取运算,从而获得该量化句子的真值。如果是谓词,则取域中的某个子集,并赋予名称,这样,像P(A)这样句子语义解释酒可以看作是域中某元素是该子集合的成员。判断这类一阶谓词句子的真值,就可以利用解释函数看看当前给定的名称所对应的域中个体是否是谓词所对应的子集合的成员,如果是该句子为真,如果不是则真值为假。
解释函数赋值函数的基本过程是将单句转化成含有所有域元素名称的个体名称句子的合取操作

六、评估法

当我们面对一个一阶谓词逻辑系统,设语言(符号系统)为L、域为D、解释函数为I,那么解释函数定义为:
I:L → D
其中L是I的定义域,D是I的值域。前面讨论的替换法有一个前提,解释函数I是满射函数,亦即,对于值域D的任何

【数理逻辑四】谓词逻辑及形式系统 【中】相关推荐

  1. 【数理逻辑四】谓词逻辑及形式系统 【上】

    谓词逻辑及形式系统(句法)[上] 一.简介 [谓词逻辑]是所有逻辑学的中心内容,包括亚里士多德的三段论(虽然那时谓词逻辑还没有产生).弗雷格的谓词逻辑.以及后来的数理逻辑三大流派都是围绕[谓词逻辑]展 ...

  2. 【数理逻辑四】谓词逻辑及形式系统 【下】

    谓词逻辑及形式系统 [下] 一.谓词逻辑的逻辑等价与逻辑蕴含 一个谓词公式想变为命题,具有确定真值.必须满足以下几个条件 ① 给定个体域(确定模型) ② 公式中的所有谓词都有 明确意义(确定解释函数) ...

  3. 【数理逻辑】谓词逻辑 ( 前束范式 | 前束范式转换方法 | 谓词逻辑基本等值式 | 换名规则 | 谓词逻辑推理定律 )

    文章目录 一. 前束范式 二. 前束范式转换方法 三. 前束范式示例 四. 谓词逻辑推理定律 一. 前束范式 公式 AAA 有如下形式 : Q1x1Q2x2⋯QkxkBQ_1 x_1 Q_2 x_2 ...

  4. 【数理逻辑】谓词逻辑 ( 一阶谓词逻辑公式 | 示例 )

    文章目录 一. 一阶谓词逻辑公式 二. 一阶谓词逻辑公式 示例 上一篇博客 : [数理逻辑]谓词逻辑 ( 个体词 | 个体域 | 谓词 | 全称量词 | 存在量词 | 谓词公式 | 习题 ) 一. 一 ...

  5. 把字符串每隔四个字符使用“-”中横线分隔的方法

    原文:把字符串每隔四个字符使用"-"中横线分隔的方法 string upstr = Regex.Replace(str, @"(\w{4}(?=[^$]))", ...

  6. Javascript之旅——第四站:parseInt中要注意的坑

    Javascript之旅--第四站:parseInt中要注意的坑 原文:Javascript之旅--第四站:parseInt中要注意的坑 前些天信用卡站点要接入一个新功能,不过还真比较坑爹,asp站点 ...

  7. ABP源码分析四十七:ABP中的异常处理

    ABP源码分析四十七:ABP中的异常处理 参考文章: (1)ABP源码分析四十七:ABP中的异常处理 (2)https://www.cnblogs.com/1zhk/p/5538983.html (3 ...

  8. Alibaba Druid 源码阅读(四) 数据库连接池中连接获取探索

    Alibaba Druid 源码阅读(四) 数据库连接池中连接获取探索 简介 上文中分析了数据库连接池的初始化部分,接下来我们来看看获取连接部分的代码 数据库连接池中连接获取 下面的相关的代码,在代码 ...

  9. “第四产业”升级,中软国际“蝶变”

    文 | 曾响铃 来源 | 科技向令说(xiangling0815) 中国正在进入数字经济的时代.随着十四五规划进一步强调加快数字化发展,建设数字中国的战略目标,即"激活数据要素潜能,推进网络 ...

  10. 第四章:OpenCV中的图像处理

    第四章:OpenCV中的图像处理 本章节你将学习图像的改变色彩空间.提取对象.图像的几何变换.图像的阈值.平滑图像等OpenCV图像处理的基本内容. 更多内容请关注我的GitHub库:TonyStar ...

最新文章

  1. JQuery+ajax+jsonp 跨域访问
  2. 不修改数组找出重复的数字
  3. 斯坦福NLP组最新报告:自然语言处理中的学习挑战(附149页报告全文下载
  4. MobileFormer-在目标检测任务上怒涨8.6 AP,微软新作MobileFormer
  5. function与感叹号!
  6. 远程通信(RPC,Webservice,RMI,JMS、EJB、JNDI的区别)对比
  7. Java se 8最新下载地址JDK8最新下载地址
  8. 快手短视频解析去水印原理及源码,sign+盐签名算法,获得无水印播放地址
  9. 一道经典的C++题,关于分钱的问题,适合新手阅读(黑客X档案论坛题目) [c#]
  10. 倍福BECKHOFF PLC:自动化编程笔记
  11. eclipse配置tomcat日志保存位置
  12. (转)protein 数据库
  13. 澳洲计算机专业排名2015,计算机专业世界排名
  14. 【电脑技术】修改无线网卡MAC地址失败的原因
  15. 计算机基础知识面试题集合(包含计网OSI、TCP/IP、HTTP、TCP、UDP、三次握手、四次挥手、OS进程线程、死锁,常见数据结构及排序,Linux常用命令、数据库基础等。)
  16. 网络爬虫学习笔记——网络爬虫简介
  17. xbox蓝牙手柄驱动_如何通过蓝牙将Xbox One控制器连接到Windows
  18. Linux下Docker安装微信文件传输问题
  19. 滑动窗口有关的算法面试题
  20. squid代理服务+ip代理池

热门文章

  1. 这些书你读过一多半,你就是编程大牛!
  2. 一步一步教你如何在手机上看电子书
  3. 小管家进销存_管家婆物联宝微订货V2.3发版公告
  4. 计算机软件429修复工具,运行时错误 429,ActiveX部件不能创建对象的解决方法小结...
  5. android toast 怎么用,Android学习 Android Toast的使用
  6. 【原创】SWOT分析思维的一些基本思考与见解
  7. 软件破解入门教程和解密手册——PE文件格式
  8. 初学者福利:分享五个免费的 Python 学习网站,抓紧收藏吧
  9. win10设置透明任务栏
  10. python安卓吾爱_python编程视频教程v1.0.0下载_Python编程安卓版下载_吾爱游戏网