面向对象的知识表示方法

注:本文为本人完成人工智能本科专业的知识工程平时作业时整理,介绍向而非实践向。

引言

在Python程序设计的课程中我学习过面向对象的编程方法,通过将属性值与函数封装成类实现模块的整体性抽象,通过继承和多态实现子类的搭建与修改。

而于知识工程中恰好也可以将一个知识概念中的 本体(ontology)封装成类,将其文字描

述置为类的属性值,其与其他本体的联系通过函数表示,并可通过这个类实例化出具体的对象。

下面是我的具体理解,并将通过概念分析、绘图、C++代码的方法进行展示:

组件

1.类

不从对象而从类开始叙述,是因为我认为类与知识工程中的本体相对应。课程中给出 本体(ontology)是一个概念体系的显示的形式化规范是一种抽象机制,不难想到类是对一组相似对象的抽象。

具体到面向对象的框架而言,类是那些具有相同结构和处理能力的对象的抽象描述。而在知识表示中一个类定义了一种对象类型,它描述了属于该对象类型的所有对象的性质。

面向对象的知识表示方法

Animal的语义网知识表示

以课堂中给出的语义网(Semantic Network)为例进行分析,Mammal和Fish都是具体对象,但它们有共同属性,如栖息地、上层纲、习性、生殖方式等。于是可把它们一并抽象成”Animal”, “Animal”便是一个类对象

各个类还可以进行进一步抽象,形成超类。例如对从Bear到Mammal,从沙丁鱼到Fish,Fish与Mammal合成Animal。那么Animal便是Bear与Fish的超类。这样类、超类和对象就形成了一个层次结构。其实该结构还可以包含更多的层次,层次越高就越抽象,越低级便越具体。

而类的对应也对应着课堂中所学的本体工程(Ontology Engineering),领域知识最好能抽象成一个本体,然后自上而下地进行构建。不过显然因为超类的存在我们还可以从下向上地构建,灵活度大大增强。

2.对象

谈完与课程中联系更为紧密的”类”,现在我们来理解知识表示中的由类实例化而来的”对象”。 对象从广义上来讲是指这个客观世界中的任何事物,它可以是一个具体的事物,也可以是由多个简单事物组合而成的复杂事物。

对应着程序编程中的一个可以由你命名的实例,若该类的属性中含有需要”init“(构造函数,python语法)中引入的其他附属类,那么该类实例化出的对象显然就可以认为是从”多个简单事物”构成。

从问题求解的角度讲,对象是与问题领域有关的客观事物。由于客观事物具有其自然属性及行为,因此与问题有关的对象也有一组数据和一组操作,且不同对象间的相互作用可通过互传消息来实现,我们可以通过编程语言给我们提供的类下的函数来快速实现这一方法。

3.封装

封装是指一个对象的状态只能由它的 私有操作来改变它,其它对象的操作不能直接改变它的状态。当一个对象需要改变另一个对象的状态时,它只能向该对象发送消息,该对象接收消息后就根据消息的模式找出相应的操作,并执行操作改变自己的状态。封装是一种信息隐藏技术,封装是面向对象方法的重要特征之一。它使对象的用户可以不了解对象行为实现的细节,只需用消息来访问对象,使面向对象的知识系统便于维护和修改。

4.消息

消息是指在通信双方之间传递的任何书面、口头或代码的内容。在面向对象的方法中, 对对象实施操作的唯一途径就是向对象发送消息,各对象间的联系只有通过消息发送和接收来进行。同一消息可以送往不同的对象,不同对象对于相同形式的信息可以有不同的解释和不同的反应。

5.继承.

继承是指父类所具有的数据和操作可以被子类继承,除非在子类对相应数据及操作重新进行了定义,这称为对象之间的继承关系。面向对象的继承关系与框架间属性的继承关系类似,可以避免信息的冗余。

6.多态

代码展示

这是我个人编写的一段可执行的C++代码,以前面老师上课给出的动物图谱(见上页)为例,其运用面向对象的知识表示方法,包含了如下的知识结构:

面向对象的知识表示方法

我将构建的知识的图像化表示

#include<iostream>
using namespace std;

class Mammal        //&#x7236;&#x7C7B; &#x54FA;&#x4E73;&#x52A8;&#x7269;&#x7C7B;
{
public:
    Mammal(int number) { population = number; }   //&#x5B9A;&#x4E49;&#x4E24;&#x79CD;&#x6784;&#x9020;&#x51FD;&#x6570;(&#x79CD;&#x7FA4;&#x6570;&#x91CF;/&#x6570;&#x91CF;+&#x7236;&#x79CD;&#x7FA4;)
    Mammal(int number, Mammal* mm) { population = number; Mammal* from = mm; }
    virtual void cry() {};                        //&#x53EB;&#x58F0;
    virtual void run() {};                        //&#x5954;&#x8DD1;
    void die(int die_num) { this->population -= die_num; }     //&#x6B7B;&#x4EA1;
    int get_population() { return population; }    //&#x6709;&#x591A;&#x5C11;&#x53EA;

private:
    int population;
    Mammal* from;
};
</iostream>

class bear : public Mammal       //&#x54FA;&#x4E73;&#x7C7B;&#x5B50;&#x7C7B;:&#x718A;&#x7C7B;
{
public:
    bear(int number, Mammal* mm) :Mammal(number, mm) { population = number; from = mm;  }
    void cry() {
        cout << "roar!" << endl;}
    void run() {
        cout << "bear is running" << endl; }
    int get_population() {return population;}
    int die(int die_num)
    {   this->population -= die_num;
        from->die(die_num);
        return die_num;
    }
private:

    int population;
    Mammal* from;
};

主函数如下

int main() {
    Mammal mammal(100);
    bear b(30,&mammal);
    cout << "&#x539F;&#x6709;" << b.get_population() << "&#x53EA;&#x718A;." << endl;
    cout << "&#x539F;&#x6709;" << mammal.get_population() << "&#x4E2A;&#x54FA;&#x4E73;&#x7C7B;&#x52A8;&#x7269;." << endl;
    cout<<"你杀死了"<<b.die(10)<<"只熊"<<endl; cout <<"余下" << b.get_population() "只熊." endl; "余下" mammal.get_population()<<"个哺乳类动物." } < code></"你杀死了"<<b.die(10)<<"只熊"<<endl;>

运行结果为

面向对象的知识表示方法

总结

通过撰写的属性与熊数量减少会通过消息使得哺乳动物同样减少的架构不难看出,该段程序含有的语义网的各组件具有如下的特性:

类:本体般的相同结构的抽象性,子类、父类的易扩展性。

对象:本体的快速实例化性。

封装:内部的变量保护性。

消息:本体之间的通信性。

如:程序中编写了bear减少会导致Mammal减少同样的数量。

继承:子类继承父类的数据和操作。

如:父类中的虚函数:叫声与速度。

多态:可以多态性地描述子类。

面向对象方法学的主要观点:

1.认为世界由各种”对象”组成,任何事物都是对象

2.所有对象被分成各种对象类,每个对象类都定义了所谓”方法”(Method)

3.对象之间除了互递消息的联系之外,不再有其它联系

4.对象类将按”类”、 “子类”、与”超类”等概念形成种层次关系(或树形结构)。

Original: https://blog.csdn.net/qq_53036624/article/details/123852625
Author: Green·TyanEz
Title: 面向对象的知识表示方法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/556577/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球