打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
《用Prolog建专家系统》学习笔记(2)

二、使用Prolog的推理机

Prolog有内建的后向链推理机,用于实现专家系统的一部分功能。Prolog的规则表示知识,推理机用于获得答案。

每项规则有个总目标以及多个子目标,推理机对各个目标给予证明或者否定。推理结果与非确定性无关。

规则的结构和推理策略,适用于许多专家系统。仅需改进与用户的对话机制,以创建简单的专家系统。以下,实现一个简单的“鸟识别专家系统”。

(一)鸟识别系统

(1)规则的格式

IF 前提1, 前提2, ... THEN 结论

IF部分又叫“左半部”(LHS),THEN部分又叫“右半部”(RHS)。

注意,Prolog规则格式为 THEN-IF,LHS和RHS的位置与上述相反:

结论 :- 前提1,前提2,...

(2)关于鸟识别的规则

bird(laysan_albatross) :- family(albatross), color(white).

相当于:IF 它属于信天翁科,并且是白色的 THEN 它是萊珊信天翁

还有定义黑脚信天翁、天鹅的规则:

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)的基础上,增加分目(order):

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).

现在,“科”成了规则。

(3)关于其他关系的规则

bird(canada_goose):- family(goose), 
                     season(winter), 
                     country(united_states),
                     head(black), 
                     cheek(white).

规则的意是:加拿大黑雁属于鹅科,黑头白颈,冬天在美国。

bird(canada_goose):- family(goose), 
                     season(summer), 
                     country(canada), 
                     head(black), 
                     cheek(white).

规则的意是:加拿大黑雁属于鹅科,黑头白颈,夏天在加拿大。

地理位置可以定为多层次规则:

country(united_states):- region(mid_west).

country(united_states):- region(south_west).

country(united_states):- region(north_west).

country(united_states):- region(mid_atlantic).

country(canada):- province(ontario).

country(canada):- province(quebec).

region(new_england):- state(X), member(X, [massachusetts, vermont, ....]).

region(south_east):- state(X), member(X, [florida, mississippi, ....]).

(二)用户界面

有了用户界面,系统可以按需得到信息,不必强制用户事先输入。谓词ask提供这个功能。例如,询问鸟的特征:

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的最简版本是:

ask(Attr, Val):- write(Attr:Val), 
                 write('? '), 
                 read(yes).

如果用户回答“yes”,谓词read成功,否则失败。例如:

?- 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

用新谓词known/3记住用户的回答:

ask(A, V):- known(yes, A, V), % succeed if true 

            !. % stop looking

ask(A, V):- known(_, A, V), % fail if false 

            !, fail.

ask(A, V):- write(A:V), % ask user 

            write('? : '), 

            read(Y), % get the answer 

            asserta(known(Y, A, V)), % remember it 

            Y == yes. % succeed or fail

使用菜单的界面

将各个答案写在菜单上,由用户选择。谓词menuask做这件事。

size(X):- menuask(size, X, [large, plump, medium, small]).

flight(X):- menuask(flight, X, [ponderous, agile, flap_glide]).

menuask的简单实现:

menuask(A, V, MenuList) :- write('What is the value for'), 
                           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(' is not a legal value, try again.'), 
                                nl, 
                                menuask(A, V, MenuList).

一个简单的自造外壳

top_goal(X) :- bird(X).

solve :- abolish(known, 3), 
         define(known, 3), 
         top_goal(X), 
         write('The answer is '), 
         write(X), nl.

solve :- write('No answer found.'), nl.

内建谓词abolish清理系统黑板,以便开始新咨询。

● solve – 开始咨询;

● ask – 提问用户,记住回答;

● menuask – 让用户从菜单中选择;

● 支持配合上述3谓词的其他谓词。

知识库里的谓词包括:

● top_goal – 知识库的最高目标;

● 为识别、选择知识库对象而建立的规则(如:bird, order, family, and region);

● 必须由用户给出属性的规则(如:size, color, eats, and wings);

● 多值规则 - 定义哪些属性可有多个值。

在Prolog解释环境中使用这个外壳,必须将外壳和鸟类数据库装入内存:

?- consult(native).
yes
?- consult('birds.kb').
yes
?- solve.
nostrils : external_tubular?
...

这个外壳可以进一步增强为最高等级的命令环境,叫做“go”。go有3个命令:

· load – 将知识库装入内存。
· consult – 咨询知识库。
· quit – 退出外壳。

go :- greeting, 
      repeat, 
      write('> '), 
      read(X), 
      do(X), 
      X == quit.

greeting :- write('This is the Native Prolog shell.'), nl, 
            write('Enter load, consult, or quit at the prompt.'), nl.

do(load) :- load_kb,
            !.

do(consult) :- solve,
            !.

do(quit).

do(X) :- write(X), 
         write('is not a legal command.'), nl, 
         fail.
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
专家系统
第4章:Prolog程序的两种意义 · 笨办法学Prolog · 看云
Prolog教程4-简单查询 - 中国人工智能网
Prolog教程13-操作符
不规则谓词整理
Birds 1
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服