《用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.