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 ميتواند به عنوان يك
زبان براي ساختن رابط كاربر براي سيستمهاي خبره استفاده شود.