مثال 4:
مثال زیر را در پرولوگ نوشته و اجراکنید:
PREDICATES
can_buy(symbol, symbol)
person(symbol)
car(symbol)
likes(symbol, symbol)
for_sale(symbol)
CLAUSES
can_buy(X,Y):-
person(X),
car(Y),
likes(X,Y),
for_sale(Y).
person(kelly).
person(judy).
person(ellen).
person(mark).
car(lemon).
car(hot_rod).
likes(kelly, hot_rod).
likes(judy, pizza).
likes(ellen, tennis).
likes(mark, tennis).
for_sale(pizza).
for_sale(lemon).
for_sale(hot_rod).
GOAL
can_buy(Who, What).
در بخش goal برنامه عبارتهای زیر را بنویسید و امتحان کنید:
can_buy(Who, What).
can_buy(judy, What).
can_buy(kelly, What).
can_buy(Who, hot_rod).
تمرین:
1.زبان طبیعی مربوط به جملات زیر را بیابید:
eats(Who, What):- food(What), likes(Who, What).
pass_class(Who):-did_homework(Who), good_attendance(Who).
does_not_eat(toby, Stuff):- food(Stuff), greasy(Stuff).
owns(Who, What):- bought(Who, What).
2.زبان طبیعی زیر را به معادل پرولوگ اش تبدیل کنید:
[code[
a. A person is hungry if that person's stomach is empty.
b. Everybody likes a job if it's fun and it pays well.
c. Sally likes french fries if they're cooked.
d. Everybody owns a car who buys one, pays for it, and keeps it.
[/code]
Predicates (Relations) :
نامهای سمبلیکی از ارتباط ها، پریدیکیت نام دارد.آبجکت هایی که توسط پردیکیت با هم ارتباط بر قرار می کنند،آرگومان نام دارند.اگر فاکت likes(bill,cindy) را در نظر داشته باشیم،likes یک پریدیکیت است و bill و cindy هم آرگومان هستند.
در زیر پریدیکیت های با آرگومان و بدون آرگومان را نمایش داده ایم:
pred(integer, symbol)
person(last, first, gender)
run
insert_mode
birthday(firstName, lastName, date)
یک پریدیکیت ممکن است هیچ آرگومانی نداشته باشد.استفاده از چنین پریدیکیتهایی محدود است.شما از پرسشهایی نظیر person(rosemont,Name,male) به منظور پیدا کردن نام کوچک آقای resemont استفاده نمایید.اما پریدیکیتهای بدون آرگومان چه استفاده ای می تواند داشته باشد؟شما چه استفاده ای از run در برنامه می توانید بکنید؟موارد استفاده از چنین حالتهایی بسیار کم اتفاق می افتد برای نمونه وقتی که شما می خواهید رفتارهای متفاوتی از وابستگی حالت insert_mode راداشته باشید.در فصل های آتی به مثالهایی در این مورد برخورد خواهیم کرد.
متغیر ها:
متغیر ها در پرولوگ شما را به نوشتن های عمومی ،فاکت ها ،رولها و پرسش ها قادر می سازند.
نام متغیر ها در ویژوال پرولوگ باید با حروف بزرگ شروع شوند یا یک Under Score باشدوبعد از کارکتر حرف بزرگ ابتدایی ، هر کارکتر عددی ، حروف کوچک،بزرگ و یا کارکتر Underline می توان استفاده نمود.
برای مثال:
My_first_corrent_variable_name
Sales_10_11_86
نمونه های زیر اشتباهند.
1stattempt
second_attempt
"disaster"
در این پرسش ساده می توانید از متغیر برای پیدا کردن اینکه چه کسی tennis را دوست دارد استفاده نمایید.
likes(X,tennis)
در این پرسش از علامت X بعنوان متغیر،برای نشان دادن اینکه کسانی را که در حال حاضر tennis را دوست دارند ولی ما نامشان را نمی دانیم، استفاده شده است .
سعی کنید در انتخاب نام متغییر از نامهای متناسب با موضوع استفاده کنید تا خوانایی برنامه شما بالا باشد:
likes(Person, tennis).
بهتر است از:
likes(X, tennis).
از این مثال این است که شما عادت کنید بر اساس عبارات و کلمه های بامفهوم جملات خود را بسازید.این کار باعث خوانایی در کد های شما خواهد شد.
حال به عبارت زیر توجه نمایید:
Bill likes the same thing as Kim.
با توجه به اینکه در بالا نحوه استفاده از متغیر ها را ذکر کردیم می توانیم عبارت را بصورت زیر تبدیل نماییم:
likes(bill, Thing):- likes(kim, Thing).
به عبارت زبر دقت کنید
likes(cindy, Something):- likes(bill, Something).
آبجکت Something یک متغیر است،چون با حروف بزرگ شروع شده است.
بجای استفاده از کلمه Something شما از هر کلمه معتبر برای متغیر می توانید استفاده نمایید.برای مثال کلمه X و یا هرچیز دیگر.
کلمات bill و cindy با حروف بزرگ شروع نشده اند،دلیل این است که این کلمات متغیر نیستند بلکه نمادهایی هستند که ارزش ومقدار ثابتی دارند.این کلمات نیز اختیاری هستند.در صورتی که بخواهید بجای استفاده از حروف کوچک در نمادهای ثابت ،از حروف بزرگ استفاده نمایید،می توانید با گذاشتن کلمه مورد نظر خود در داخل کوتیشن، به کار خود ادامه دهید.البته این کار توصیه نمی گردد.برای مثال “Bill” .
چگونه یک متغیر مقادیرش را می گیرد؟
شما ممکن است به این نکته توجه کرده باشید که پرولوگ ، انتسابی بصورت جمله ای ندارد،فرق اصلی مابین پرولوگ و دیگر زبانهای برنامه نویسی در همین نکته نهفته است.
متغیر ها در پرولوگ مقادیرشان را بوسیله همتا هایشان در ثوابت ،فاکت ها یا رولها ها می گیرند.تا زمانی که هنوز متغیری به یک مقدار مقید نشده ،گفته می شود که متغیر آزاد است.ولی به محض گرفتن مقدار،به آن مقید می شود.اما این مقید بودن برای مدت زمان اجرا(حل)مقید است پس از آن از حالت مقید بودن خارج شده و منتظر مقید شدن های بعدی می ماند.
PREDICATES
likes(symbol,symbol)
CLAUSES
likes(ellen,reading).
likes(john,computers).
likes(john,badminton).
likes(leonard,badminton).
likes(eric,swimming).
likes(eric,reading).
بررسی یک پرسش:
چه کسی دوست دارد که هم کتاب بخواند و هم شنا کند.
زبان طبیعی:
Is there a person who likes both reading and swimming?
پرولوگ:
likes(Person, reading), likes(Person, swimming).
پرولوگ این دو را بعنوان دو بخش جدا ازهم در برنامه،در نظر می گیرد.ابتدا در صدد حل قسمت اول پرسش بر می آید که با جستجو از بالای برنامه به سمت پایین ،فاکت های موجود در clauses را مورد بررسی قرار می دهد.
likes(Person, reading)
برای حل پرولوگ از اولین ،فاکت شروع به جستجو می کند
likes(ellen, reading)
چون هردو در مجموعه قسمت دوم خودشان readingرا دارند،پس با هم مقید می شوند.حال متغیر Personبا مقدار ellen مقید می شود.حال نوبت قسمت دوم می رسد که عبارت likes(Person, swimming). را داراست.
چون این عبارت در ،فاکت های برنامه موجود نیست پس نمی تواند این گزینه شامل جواب ما باشد.در این حالت پرولوگ عمل انقیادی را که به Person انجام داده است پس می گیرد و اشاره گر برنامه را به یک ،فاکت دیگر می دهد تا عمل بررسی را انجام دهد.به این عمل اصطلاحاً برگشت به عقب می گویند.
اگر بصورت عامیانه بخواهیم توضیح دهیم به این صورت است که ابتدا شخصی که به مطالعه علاقه مند است پیدا می کنیم.اولین شخص ellen است.حالا بجای عبارت like(Person,swimming) فرض کنید که بجای Person شخص ellen قرار دارد.باید بدنبال آن باشیم که آیا ellen به شنا علاقه مند است یا خیر.چون در ،فاکت های ما چیزی در این باره وجود ندارد ،مقادیری که قبلا مقید شده اند آزاد می شوند.
باز هم برنامه ادامه می یابد تا گزینه ای دیگر را امتحان کند.برای این کار likes(eric,reading).مورد بررسی قرار می گیرد چون اولین شرط اش را داراست.در اجرای بخش دوم نیزlikes(eric, swimming) مورد بررسی قرار می گیرد که نتیجه آن True می باشد. که جواب بصورت زیر می باشد.
Person=eric
1 Solution
متغیر های بی نام:
معمولا برای جلوگیری از پیچیدگی برنامه استفاده می شود.اگر ما به یکسری از اطلاعات معین نیاز داشته باشیم ،ما می توانیم برای چشم پوشی از اطلاعاتی که نیاز نداریم از متغیر های بی نام استفاده کنیم.
برای متغیر های بی نام می توان از under score استفاده نمود.از این
متغیر می توان بجای متغیر های دیگر استفاده نمود.
فقط باید به این نکته توجه داشت که به متغیر های بی نام نمی توان مقدار دهی نمود.
مثال:
PREDICATES
male(symbol)
female(symbol)
parent(symbol, symbol)
CLAUSES
male(bill).
male(joe).
female(sue).
female(tammy).
parent(bill,joe).
parent(sue,joe).
parent(joe,tammy).
در این مثال شما می خواهید ببینید که چه اشخاصی والدین هستند و نیازی به دانستن نام فرزندان آنها ندارید.
GOAL
parent(Parent, _).
جوابی که پس فرستاده می شود بصورت زیر است.
Parent=bill
Parent=sue
Parent=joe
3 Solutions
از متغیر بینام می توان در fact ها نیز استفاده نمود.
برای مثال:
owns(_, shoes).
eats(_).
که منظور عبارت زیر است:
Everyone owns shoes.
Everyone eats.
Goal:
یکی از بخشهای اصلی زبان پرولوگ می باشد.شما میتوانید سوالات خود را به منظور از استنتاج برنامه در این بخش وارد نمایید.
Goal می تواند ساده باشد مانند:
likes(ellen, swimming).
یا
likes(bill, What).
یا می تواند شکل پیچیده تری داشته باشد.برای مثال از دوبخش تشکیل شده باشد.
likes(Person, reading), likes(Person, swimming).
یک Goal که از دو بخش یا بیشتر ساخته می شوند،Goal های ترکیبی گفته می شود(Compound Goal).به هر بخش از Goal های ترکیبی یک Subgoal گفته می شود.بعضی اوقات ما نیاز به اشتراک دو Goal داریم.برای مثال Parent،شاید نیاز داشته باشیم که بدانیم که کدام یک از والدین مرد است که در این صورت از شکل دستوری زیر استفاده می کنیم:
Goal parent(Person, _), male(Person).
پرولوگ ابتدا سعی می کند که subgoal اولی را انجام دهد که parent(person) است.بعد از جستجو در داخل Clauses و به جواب رسیدن اولین subgoal نوبت به حل قسمت دوم می باشد.
Male(Person).
در صورت صحیح وارد شدن Goal نتیجه مورد نظر عبارت زیر خواهد بود:
Person=bill
Person=joe
2 Solutions
Goal های ترکیبی:
شما می توانید از Goal های ترکیبی برای حل هر دو Subgoal A وSubgoal B که True هستند (پیوسته) بوسیله جدا کننده Subgoal ها با کاما(،)استفاده نمایید.و یا می توان از (;) برای goal منفصل استفاده نمایید.
به مثال زیر توجه نمایید:
جهت ترکیب subgoal هی می توان از دو کاراکتر (,) و (;) استفاده نمود.
کاراکتر کاما معادل استفاده از And در زبانهای برنامه نویسی ویژوال بیسیک و یا زبانهای مشابه است.هنگامی که از کاما استفاده می شود منظور این است که تمام بخشهای subgoal ها باید جواب داشته باشد.
کاراکتر سیمی کالم (;) معادل استفاده از Or در زبانهای برنامه نویسی دیگر می باشد. .هنگامی که ازسیمی کالم ا استفاده می شود منظور این است که تنها یکی از بخشهای subgoal ها باید جواب داشته باشد.
به زبان ساده تر می توان بصورت زیر استنباط نمود:
If condition1=true and condition2= true Then Print
If condition1=true or condition2= true Then Print
به مثال زیر توجه نمایید:
predicates
car(symbol,long,integer,symbol,long)
truck(symbol,long,integer,symbol,long)
vehicle(symbol,long,integer,symbol,long)
clauses
car(chrysler,13000,3,red,12000).
car(ford,90000,4,gray,25000).
car(datsun,8000,1,red,30000).
truck(ford,80000,6,blue,8000).
truck(datsun,50000,5,orange,20000).
truck(toyota,25000,2,black,25000).
vehicle(Make,Odometer,Age,Color,Price):-
car(Make,Odometer,Age,Color,Price)
;
truck(Make,Odometer,Age,Color,Price).
Goal
car(Make, Odometer, Years_on_road, Body, 25000).
این Goal سعی می کند ، ماشینی را که توصیف شده است ،در Clauses بیابد.یعنی ماشینهایی را که دقیقا قیمت آنها 25000 دلار است.
جوابی که باز گردانده خواهد شد بصورت زیر است:
Make=ford, Odometer=90000, Years_on_road=4, Body=gray
1 Solution
البته شاید ما فقط چنین جوابی را نخواهیم ،بلکه بخواهیم لیست کلیه ماشینهایی را که قیمتشان کمتر از 25000 دلار است را نشان بده که در اینصورت باید کد goal مورد نظر بصورت زیر باشد.
car(Make, Odometer, Years_on_road, Body, Cost),/*subgoal A and*/
Cost < 25000. /*subgoal B */
در واقع ما می دانیم که فقط از طریق عملگر و منطقی می توان به چنین نتیجه ای رسید.
برای حل این مثال ابتدا باید Subgoal اولی به جواب برسد
car(Make, Odometer, Years_on_road, Body, Cost).
و بعد از آن Subgoal دومی باید مقدار صحیحی ره به ما ارائه دهد.
Cost < 25000.
زبان طبیعی که در واقع سوال مورد نظر ما ست بصورت زیر است:
Is there a car listed that costs less than $25000?, or is there a
truck listed that costs less than $20000?
برای نوشتن goal های ترکیبی عبارتهای بالا ، در زبان پرولوگ،از دستورات زیر نیز می توان استفاده کرد:
car(Make,Odometer,Years_on_road,Body,Cost), Cost<25000
; /* subgoal A or */
truck(Make,Odometer,Years_on_road,Body,Cost), Cost < 20000.
/* subgoal B */
در این Goal می توان این استنباط را داشت که ، اگر یک Car با شرایط ذکر شده وجود داشت آن را نمایش بده(عملیات موفقیت آمیز بوده است) و در غیر این صورت یک Truckرا با شرایطی که ذکر شده بیاب.
ادامه دارد...