تبليغاتX
سیستم های خبره راهی برای زندگی بهتر

3-8 ) سئوال از كاربر

گزاره‌‌ي ask بايد به كمك كاربر درستي يا نادرستي جفت‌هاي attribute – value را تعيين كند. براي تعيين كردن اينكه خواص قابل پرسش هستند يا نه، نياز است تا برنامه اصلاح شود. اين كار به آساني با ساختن قواعد براي آن خواص كه نياز به سئوال كردن دارند. انجام مي‌شود:

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

 

حال اگر سيستم هدف پيدا كردن colour (white) را دارد، ask را فرا خوانی خواهد كرد به جاي اينكه به برنامه نگاه كند. اگر ask (colour , white) موفق شود قانون colour (white) موفق خواهد بود. ساده‌ترين مدل ask كاربر را با خاصيت و ارزش در خواست شده آگاه مي‌كند و تأئيد يا تكذيب اطلاعات پيشنهاد شده را جستجو مي‌كند:

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

 

اگر جواب yes باشد read درست خواهد بود و اگر كاربر هر چيزي غير از yes تايپ كند رد خواهد شد. اكنون برنامه مي‌تواند بدون داشتن اطلاعات درون خود سيستم اجرا شود. اكنون برنامه جستجوي مشابه‌اي را براي پرنده شروع مي‌كند. اما اكنون كاربر براي مشخص كردن اينكه بعضي از attribute – value درست هستند يا نه، مسئول است. ديالوگ زير نشان مي‌دهد سيستم در اين حالت چگونه اجرا مي‌شود:

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

 

يك مشكل براي اين روش وجود دارد. اگر كاربر براي آخرين سئوال جواب no بدهد قاعده‌ي bird (layson – albatross) رد خواهد شد و عمل پيمايش معكوس [1] باعث مي‌شود تا قاعده‌ي    (black – footed- albat) bird امتحان شود. اولين زير هدف قاعده‌ي جديد، prolog را مجبور مي‌كند تا سعي كند Ramify (albatross) را دوباره به اثبات برساند و سئوالي را كه يكبار پرسيده است دوباره بپرسد. پس بهتر است سيستم جواب‌ها را به خاطر بسپارد تا اينكه آنها را دوباره بپرسد.

3-9 ) به خاطر سپاري جواب [2]

گزاره‌ي جديد known براي بخاطر سپاري پاسخ كاربران به سئوال استفاده مي‌شود.

اين گزاره‌ي مستقيماً در برنامه مشخص نشده است، اما نسبتاً بصورت دينامیكي هرجا كه ask يك اطلاعات جديد راه از كاربر دريافت مي‌كند، استفاده شده است. هر زمان كه ask فراخواني مي‌شود، ابتدا چك مي‌كند كه پاسخ در حال حاضر بصورت yes يا no شناخته شده است يا نه اگر پاسخ در حال حاضر معلوم نباشد پس ask زمانيكه پاسخ را از كاربر گرفته است، اظهار نظر قطعي مي‌كند .سه آرگومان known اينها هستند: yes/no، attribute و value. مدل جديد ask چيزي شبيه اين است:

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

 

 

3-9-1 ) جواب‌هاي چند ارزشي  [3]

سطح ديگري از توانايي در استفاده از known وجود دارد. اكنون گزاره‌ي ask اينكه هر جفت خاص از attribute- value درست است يا نه را پذيرفته است. اين بدين معني است که کاربر به هر دو شناسه ی color:white و color:black ،جواب yes بدهد، در نتيجه‌ي آن ما به يك attribute خاص اجازه مي دهيم تا چند ارزشي باشد. اين موضوع مي‌تواند تنها براي بعضي از خواص درست باشد. بهترين راه براي مواجهه با اين مورد، اضافه كردن گزاره‌ي ديگري به برنامه است كه تعيين مي‌كند كداميك از خصوصيات چند ارزشي هستند:

multivalued (voice). Multivalued (feed)

 

3-10 ) يك پوسته‌ي ساده [4]

برنامه‌ي شناسايي پرنده دو جزء مجزا دارد: پايگاه دانش ، كه شامل اطلاعات مشخص شده درباره‌ي شناسايي پرنده است و گزاره‌ها كه روابط را كنترل مي‌كنند. با جدا كردن اين دو بخش مي‌توان يك پوسته خلق كرد كه مي‌تواند با هر پايگاه داده ديگري كار كند. براي مثال يك سيستم خبره‌ي جديد مي‌تواند ساخته شود كه بتواند ماهي را شناسايي كند اين برنامه مي‌تواند با همان رابط كاربري كه براي سيستم شناسايي پرنده طراحي شده بود كار كند.

حداقل تغيير مورد نياز براي شكستن دو بخش به دو ماژول [5] يک گزاره‌ي سطح بالاست كه شناسايي را شروع مي‌كند. ابتدا اينكه در حالت كلي چه چيزي دارد شناسايي مي‌شود ، تعيين مي‌شود و پوسته سعي مي‌كند تا يك گزاره‌ي كلي كه top – goal ناميده مي‌شود را حل كند. هر پايگاه دانش بايد يك “top – goal" داشته باشد تا يك goal را براي تأئيد شدن فراخواني كند.

 

براي مثال :  top- goal (x): bird(x)

اكنون اين اولين گزاره در پايگاه دانش درباره‌ي پرندگان است. در ضمن پوسته يك گزاره دارد كه solve ناميده مي‌شود كه ابتدا مقدمه چيني [6] مي‌كند و سپس براي top – goal مورد نظر مسئله را حل مي‌كند. مثل:

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

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

 

گزار‌ه‌ي abolish تعبيه شده در خود برنامه براي استخراج هر known قبلي از سيستم زمانيكه يك نتيجه‌ي جديد شروع شده است، استفاده مي‌شود.

اين كار باعث مي‌شود تا كاربر از چند بار فراخواني solve در يك بار اجراي برنامه بي‌نياز گردد.

پس بطور خلاصه گزاره‌هاي سيستم شناسايي پرنده به دو ماژول تقسيم شده‌اند. يك‌سري كه در پوسته قرار دارند، Native ناميده مي‌شوند.

solve رایزنی براي حل مسئله را شروع مي‌كند.

ask سوال‌هاي ساده‌اي از كاربر مطرح مي‌كند و جواب‌هاي را به خاطر مي‌سپارد. 

 menuask به كاربر منويي براي انتخاب ارائه مي‌كند.

و يك‌سري ديگر از گزاره‌ها كه در پايگاه دانش هستند.

“top – goal" مهم‌ترين هدف را در پايگاه دانش معيني مي‌كند.

- قواعدي براي انتخاب هر آنچه كه پايگاه دانش براي آن ساخته شده است (مثل ... bird , family)

- قواعدي براي خواص كه بايد توسط كاربر فراهم شوند ( مثل color , size)

malti – valaed: تعيين مي‌كند كدام خاصيت مي‌تواند چند ارزشي باشد.

براي استفاده از اين پوسته در prolog، هر دوي پوسته و پايگاه دانش بايد با هم همفكري كنند سپس جستجو براي حل مسئله شروع مي‌شود:

?- consult(native).

yes

?- consult('birds.kb').

yes

?- solve.

nostrils : external_tubular?

...

 

3-11 ) حلقه‌ي دستور [7]

پوسته مي‌تواند با داشتن حلقه‌ي دستور سطح بالاي go براي اجراي يك دستور فراخواني مي‌شود اين به نام دستورات اجازه مي‌دهد تا از گزاره‌هاي واقعي prolog كه دستور را اجرا مي‌كنند، متفاوت باشند. براي مثال دستور رايج براي اجراي يك استنتاج consult است، در حاليكه consult نام يك گزاره‌ي داخلي در prolog است. كه بصورت زير است:

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.

 

گزاره‌ي go از يك حلقه‌ي رد و تكرار براي ادامه دادن تا زمانيكه كاربر دستور quit را تا يپ كند، استفاده مي‌كند گزاره‌ي do يك مكانيسم ساده را فراهم مي‌كند تا دستورات كاربر را به گزاره‌هايي كه در برنامه اجرا مي‌شوند، متصل كند تنها گزاره‌ي جديد load – kb است كه با پايگاه دانش مجدداً برقراري ارتباط كرده و همفكري مي‌كند كه چيزي مثل اين است:

load_kb :-
write('Enter file name: '),
read(F),
reconsult(F).

 

دو دستور ديگر كه در اينجا مي‌تواند اضافه شود:

help: ليتي از دستورهاي مجاز را نمايش مي‌دهد.

List: همه ی known هاي مقدار‌دهي شده در طول نتيجه‌گيري را ليست مي‌كند كه در عيب‌يابي مفيد است.

خلاصه: مثال فوق نشان مي‌دهد كه قواعد محلي prolog مي‌توانند بعنوان زبان تشريحي براي ارائه دانش در يك سيستم خبره استفاده شوند همچنين مثال نشان مي‌دهد كه prolog مي‌تواند به عنوان يك زبان براي ساختن رابط كاربر براي سيستم‌هاي خبره استفاده شود.

 



[1] bachtracking

[2] remembering answers

[3] malti – valued answers

[4] A Simple Shell

[5] modul

[6] housekeeping

[7] command loop

+ نوشته شده در  چهارشنبه 5 دی1386ساعت 16:33  توسط صابر موسی پور  |