在框架结构中, 过程可以以各种不同的方式附在框架中,这里过程通常被称为“幽灵(Demon)”。框架中的幽灵主要有两种:IF-ADDED型和IF-NEEDED型。当框架中的某槽填以某一值时, 幽灵就被激发,这类幽灵称为IF-ADDED幽灵。例如,一个关于人的框架可以在婚姻状况槽中附加一个IF-ADDED幽灵,如果该槽在某次例化中填以"MARRIED"值,那么该幽灵就被激发,它的作用是例化另一个框架,表示该框架的妻子或丈夫。当需要计算或求框架中某槽的值时,幽灵被激发,这类幽灵称为IF-NEEDED幽灵。IF-ADDED幽灵可用来处理错误。例如,当槽值越界时就启动幽灵进行必要的处理,比如显示出错信息或终止运行。幽灵的作用取决于应用1。
基本介绍在人工智能中有一种叫做幽灵(demon)技术。它的基本思想是在数据结构(或状态中)附加知识的过程表示,当条件满足时,会触发此幽灵过程,达到知识处理或使用知识的目的。
所谓面向对象的知识表示方法,进一步将幽灵过程思想一般化。对象表示方法的基本思想是世界由一些对象组成,一个对象具有自己的内部结构和内部状态,同时也具有改变内部状态的一组过程。对象之间的联系是通过通讯而发生关系的,一个对象可以向其他对象发送信息,对象因接受信息而被激活。整个问题求解过程由各对象之间相互通讯,协同工作而完成。
对象表示法把状态法和过程法普遍化,任一对象均具有状态和过程两方面。对象既可以看成附有状态的过程,也可以看成附有过程的状态2。
框架结构知识的框架结构表达方式是1957年由Minsky率先提出的一种基于日常生活经验行为的表达法。由于我们对已知事物的了解或对新事物的判别常常表现为对事物各方面属性的综合掌握或判断,用反应事物特性的属性值表示事物,也就理属当然。这样的知识表达法中,事物属性的总和称为事物的框架,每个属性称为框架的一个槽,具体的属性值称为槽值,于是每个具体的事物就可以由这样一组槽值表示。槽值既可以是固定的数值或符号,也可以是描述其它对象的框架,因为属性值也可以看做是待描述的事物;槽值还可以附上过程描述,如if_added过程、if_needed过程等幽灵过程,方便地描述属性的某些动态特性。最后,槽值还可以省缺,由上层框架或其它槽说明。
用框架系统进行推理,或者说认识事物,很类似日常生活中的行为,就是从现有系统中选出最接近待定事物的框架,进行符合性检查。如果相差太大,就要修改原有框架甚至构造新框架,直至达到规定的符合程度。获得的新框架实例就可以向我们提供新事物有关知识。
框架结构适于描述公共事实群,因为同类事物具有共同的框架。
框架表达与推理的实现框架用谓词表达十分简单,例如其中的一种形式是
( ,).
主要问题是推理。
在框架系统中主要的操作有3:
1. 槽值Slot_Value的检索:给定框架-槽的检索路径,求出槽值。
2. 特性继承(inheritance):多个框架(称为子框架) 的某些共同属性可由上一层框架(称为母框架) 统一描述,子框架中不必列出母框架具有的属性,而是继承了母框架的全部属性。查寻子框架的这些属性需要到它的母框架中寻找。
3. 框架的修改(update):改变框架某些槽的值。
4. 附加幽灵过程(demon processing):根据计算、填值或撤消某个槽或槽值的需要,一个进程可自动触发执行上述操作,这样的进程称为幽灵进程。使用幽灵进程能大大方便知识表示。例如我们可以在人的健康情况框架中,为体重槽设置人的身高-体重估算进程,如果在检索体重时发现没有填值,但可以检索到身高值,就触发该进程,计算体重估算值并作为体重槽值。估算进程可以根据经验数据编写。
5.槽输入项的省缺值处理:如子框架中某一属性的值与母框架中同一属性的值相同,则可以省缺;如果不相同,则不能省缺。
以上功能可通过增加相应的react子句实现。如为了实现槽值的检索,假设询问目标Goal形式为
Slot_Name(Frame_Name,Slot_Value),
我们只需增加子句
react(Theory,Goal,fr( Frame_Name),Continuation)
:-
Goal =..[Slot_Name,Frame_Name | Rest_Part],
name_of(Frame_Name,Frame_Theory) ,
find(Goal,Frame_Theory,Continuation).
于是执行find谓词目标时,在框架Frame_Theory中找到形如 (,)的子句与Goal匹配,一旦成功就查寻到了Slot_Value。
name_of 谓词的作用是提供查询框架理论的策略,譬如采用数据分块,索引查找等方法提高查询效率,当然这些控制都是在元级进行的。
为了查寻子框架继承的特性值,框架系统应有如下形式的断言:
is_a(,).
于是可根据Frame_Name 查到上层框架名Super_Frame_Name,进而再到存贮了相应上层框架的真实内容的Super_Frame_Theory 中查寻相应槽值。为此增加react 子句:
react(Theory,Goal,inh( [Slot_Name | Inh_Trace] ),Continuation)
:-
Goal=..[Slot_Name,Frame_Name | Rest_Part],
name_of(Frame_Name,Frame_Theory),
find(is_a(Frame_Name,Super_Frame_Name),
Frame_Theory, _),
name_of(Super_Frame_Name,Super_Frame_Theory),
Super_Goal=..(Slot_Name,Super_Frame_Name |Rest_part),
react(Super_Frame_Theory,Super_Goal,
Inh_Trace,Continuation).
下一个问题是框架槽值的修改。过去,正规的做法是在老的框架上修改槽值。然而,在框架上进行直接修改会破坏理论的一致性。为此我们首先建立新的框架,再抛弃旧的框架。此项工作由drop_from和add_to两谓词完成,此两谓词与PROLOG中retr_act和assert谓词十分相似,只是更局部一些。修改框架槽值的工作通过增加如下react子句完成:
react(Theory,update(Ftame_Name,Slot,
New_Value),upd(Frame_Name,Slot,New_Value), true)
:-
Old_Assert=..[Slot,Frame_Name,Old_Value),
name_of(Frame_Name,Frame),
drop_from(Frame,Old_Assert,Intermed_Frame),
New_Assert=..[Slot,Frame_Name,New_Value],
add_to(Intermed_Frame,New_Assert,New_Frame).
前面所叙述的特性继承机制同样支撑某些槽值的省缺的处理。尽管还可以提出一些不同的处理省缺的办法,为简单起见,这里就不叙述了。
最后一个问题就是幽灵的处理。我们首先假定某框架包含子句头形式如下的一些规则:
demon(,,,)
:- ...... .
这些规则就是附属于槽Slot的过程。假定是换值幽灵过程,那么就应在修改槽值的过程中,执行此幽灵过程。为此,我们将上述已经描述的适合框架修改的react修改为
eact(Theory,update(Frame_Name,Slot,New_value),
upd(Frame_Name,Slot,New_Value),true)
:-
Old_Assert=..[Slot,Frame_Name,OId_Value].
name_of(Frame_Name,Frame),
dro_pfrom(Frame,Old_Assert,Intermed_Frame_0),
New_Assert=..[Slot,Frame_Name,New_Value],
add_to(Intermed_Frame_0,New_Assert,
Intermed_Frame_1),
demo(Intermed_Frame_1,demon(Slot,Old_Value,
New_Value, Intermed_Frame_1), _).
其他幽灵过程的处理,与此大致相同。
至此,已经使用元级PROLOG技术处理了所有的有关框架推理的问题,元级谓词的编写工作是很少的3。
本词条内容贡献者为:
李岳阳 - 副教授 - 江南大学