《用Prolog建專家系統》學習筆記(2)
來源:互聯網
上載者:User
《用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 lookingask(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.