1、形容词在编程语言中的表达方法、未知的属性和无意义的属性形容词作用于名词,能使名词的一些属性状态从【未知】变为【已知】。例如:A有一个球。B有一个(红色的)球。第二句话中有一个形容词“红色的”,告诉你这个球是红色的,球的属性是【已知】的;第一句话只告诉你有个球,没告诉你球的颜色,此时颜色属性是【未知】的。现在流行的编程语言Java和数据库语言SQL里,都没有专门的属性值用来表示【未知】。在数据库里,如果表格的某个单元格没有填上值,只要你设置了“允许空值”并且你没有设定默认值,那么它就会被初始化为null空值。表格中的空值,有时候表示这个属性值是不存在、无意义的,有时候却表示这个属性值是未知的、不
2、确定的。1.未知属性例如,钟恒的性别属性为空值,表示ta的性别还不确定,可能是ta填调查表的时候忘记了写性别。一般情况下人的性别只有男/女两种,一个人不可能不具有性别。2.无意义属性又例如,我建立了一张数据库表格,里面有四列,分别表示课程名称,以及这堂课在第几节课开始、在第几节课结束、在星期几上。对于网络课程,后面三个属性都是无意义的、不存在的。因为网络课程没有规定你必须在星期几什么时间段听课,你只要有一台电脑、能连得上网,就可以听课。3.现实世界中的对象存在大量的未知属性在人编程序中,程序员定义一个新的对象,通常是调用类的构造函数,一次性把全部属性都填上去,没填的就自动填上默认值,或者置空。
3、现实生活中,我们学习或者了解到一个新事物,一般不会一次性知道它的全部属性。人的认知过程是循序渐进的,如果对一个事物的某一方面暂时还不了解,那就在头脑里面把它的属性值设置为【未知】,待以后填补这个空白。比如我听说星期三要上PHP程序设计课,但不知道在哪一节课上,那么“在第几节课开始”和“在第几节课结束”这两个属性值就暂时设值为【未知】,以后补上。4.用谓词逻辑法,区分未知属性和无意义属性JavaScript脚本语言里,用undefined表示一个未定义的变量,用null来表示空的变量。C+、Java语言里面没有“未知”的概念,我们只能建立一张表,来表明那些属性是未知的,那些属性是空的(null)
4、。下图所示为Nullitem空项表由于数据库中,为空的项大多数是未知项,所以我规定,计算机查询一个对象的属性,如果返回的结果是null,这时候有两种可能这属性要么是无意义的、不存在的(真正的null),要么是未知的。这时候再让计算机去查一下空项表(Nullitem),如果表格中确实存在这一项,则表明这个属性的值为空,否则就表明这个属性的值是未知的。二、形容词的两大作用1.缩小查找范围对句子中的名词对象进行修饰,缩小查找范围。相当于数据库select语句where子句后面添加的条件。例如:查找(实验班的)高三学生这句话中,“实验班的”是句子的定语成分,表示“1班或2班的学生”(假定实验班就是1、
5、2班),这句话相当于数据库语句:Select * from Student where (班级=1 or 班级=2) and 年级=3;2.给对象的属性赋值形容词作用于一个名词,自然语言中的表达方式为:名词是形容词,这相当于对名词的某一属性进行赋值。例如钟恒是一个学生,但由于我对这个人不熟悉,只是听说ta的名字,其他一概不知。现在别人告诉我“钟恒是男的”,这个句子中名词是“钟恒”,形容词是“男的”。这样一来,钟恒的性别从【未知】变成了【男】,在编程语言里这就相当于将钟恒对象的性别属性赋值为男(布尔值true)。三、【形容词表达式】 的一对多映射同样一个形容词,作用于(修饰)不同类型的名词,得翻
6、译成不同的表达式,才能让计算机做出正确的判断。比如形容词“北京的”,可以修饰一辆车,也可以修饰一个人,或者一串电话号码。北京的车,即车牌号以“京”字开头的车。北京的人,即身份证号码以110开头的人。北京的电话号码,即开头区号为010的电话号码。程序运行截图四、形容词查询的两种方式1. 根据谓词本身含义查询,直接对对象的属性值进行运算比如形容词“北京的”,北京人的身份证号码是110开头的,可以根据身份证号码来判定这个人的籍贯是不是北京。数据库伪代码为:Select * from Person where 身份证号码以110开头这需要精确读取身份证号字符串,如果不知道身份证号码就无法判断。2. 谓
7、词逻辑方法,在事实库中查询前面那种方法显然不符合人类的思维习惯,几乎没有人会去记身边的人的身份证号码。我了解到X是北京的,我只要在头脑中做个标记,记住这个命题就可以了,我不需要去记X的身份证号码到底是多少。计算机查询方法:枚举表格中所有的人员,分别构建命题:形容词名(人名)然后到事实库表格中查找,看有没有这样一条真命题。如果有,则返回真;否则就返回假。五、形容词在推理过程中的作用相当于谓词这是一张If-Then命题表,如果左边的(LHS=Left Hand Side左手边)命题成立,则右边的命题成立,或者执行右边的命令语句。比如第一条,如果某个人的技能属性(abilities,是个数组)里包含
8、“JavaWeb开发”这项技能,则给他的增加一项技能“Java语言”。这就是说,如果某个人会JavaWeb开发,则他一定会Java语言。比如第三条,如果某个人会安卓开发,则他一定会Java。如果检测到某个人X会安卓开发,则向事实库写入命题“会Java的(X)”。这是Person表格的初始状态。在查询界面下输入信息查找会Java编程的人,系统返回的数据只有一条,根据前面的表格我们知道:陆小千会JavaWeb开发,他肯定也会Java语言;程华会安卓开发,他肯定也会Java语言。这个时候我们就得刷新事实库,让计算机做演绎推理。将如果一个人会JavaWeb开发,则他一定会Java语言和陆小千会Java
9、Web开发这两条命题联立起来,得到新结论:陆小千会Java语言。刷新之后,再次查看整张表格可以看见系统给陆小千增添了一项技能“Java语言”。与此同时,事实库中新增了一条命题“会Java开发的(程华)”,如下图所示。再次查询得到3条记录六、对象属性的两种表示方法1.“对象.属性=值”方法直接将具体值存储到对象的属性成员中,或者直接对对象的属性成员进行写操作。这种方法的优点是:可以直接根据对象名查询属性的值;缺点是不便于推理2.谓词逻辑方法把对象的属性状态作为一个命题写到事实库中。3附:函数、谓词、命令、命题的区分谓词只会告诉你一个状态是true还是false,它不会直接地修改对象的属性值,它只能对事实库进行增删改查。函数则可能会直接修改对象。谓词+参数 构成命题函数+参数 构成命令