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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.