Administrator
تاريخ عضويت: خرداد ۱۳۸۷
محل سكونت: تهران-کرج!
پست ها: 3,465
تشكرها: 754
16,337 تشكر در 3,127 پست
My Mood:
|
Visual Prolog Version 5.x
بخش Goal:
اساساً بخش Goal شباهت زیادی به body یک رول دارد،که لیست ساده ای از subgoal ها است.
دو تفاوت ما بین رول و Goal وجود دارد.
1.کلمه کلیدی goal بعد از :- نمی آید
2.وقتی شروع به اجرای برنامه می کنیم،بصورت اتوماتیک،ویژوال پرولوگ اجرای Goal را بدست می گیرد.
دامنه های استاندارد ویژوال پرولوگ:
ویژوال پرولوگ از چندین دامنه استاندارد تشکیل شده است. وقتی شما آرگومانهای پریدیکیت ها را تعریف می کنید ، می توانید از این دامنه های استاندارد، بهره ببرید.
دامنه های استاندارد در ویژوال پرولوگ به را حتی شناخته می شوند و نیازی به تعریف آنها در بخشDomain نیست.
short : در همه پلت فرمها 16 بیت - ارزش-32768 .. 32767
ushort : در همه پلت فرمها 16 بیت –ارزش 0 .. 65535
Long : در همه پلت فرمها 32 بیت-ارزش -2147483648 ..2147483647
ulong : در همه پلت فرمها 32 بیت – ارزش 0 .. 4294967295
integer :بر اساس ساختار پلت فرم
پلت فرم 16 بیتی ،16 بیت –ارزش -32768 .. 32767
پلت فرم 32 بیتی،32 بیت ارزش -2147483648 ..2147483647
Unsigned :بر اساس ساختار پلت فرم
پلت فرم 16 بیتی ،16 بیت –ارزش 0 .. 65535
پلت فرم 32 بیتی،32 بیت ارزش -0 .. 4294967295
Byte :در همه پلت فرمها 8 بیت - ارزش 0 .. 255
Word : در همه پلت فرمها 16 بیت – ارزش 0 .. 65535
Dword :در همه پلت فرمها 32 بیت – ارزش 0 .. 4294967295
دیگر دامنه های اصلی در زیر آورده شده است.
char:
یک حرف که با کوتیشن های تکی محاصره شده است مانند 'a'.
Real:
یک عدد ممیز شناور که با استانداردIEEE مطابقت داشته باشد،که می تواند به همراه علامت +،- باشد.برای نمایش اعداد اعشاری باید از کارکتر . استفاده شود.برای نمایش اعدادی که در محدوده نمی گنجند از حرف e استفاده می شود.
مثالی از اعداد این نوع:
42705 9999 86.72
9111.929437521e238 79.83e+21
در اینجا معنی 79.83e+21 این است که داشته باشیم:
79.83 x 10^21
اعداد مجاز در این محدوده 1e-307 تا 1e+308 می باشد.
String:
به رشته ای از کارکتر ها می گویند.
دو قاعده برای نوشتن آن وجود دارد:
1.رشته ای از حروف کوچک،اعداد یا Underscore باشد.
2.مابین کوتیشن های جفتی واقع شده باشد.
مثال:
کد:
"railway ticket" "Dorid Inc"
telephone_number
رشته ها تا 255 کارکتر می توانند طول داشته باشند.رشته های درون فایلی سیستم های 16 بیتی، میتوانند تا K64 طول داشته باشندو طول رشته های که در platform های 32 بیتی هستند میتوانند تا 4 گیگ طول داشته باشند.
Symbol:
رشته ای از کارکتر ها که در جدول نماد ها ذخیره می شود(Symbol-table).
در برنامه نویسی تا اندازه زیادی می توان از symbol و string ،بجای هم استفاده کرد.با این وجود اساسا ماهیتی جدا از هم دارند.در symbol ها جدول اشاره گری وجود دارد که به مقادیر اشاره می کند ،برای همین سرعت کارکردن با symbol از string خیلی بالا تر است.رشته ها در این جداول ذخیره نمی شوند و برای match شدن عبارات ،در رشته کارکتر ها تکی تکی مقایسه می شود که سرعت انجام پردازش را پایین می آورد.
چند نمونه از آبجکت های ساده در زیر آمده است:
کد:
"&&", caitlin, "animal lover", b_l_t (symbol or string)
-1, 3, 5, 0 (integer)
3.45, 0.01, -30.5, 123.4e+5 (real)
'a', 'b', 'c' '/', '&' (char)
نوع آرگومان در تعریف Predicate ها:
برای شروع این قسمت را با یک مثال آغاز می کنیم.
کد:
Frank is a male who is 45 years old.
ابتدا می خواهیم fact مربوط به این عبارت زبان طبیعی را بیابیم،که نتیجه زیر را خواهد داشت:
کد:
person(frank, male, 45).
برای اینکه بتوانیم از این fact استفاده نماییم باید ابتدا در قسمت PREDICATES آن را تعریف کنیم و نوع داده اش را به آن بدهیم،برای این منظور می توانیم نوع داده ای مانند زیر را به آن اختصاص دهیم:
کد:
person(symbol, symbol, unsigned)
در فرم بالا از روش تعریف دامنه استاندارد استفاده نموده ایم.که دو آرگومان ابتدایی آن از نوع symbol و نوع داده آخری از نوع unsigned است.
مثال دیگر:فرض کنید می خواهیم که موقعیت حروف کوچک را بترتیب حروف الفبا داشته باشیم،برای این منظور ،a در موقعیت 1 به سر می برد و b در موقعیت 2 و ... تا z در موقعیت 26.
کد:
Letter=a,Position=1
Letter=b,Position=2
این قاعده برای همه حروف وجود دارد.
کد:
alphabet_position(Letter, Position)
پیاده سازی fact ها بصورت زیر خواهد بود:
کد:
alphabet_position('a', 1).
alphabet_position('b', 2).
alphabet_position('c', 3).
...
alphabet_position('z', 26).
برنامه را می توان بصورت زیر نوشت:
کد:
PREDICATES
alphabet_position(char, integer)
CLAUSES
alphabet_position('a', 1).
alphabet_position('b', 2).
alphabet_position('c', 3).
/* ... other letters go here ... */
alphabet_position('z', 26).
حال بعد از اتمام کد نویسی می توان goal های زیر را برای امتحان برنامه وارد نمود.
کد:
alphabet_position('a', 1).
alphabet_position(X, 3).
alphabet_position('z', What).
مثال:پیاده سازی دفتر چه تلفن ساده
کد:
PREDICATES
phone_number(symbol,symbol)
CLAUSES
phone_number("Albert","EZY-3665").
phone_number("Betty","555-5233").
phone_number("Carol","909-1010").
phone_number("Dorothy","438-8400").
Goal
حال با نوشتن goal های زیر سعی کنید جواب را ببینید:
کد:
a. phone_number("Carol", Number).
b. phone_number(Who, "438-8400").
c. phone_number("Albert", Number).
d. phone_number(Who, Number).
حال بخش Clauses را به این صورت بروز رسانی کنید،فرض بگیرید شخصی به نام Kim با Dorothy دارای یک شماره تماس مشترک هستند.فاکت مورد نظر را به Clausus اضافه نمایید و سعی کنید جواب زیر را در بخش Goal مشاهده نمایید.
کد:
phone_number(Who, "438-8400").
جوابی که به شما ارائه خواهد شد بصورت زیر خواهد بود:
کد:
Who=Dorothy
Who=Kim
2 Solutions
اگر بغیر از کارکتر هایی که فاکت آنها وجود دارد ،بخواهد جستجوی را انجام دهید،در این صورت با جواب no مواجه خواهید شد.
کد:
PREDICATES
isletter(char)
CLAUSES
/* When applied to characters, '<=' means */
/* "alphabetically precedes or is the same as" */
isletter(Ch):-
'a' <= Ch,
Ch <= 'z'.
isletter(Ch):-
'A' <= Ch,
Ch <= 'Z'.
حال سعی کنید که goal های زیر را به برنامه اضافه کنید و جواب را مشاهده نمایید:
کد:
a. isletter('x').
b. isletter('2').
c. isletter("hello").
d. isletter(a).
e. isletter(X).
در اجرای بخش c و d با یک خطا مواجه خواهید شد،در اجرای بخش e نیز با خطای متغیر آزاد مواجه خواهید .
Arity چندگانه:
Arity در پریدیکیت یعنی تعداد آرگومانهای متفاوت در یک پریدیکیت . برای مثال شما می توانید یک پریدیکیت داشته باشید اما با تعداد آرگومانهای متفاوت.
مثال زیر می تواند نمونه خوبی برای این مفهوم باشد:
کد:
DOMAINS
person = symbol
PREDICATES
father(person) % This person is a father
father(person, person)%One person is the father of the other person
CLAUSES
father(Man):-
father(Man,_).
father(adam,seth).
father(abraham,isaac).
ادامه دارد....
|