نمايش پست تنها
قديمي ۰۶-۱۷-۱۳۸۸, ۰۵:۲۶ بعد از ظهر   #14 (لینک دائم)
Astaraki Female
Administrator
 
آواتار Astaraki
 
تاريخ عضويت: خرداد ۱۳۸۷
محل سكونت: تهران-کرج!
پست ها: 3,465
تشكرها: 754
16,337 تشكر در 3,127 پست
My Mood: Mehrabon
ارسال پيغام Yahoo به Astaraki
Post Visual Prolog Version 5.x

بخش Domains:
در این بخش دو قصد مهم داریم:
اول:برای دادن نام ها می توان از اسمهای با معنی بجای اسمهای بی معنی استفاده کرد.حتی اگر چند نام ذاتا یکی باشند.این کار کمک بسیاری به خوانایی بر نامه می کند.
دوم:برای تعریف domain های خاص که در دامنه استاندارد تعریف نکرده ایم.
به مثالی برای تعریف domain، برای عبارت زبان طبیعی زیر نگاه کنید:
Frank is a male who is 45 years old.
که domain این زبان طبیعی بصورت زیر است:
کد:

person(symbol, symbol, integer)

حال فرض کنید می خواهیم از این تعریف استاندارد یک تعریف نوع کاربر داشته باشیم که برای این کار می توانیم بصورت زیر عمل کنیم:
کد:

DOMAINS
name, sex = symbol
age = integer
PREDICATES
person(name, sex, age)

یکی از مزایای استفاده از تعاریف در Domains این است که می توان نوع خطا ها را بهتر تشخیص داد .
برای مثال :
کد:

same_sex(X, Y) :-
person(X, Sex, _),
person(Sex, Y, _).

با اینکه Name و Sex از یک نوع اند ولی نمی توان بجای یکدیگر استفاده نمود.
در صورت اشتباه و استفاده از این سبک،زبان پرولوگ خطا را تشخیص داده و به ما اعلام می کند.وقتی برنامه بسیار بزرگ یا پیچیده باشد ،استفاده از سبک گفته شده می تواند مفید واقع شود.
کد:

DOMAINS
product,sum = integer
PREDICATES
add_em_up(sum,sum,sum)
multiply_em(product,product,product)
CLAUSES
add_em_up(X,Y,Sum):-
Sum=X+Y.
multiply_em(X,Y,Product):-
Product=X*Y.

در این برنامه دو عمل انجام می شود،ضرب و مجموع.
اگر
کد:

Goal
add_em_up(32,54,Sum).

به برنامه اضافه شود نتیجه ای بصورت زیر مشاهده خواهد شد.
کد:

Sum=86
1 Solution

که نتیجه ،مجموع دو مقدار از نوع integer می باشد.از طرف دیگر می خواهیم حاصلضرب دو آرگومان را که در پریدیکیت multiply_em است،را بدست آوریم،که در اینجا هم اگر goal ما بصورت multiply_em(31,13,Product) باشد نتیجه بصورت زیر خواهد بود.
کد:

Product=403
1 Solution

اگر شما چنین goal که در زیر آمده است را امتحان کنید
کد:

multiply_em(31, 17, Sum), add_em_up(Sum, Sum, Answer).

شاید فکر کنید که چنین جوابی بعنوان خروجی نمایش داده خواهد شد.
کد:

Sum=527, Answer=1054
1 Solution

ولی در واقع این حالت استفاده یک type error با خود بهمراه خواهد داشت.دامنه Product و Sum از هم متفاوت اند،حتی با اینکه هر دو از نوع integer هستند ولی با این حال چون دامنه هاشان از هم جدا است پس دو ماهیت جدا در نظر گرفته می شوند.
کد:

DOMAINS
brand,color = symbol
age = byte
price, mileage = ulong
PREDICATES
car(brand,mileage,age,color,price)
CLAUSES
car(chrysler,130000,3,red,12000).
car(ford,90000,4,gray,25000).
car(datsun,8000,1,black,30000).

اگر goal های زیر را به برنامه اضافه کنیم، دستور خطایی را با خود به همراه خواهد داشت.
کد:

car(renault, 13, 4000, red, 12000).
car(ford, 90000, gray, 4, 25000).
car(1, red, 30000, 80000, datsun).

محصول اجرای هر دستور بالا یک error است .برای مثال در اولی مقدار age بایداز نوع byte با شد بنابر این جای mileage و age باید تغییر کند.در دومی، جای age و color باید عوض شود.
سعی کنید که خطاهای سومین goal را خودتان بیابید.
Astaraki آفلاين است   پاسخ با نقل قول