آموزش نرم افزار کلیپس (قسمت دوم)

قواعد

نرم افزار کلیپس یک نرم افزار rule-base نیز میباشد. ruleها یا قواعد همان "اگر .... آنگاه...."ها هستند.
به عنوان مثال میخواهیم دستور شرطی زیر را بصورت یک rule وارد کلیپس کنیم:


If gender is male
Then response is He should go to the military



قبل از اینکه قواعد رو بسازیم باید fact های مورد استفاده در قواعد مشخص بشه. پس باید deftemplate های زیر ساخته بشود


(deftemplate person (slot name)(slot age)(slot gender))
(deftemplate response (multislot action))


 


 هنگامی که قرار است یک عبارت چند کلمه ای در یک slot باشد، بجای کلمه slot از multislot استفاده میکنیم.


 

حالا قاعده زیر رو مینویسیم


(defrule military_service
 (person (gender male))
=>
(assert (response (action He should go to the military)))
)



حالا الگوهای مربوط به فرد را ساختیم. و قاعده بالا را هم مشخص کردیم.
قاعده ها برای اجرا شدن به factها احتیاج دارند.
هنگامی که fact ها را وارد کردیم، کافیست با استفاده از دستور (run) برنامه را اجرا کنیم
به عنوان مثال مراحل بالا را run  میکنیم
 
همانطور که می بینید الگوها را تعریف کرده و یک person با نام reza ساخته ایم.
Rule را نیز تعریف کرده ایم.
حالا (run) را وارد میکنیم.
 

همانطور که میبینید، یک fact با عنوان response (action He should go to the military)) به لیست factها اضافه میشود


با استفاده از دستورات زیر میتوان متن defrule, deftemplate  و deffacts را دید.


(ppdefrule نام rule)
(ppdeftemplate نامdeftemplate)
(ppdeffacts نامdeffacts)




برای حذف defrule, defteemplate و deffacts از undeftemplate, undefrule و undeffacts استفاده میکنیم.
اما باید توجه داشت برای حذف یک deftemplate  نباید هیچ fact ساخته شده ای از آن در لیست factها باشد. بنابراین ابتدا تمام fact های مرتبط با این deftemplate ، می بایست retract شود، آنگاه می توانیم عمل undeftemplate را اجرا نماییم
 

دستورات list-defrules, list-deftemplates  و list-deffacts لیست تمامی قواعد، الگوها وfactها را نشان میدهد. (به s  آخر هر یک از دستورات توجه کنید)


اگر بخواهیم در خروجی نوشته ای چاپ شود، از دستور printout استفاده میکنیم
(printout t نوشته مورد نظر  crlf)
عنصر بعد از printout ، وسیله خروجی است که ما در اینجا t را تعریف کرده ایم (یعنی خروجیterminal است) .عنصر نهایی هم crlf است (که اشاره گر را به سطر بعد میبرد)


همانطور که در تصویر سمت راست می بینید، اگر crlf را وارد نکنیم، اشاره گر به سطر بعد نمی رود.

در clips می توانیم breakpoint تعریف کنیم. Brickpointها در clips به این صورت تعریف میشود :
(set-breaks  نام قاعده)
(که به جای نام قاعده باید نام یکی از rule ها تعریف شده را بنویسیم)
این دستور به این معنی است که اجرای برنامه قبل از اجرای این قاعده متوقف می شود.
ما از این دستور برای اشکالزدایی برنامه استفاده میکنیم.
دستور show-breaks همه نقاط توقف را نشان می دهد و دستور remove-breaks این نقاط را حذف میکند
(show-breaks)
(remove-breaks  نام قاعده)
 
متغیرها
در کلیپس ، دو نوع متغیر می توان تعریف کرد:
•    متغیر تک مقداری(single value)
•    متغیر چند مقداری(multi value)


 

?<symbol>

$?<symbol>


 

که عبارت بالایی برای single value و عبارت پایینی برای multi value استفاده می شود.
در ادامه نحوه استفاده از متغیرها را نشان می دهیم و در خلال آن نیز استفاده از عملگر های not, and  و or  را نیز مشاهده می کنیم.


(defrule person-without-brown-hair
(person (name ?name)(hair ~brown))
=>
(printout t ?name موی قهوه ای ندارد crlf)



توجه کنید که علامت ~ به معنی not  می باشد.در قاعده فوق با استفاده از (hair ~brown) تعیین میکنیم که مقدار hair باید چیزی غیر از brown باشد.
در ادامه مثالهایی از and  و or را مشاهده می نمایید


(defrule person-with-brown-or-black-hair
    (person (name ?name)
            (hair brown|black))
    =>
    (printout t ?name " has dark hair." crlf))


 


(defrule person-with-brown-or-black-hair
    (person (name ?name)
            (hair ?color&brown|black))
    =>
    (printout t ?name " has " ?color " hair." crlf))


 


(defrule person-without-brown-nor-black-hair
    (person (name ?name)
            (hair ?color&~brown|~black))
    =>
    (printout t ?name " has " ?color " hair." crlf))




گرفتن مقادیر از کاربر و ذخیره آنها
برای اینکه یک مقدار را به یک متغیر نسبت بدهیم از تابع bind استفاده می کنیم


(bind <variable_name> <value>)



برای ورود اطلاعات هم می توان از تابع read استفاده کرد


(defrule get-first-name
=>
(printout t "what is your name?")
(bind ?response (read))
(assert (user's name ?response)))



این قاعده را نوشته و برنامه را run میکنیم.
برنامه از ما نا را می خواهد. هنگامی که نام را وارد کرده و enter می زنیم، یک fact به لیست factها اضافه میکند
 

توجه کنید در اینجا هنگامی که برنامه از ما نام را درخواست میکند، ما فقط میتوانیم یک کلمه را وارد کنیم(مثلا کلمه reza) و نمی توانیم یک عبارت چند کلمه ای (مثلا reza darroodi) را وارد کنیم. زیرا متغیر را بصورت متغیر تکی وارد کرده ایم.
برای اصلاح ای حالت باید از readline بجای read استفاده کنیم


(defrule get-first-name
=>
(printout t "what is your name?")
(bind ?response (readline))
(assert (user's name ?response)))

نظرات   

 
#1 مهدی 1395-01-29 07:11
بسیار بسیار ممنون بابت آموزش مفید و جذابتون
من که بینهایت استفاده کردم امیدوارم دوستان دیگه هم بتوننن از این آموزش خوب بهره لازم رو ببرن
موفق باشید
نقل قول
 

اضافه کردن نظر


کد امنیتی
تغییر کد امنیتی