丁浩轩Prolog教学实习报告.docx
- 文档编号:4873255
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:17
- 大小:709.58KB
丁浩轩Prolog教学实习报告.docx
《丁浩轩Prolog教学实习报告.docx》由会员分享,可在线阅读,更多相关《丁浩轩Prolog教学实习报告.docx(17页珍藏版)》请在冰豆网上搜索。
丁浩轩Prolog教学实习报告
天津农学院
<
教学实习报告
题目:
动物识别系统
学号0908054113
姓名丁浩轩
系别计算机科学与信息工程系
专业班级软件工程1班
指导教师马国强
成绩评定
2012年8月
目录
1开发内容1
1.1开发目标1
1.2实习任务1
1.3运行设备及环境1
1.4实习主要步骤1
2问题及算法1
2.1问题的描述1
2.2算法的一般思路2
2.3求解问题的算法描述3
2.4算法实现的关键技巧4
3运行结果与分析13
5程序分析及结论14
1开发内容
1.1开发目标
(1)综合应用“知识表示”、“知识获取”、“知识利用”这三个人工智能技术的基本知识以及程序设计的相关知识。
(2)通过设计一个专家系统,并使用Prolog语言将其实现,加深对专家系统和Prolog语言的了解。
1.2实习任务
使用prolog编写一个动物识别的专家系统,并对其尽可能多地进行改进。
1.3运行设备及环境
PC机;prolog软件
1.4实习主要步骤
根据任务目标,明确开发的具体任务;
设计求解问题的流程图,并编写程序实现算法;
2问题及算法
2.1问题的描述
尽管专家系统有众多类型,名称各异,但基本原理框图一致,如图1所示。
专家系统的核心是知识库和推理机,其基本工作过程为:
系统根据知识库中的知识和用户提供的事实进行推理,不断地由已知前提推出一些初步结论,并将这些初步结论作为中间结果存放在数据库中,然后将其作为新的已知事实进行下一步推理,往复循环,逐步逼近求解目标。
在这个过程中,系统可以通过人机接口不断地与用户交流,向用户提问,或对用户提出的问题做出解释。
知识库是专家系统的知识存储器,用来存放求解问题的领域知识(包括事实性知识和启发性知识)。
常见的知识表示法有:
一阶谓词逻辑表示法、产生式规则表示法、语义网络表示法、框架表示法、脚本表示法、过程表示法、状态图表示法、面向对象表示法以及一些不确定知识的表示方法等。
推理机是专家系统中用来实现推理的程序。
其主要功能是模拟领域专家的思维过程,控制并执行对问题的求解。
它能根据当前已知的事实,利用知识库中的知识,按一定的推理方法和控制策略进行推理,直到得出相应的结论为止。
它包括推理方法和控制策略两个部分。
推理方法可以采用精确推理或非精确推理。
控制策略分为推理策略和搜索策略两个部分,其中,搜索策略是关键,它可以分为非启发式的搜索和启发式搜索,现代主要采用启发式搜索。
数据库又称为/黑板0或/综合数据库0,它主要用来存储有关领域问题的初始事实、问题描述、推理过程中得到的中间结果以及最终结果等信息。
解释机构由一组程序组成,它能够跟踪并记录推理过程,当用户提出的询问需要给出解释时,它将根据问题
的要求做出相应的处理,最后把解答用约定的形式通过人机接口输出给用户。
目前,大多数专家系统都采用人机对话的交互式解释方法。
知识获取机构主要实现机器学习。
人机接口是领域专家、知识工程师、一般用户间进行交互的界面,由一组程序及相应的硬件组成,用于完成输入输出工作。
图1
2.2算法的一般思路
在prolog中,
规则就是知识库。
事实就是工作空间中存储的信息。
prolog的内建的模式匹配和回溯功能就是推理机构。
prolog的解释器就是用户界面。
所以,通过prolog可以很方便地解决专家系统问题。
2.3求解问题的算法描述
2.3.1事实
事实用来说明一个问题中已知的对象和它们之间的关系。
在Prolog程序中,事实由谓词名及用括号括起来的一个或几个对象组成。
谓词和对象可由用户自己定义。
例如,谓词likes(bill,book).
是一个名为like的关系,表示对象bill和book之间有喜欢的关系。
2.3.2规则
规则由几个互相有依赖性的简单句(谓词)组成,用来描述事实之间的依赖关系。
从形式上看,规则由左边表示结论的后件谓词和右边表示条件的前提谓词组成。
例如,规则 bird(X):
-animal(X),has(X,feather).
表示凡是动物并且有羽毛,那么它就是鸟。
2.3.3目标(问题)
把事实和规则写进Prolog程序中后,就可以向Prolog询问有关问题的答案,询问的问题就是程序运行的目标。
目标的结构与事实或规则相同,可以是一个简单的谓词,也可以是多个谓词的组合。
目标分内、外两种,内部目标写在程序中,外部目标在程序运行时由用户手工键入。
例如问题 ?
-student(john).
表示“john是学生吗?
”
bird(laysan_albatross):
-
family(albatross),
color(white).
bird(black_footed_albatross):
-
family(albatross),
color(dark).
bird(whistling_swan):
-
family(swan),
voice(muffled_musical_whistle).
bird(trumpeter_swan):
-
family(swan),
voice(loud_trumpeting).
family(albatross).
color(dark).
?
-bird(X).
X=black_footed_albatross
2.4算法实现的关键技巧
增加层次关系
动物界为动物分了科、目、属、种、类等几个层次,这些层次构成一个树状结构,下面的几条规则就描述了其中的一些层次结构。
作为有强大回溯功能的prolog可以很容易的把这些规则串起
来,而不需要我们做更多的工作。
bird(laysan_albatross):
-
family(albatross),
color(white).
bird(black_footed_albatross):
-
family(albatross),
color(dark).
bird(whistling_swan):
-
family(swan),
voice(muffled_musical_whistle).
bird(trumpeter_swan):
-
family(swan),
voice(loud_trumpeting).
order(tubenose):
-
nostrils(external_tubular),
live(at_sea),
bill(hooked).
order(waterfowl):
-
feet(webbed),
bill(flat).
family(albatross):
-
order(tubenose),
size(large),
wings(long_narrow).
family(swan):
-
order(waterfowl),
neck(long),
color(white),
flight(ponderous).
nostrils(external_tubular).
live(at_sea).
bill(hooked).
size(large).
wings(long_narrow).
color(dark).
?
-bird(X).
X=black_footed_albatross
2.4.1用户界面
前面我们一直是使用prolog的事实来储存有关用户掌握的信息,作为一个真正的专家系
统,系统应该主动的向用户提问以收集信息,而不是让用户自己把所有的信息手工输
入。
所以这里当我们遇到需要向用户收集信息的时候,就应该向用户提出问题。
前面的有关鸟的属性都是需要从用户那里获得的信息.
bird(laysan_albatross):
-
family(albatross),
color(white).
bird(black_footed_albatross):
-
family(albatross),
color(dark).
bird(whistling_swan):
-
family(swan),
voice(muffled_musical_whistle).
bird(trumpeter_swan):
-
family(swan),
voice(loud_trumpeting).
order(tubenose):
-
nostrils(external_tubular),
live(at_sea),
bill(hooked).
order(waterfowl):
-
feet(webbed),
bill(flat).
family(albatross):
-
order(tubenose),
size(large),
wings(long_narrow).
family(swan):
-
order(waterfowl),
neck(long),
color(white),
flight(ponderous).
nostrils(X):
-ask(nostrils,X).
live(X):
-ask(live,X).
bill(X):
-ask(bill,X).
size(X):
-ask(size,X).
eats(X):
-ask(eats,X).
feet(X):
-ask(feet,X).
wings(X):
-ask(wings,X).
neck(X):
-ask(neck,X).
color(X):
-ask(color,X).
ask(Attr,Val):
-write(Attr:
Val),write('?
'),read(yes).
?
-bird(X).
nostrils:
external_tubular?
yes.
live:
at_sea?
yes.
bill:
hooked?
yes.
size:
large?
yes.
wings:
long_narrow?
yes.
color:
white?
yes.
X=laysan_albatross
2.4.2记住答案
我们使用新的谓词known来记住用户对问题的回答。
这个谓词的子句不是直接写在程序
中的,而是通过assert动态的加入到系统中的,这也就是专家系统的工作空间working
storage。
每次调用ask谓词要做的第一件事情,就是检查known谓词是否已经保存了这个问题的信息。
如果还没有保存过这样的问题的信息,就会在用户回答以后,把回答的答案加入到系统中。
bird(laysan_albatross):
-
family(albatross),
color(white).
bird(black_footed_albatross):
-
family(albatross),
color(dark).
bird(whistling_swan):
-
family(swan),
voice(muffled_musical_whistle).
bird(trumpeter_swan):
-
family(swan),
voice(loud_trumpeting).
order(tubenose):
-
nostrils(external_tubular),
live(at_sea),
bill(hooked).
order(waterfowl):
-
feet(webbed),
bill(flat).
family(albatross):
-
order(tubenose),
size(large),
wings(long_narrow).
family(swan):
-
order(waterfowl),
neck(long),
color(white),
flight(ponderous).
nostrils(X):
-ask(nostrils,X).
live(X):
-ask(live,X).
bill(X):
-ask(bill,X).
size(X):
-ask(size,X).
eats(X):
-ask(eats,X).
feet(X):
-ask(feet,X).
wings(X):
-ask(wings,X).
neck(X):
-ask(neck,X).
color(X):
-ask(color,X).
ask(A,V):
-
known(yes,A,V),
!
.
ask(A,V):
-
known(_,A,V),
!
fail.
ask(A,V):
-
write(A:
V),
write('?
:
'),
read(Y),
asserta(known(Y,A,V)),
Y==yes.
?
-bird(X).
nostrils:
external_tubular?
:
yes.
live:
at_sea?
:
no.
feet:
webbed?
:
yes.
bill:
flat?
:
yes.
neck:
long?
:
no.
no
?
-bird(X).
No
2.4.3具有多值的回答
我们还可以对known谓词进行改进。
到目前为止,ask谓词所询问的问题都是是非问题。
这意味着用户可能会对color-white和color-black这样的问题同时回答yes,这显然是不合
理的,当系统知道color-white是真的时候,就应该同时知道color-black是假。
这就是说
color属性只能是单值的,不过对于voice这样的属性就可以多值的。
所以我们在专家系统
中应该对这些属性进行说明。
bird(laysan_albatross):
-
family(albatross),
color(white).
bird(black_footed_albatross):
-
family(albatross),
color(dark).
bird(whistling_swan):
-
family(swan),
voice(muffled_musical_whistle).
bird(trumpeter_swan):
-
family(swan),
voice(loud_trumpeting).
order(tubenose):
-
nostrils(external_tubular),
live(at_sea),
bill(hooked).
order(waterfowl):
-
feet(webbed),
bill(flat).
family(albatross):
-
order(tubenose),
size(large),
wings(long_narrow).
family(swan):
-
order(waterfowl),
neck(long),
color(white),
flight(ponderous).
nostrils(X):
-ask(nostrils,X).
live(X):
-ask(live,X).
bill(X):
-ask(bill,X).
size(X):
-ask(size,X).
eats(X):
-ask(eats,X).
feet(X):
-ask(feet,X).
wings(X):
-ask(wings,X).
neck(X):
-ask(neck,X).
color(X):
-ask(color,X).
flight(X):
-ask(flight,X).
ask(A,V):
-
notmultivalued(A),
known(yes,A,V2),
V\==V2,!
fail.
ask(A,V):
-
known(yes,A,V),
!
.
ask(A,V):
-
known(_,A,V),
!
fail.
ask(A,V):
-
write(A:
V),
write('?
:
'),
read(Y),
asserta(known(Y,A,V)),
Y==yes.
?
-bird(X).
nostrils:
external_tubular?
:
yes.
live:
at_sea?
:
yes.
bill:
hooked?
:
yes.
size:
large?
:
yes.
wings:
long_narrow?
:
yes.
color:
white?
:
yes.
X=laysan_albatross
2.4.4用户菜单
我们可以进一步的改进用户的界面,例如可以添加让用户选择答案的菜单功能。
我们使用menuask谓词来完成这个功能。
它和ask很相像,不过多了一个用来保存所有可
能的属性值的列表参数。
bird(laysan_albatross):
-
family(albatross),
color(white).
bird(black_footed_albatross):
-
family(albatross),
color(dark).
bird(whistling_swan):
-
family(swan),
voice(muffled_musical_whistle).
bird(trumpeter_swan):
-
family(swan),
voice(loud_trumpeting).
order(tubenose):
-
nostrils(external_tubular),
live(at_sea),
bill(hooked).
order(waterfowl):
-
feet(webbed),
bill(flat).
family(albatross):
-
order(tubenose),
size(large),
wings(long_narrow).
family(swan):
-
order(waterfowl),
neck(long),
color(white),
flight(ponderous).
nostrils(X):
-menuask(nostrils,X,[external_tubular,internal_tubular]).
live(X):
-menuask(live,X,[at_sea,at_land]).
bill(X):
-menuask(bill,X,[flat,thin]).
size(X):
-menuask(size,X,[large,plump,medium,small]).
feet(X):
-menuask(feet,X,[webbed,flexible]).
wings(X):
-menuask(wings,X,[long_narrow,short_wide]).
neck(X):
-menuask(neck,X,[long,short]).
color(X):
-menuask(color,X,[white,dark]).
flight(X):
-menuask(flight,X,[ponderous,agile,flap_glide]).
menuask(A,V,MenuList):
-
write('Whatisthevaluefor'),write(A),write('?
'),nl,
write(MenuList),nl,
read(X),
check_val(X,A,V,MenuList),
asserta(known(yes,A,X)),
X==V.
check_val(X,A,V,MenuList):
-
member(X,MenuList),!
.
check_val(X,A,V,MenuList):
-
write(X),write('isnotalegalvalue,tryagain.'),nl,
menuask(A,V,MenuList).
3运行结果与分析
运行数据及结果
?
-bird(X).
nostrils:
external_tubular?
:
yes.
live:
at_sea?
:
yes.
bill:
hooked?
:
yes.
size:
large?
:
yes.
wings:
long_narrow?
:
yes.
color:
white?
:
yes.
X=laysan_albatross
5程序分析及结论
通过使用Prolog,很方便地解决了识别鸟类的专家系统问题,但是,如果把鸟的种类进一步增加,细分规则进一步增加,那系统的编写将会变得很麻烦。
所以可以考虑把数据库引进来,方便系统的构建。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 丁浩轩 Prolog 教学 实习 报告