PDA

View Full Version : آموزش زبانهاي پرولوگ(porolog) و لیسپ(LISP ), شامل مقالات و کد



Reyhane7
سه شنبه 03 شهریور 1388, 17:25 عصر
آموزش مقدماتی زبان برنامه نویسی پرولوگ :



http://ece.ut.ac.ir/classpages/F83/Artificial%20Intelligence/prolog/Prolog1.doc

http://ece.ut.ac.ir/classpages/F83/Artificial%20Intelligence/prolog/Prolog2.doc

http://ece.ut.ac.ir/classpages/F83/Artificial%20Intelligence/prolog/Prolog3.doc

http://ece.ut.ac.ir/classpages/F83/Artificial%20Intelligence/prolog/Prolog4.doc

http://ece.ut.ac.ir/classpages/F83/Artificial%20Intelligence/prolog/Prolog5.doc

SWI Prolog


http://ece.ut.ac.ir/classpages/F83/Artificial%20Intelligence/prolog/SWIProlog.zip

Strawberry Prolog



http://ece.ut.ac.ir/classpages/F83/Artificial%20Intelligence/prolog/StrawberryPrologLight2_3.exe
و یکسری دیگه يادداشت هایي در زمينه پرولوگ



http://ece.ut.ac.ir/classpages/F83/Artificial%20Intelligence/prolog/Prolog1.doc

http://ece.ut.ac.ir/classpages/F83/Artificial%20Intelligence/prolog/Prolog2.doc

Artificial Intelligence

اگه منبع رو برای پرولوگ میخواید میتونی به این لینک سر بزنیدو فایل پرولوگ رو دانلود کنید:چشمک: این اسلاید برای نوشتن یه برنامه کامل پرولوگ مثل پازل 8 یا بازیهای دیگه کافیه :لبخندساده:



http://fzmahmoudi.googlepages.com/artificialintelligence

Reyhane7
سه شنبه 03 شهریور 1388, 17:29 عصر
What is Visual Prolog
Visual Prolog is a logical programming language that counts PDC Prolog and Turbo Prolog as predecessors.

The goal of Visual Prolog is to support industrial strength programming of complex knowledge emphasized problems.

Today Visual Prolog is a very powerful and safe programming language combining the very best features of logical, functional and object-oriented programming paradigms in a consistent and elegant way.

Visual Prolog 7.1
Commercial Edition
for Windows Vista/XP/2000

در سایت زير میتوانید دانلود کنید::قلب:


http://www.visual-prolog.com/?gclid=COOY-aiUqo8CFRVrXgodYgiAlg

Reyhane7
سه شنبه 03 شهریور 1388, 17:31 عصر
خلاصه ای دربارة LISP و PROLOG

به وسیله برآورده کردن نیازهای گفته شده، LISP و PROLOG هر دو دارای زبانهای برنامه نویسی غنی و کاملی هستند وقتی که این زبانها را فرا می گیریم، دانشجو در ذهن و فکر دربارة روشهایی که آنها به وسیله ویژگیهای خاص هر زبان پشتیبانی می کنند، نیازها را نگه داری می کنند.

PROLOG

PROLOG یکی از بهترین نمونه و مثال یک زبان برنامه نویسی منطقی است. یک برنامه منطقی دارای یک سری ویژگیهای قانون و منطق است . PROLOG از محاسبة اولیه استفاده می کند. در حقیقت خود این نام از برنامه نویسی PRO در LOGIC می آید یک مفسر برنامه را بر اساس یک منطق می نویسد. ایده استفاده توصیفی محاسبه اولیه برای بیان خصوصیات حل مسئله یکی از محوریت های مشارکتPROLOG می باشد که برای علم کامپیوتر به طور کلی و به طور اخص برای زبان برنامه نویسی هوشمند مورد استفاده قرار می گیرند. نفع اسفتاده از محاسبه اولیه برای برنامه نویسی شامل یک ساختار ظریف و ساده و قابل معنی می شود.
به دلیل همین خصوصیات است که PROLOG به عنوان یک محرک اصلی و مفید برای تحقیقاتی مثل موارد برنامه نویسی آزمایشی به عنوان یک کد، متغیر کردن برنامه و طراحی ویـــژگیهـای زبان سطح بالا، مطرح است. PROLOG و دیگر زبانهای منطقی یک سبک برنامه نویسی مشخصی را دنبال می کنند که در آنها برنامه ها به صورت دستورات پشت سرهم و متوالی برای ایجاد یک الگوریتم، نوشته می شوند. این نوع برنامه اصولاً به کامپیوتر می گوید که «چه چیزی درست است» و «چه چیزی باید صورت گیرد» و این به برنامه نویس اجازه می دهد که بر روی حل مسئله به صورت یک سری خصوصیات از یک محدوده تأکید کند تا اینکه بخواهد به جزئیات نوشتاری سطح پائین ساختارهای الگوریتمی برای بعد بپردازد.
اولین برنامه PROLOG در مارسی فرانسه در اوایل 1970 به عنوان بخشی از زبان معمول یک پروژه نوشته شد. تئوری نهفته در پشت این زبان در کارهای کوالسکی،‌هیز و دیگران آورده شده است. عمدة توسعة PROLOG بین سالهای 1975 تا 1979 در بخش هوش مصنوعی دانشگاه ادینبورگ صورت گرفت.
در آنجا یک گروه مسئولیت کاربرد اولین PROLOG را به عهده داشتند که آقای David H.D مسئول آن بود. این گروه اولین PROLOG را ساخت که می توانست محاسبات کلی را انجام دهد. این محصول بر اساس سیستم DEC-10 ساخته شده بود و می توانست در مدهای توصیفی و مقایسه ای کارآئی داشته باشد.
مزیت این زبان به وسیله پروژه هایی که برای ارزیابی و گسترش قدرت بیان برنامه های منطقی نوشته شده اند،‌ اثبات شده است.
بحث دربارة یک چنین کاربردهایی می تواند در سمینار و گردهمائی های مربوط به زبان برنامه نویسی هوش مصنوعی در سطح بین المللی مطرح شود.

LISP

LISP اولین بار به وسیله JACK MCCARTHY در اواخر دهه 1950 مطرح شد این زبان به عنوان یک مدل پیوسته محاسباتی بر اساس تئوری عملکرد مجدد،‌معرفی شد.
در مقالات اولیة مک کارتی (1960) اهداف خود را مشخص می کند: ایجاد یک زبان سمبولیک تا یک زبان محاسباتی. ایجاد زبانی که بتوان از آ‌ن به عنوان یک مدل محاسباتی بر اساس تئوری عملکرد مجدد استفاده کرد و از آن بتوان برای تعریف دقیق یک ساختار و تعریف زبانی استفاده کرد.
گر چه LISP یکی از قدیمی ترین زبانهای محاسباتی است که هنوز فعال است، ولی دقت کافی در برنامه نویسی و طراحی توسعه باعث شده که این یک زبان برنامه نویسی فعال باقی بما ند.
در حقیقت این مدل برنامه نویسی طوری مؤثر بوده است، که تعدادی از دیگر زبانها بر اساس عملکرد برنامه نویسی آن واقع شده اند مثل FP ، ML و SCHEME .
این لیست اساس برنامه ها و ساختارهای اطلاعاتی در LISP است، LISP خلاصه شده نام پروسه LIS است. این برنامه یک سری لیست های عملکردی درون ساختاری دارد.

LISP به برنامه نویس قدرت کامل برای اتصال به ساختارهای اطلاعاتی را می دهد.
اصولاً LISP یک زبان کامل است که دارای عملکردها ولیست های لازمه برای توصیف عملکردهای جدید، تشخیص تناسب و ارزیابی معانی می باشد.
تنها هدف کنترل برنامه بازگشت و شرایط منحصر به فرد است. عملکردهای کامل تر هنگامی که لا زم باشد در قالب این اصول تعریف می شوند. در طی زمان بهترین عملکردها به عنوان بخشی از زبان می شوند. پروسه توسعة زبان به وسیلة اضافه کردن عملکردهای جدید موجب توسعه محورهای زیادی از LISP می شوند که اغلب شامل صدها عملکرد بخصوص برای ایجاد اطلاعات کنترل برنامه، خروجی و ورودی، Edit کردن عملکردهای LISP می شوند.
این ارتباطات محرکه ای هستند که به وسیله LISP از یک مدل ساده و ظریف به یک مدل قوی و غنی و عملکردی برای ساخت سیستم های نرم افزاری بزرگ، تبدیل می شود.
یکی ازمهم ترین برنامه های مرتبط با LISP برنامه SCHEME می باشد که یک تفکر دوباره دربارة زبان در آن وجود دارد که به وسیله توسعه AI وبرای آموزش اصول مفاهیم علم کامپیوتر مورد استفاده قرار می گیرند.

برنامه نویسی شیء گرا

برخلاف برنامه LISP و PROLOG ،‌برنامه شیء گرا ریشه در مهندسی نرم افزار دارد. اولین بار در سال 1970 توسعه یافته که به وسیله Alan Kay این تحقیقات صورت گرفته است.
ساخت ایده ها از محرک، که زبان نروژی تظاهر می کند در سال 1960 و مقاله Symour در استفاده از LOGO برای آموزش کودکان، صورت پذیرفته است.
استفاده از Dyna book برای اولین بار به عنوان یک کامپیوتر، که افرادی به غیر متخصصان علم کامپیوتر با آن سروکار داشتند.
بـــه دلیل اینکه کاربر افراد معمولی بودند سیستم عملکرد و کاربرد نرم افزار نباید تکنیکی می بود و به سادگی قابل تشخیص بود. راه حل آنها برای این مسئله یک مداخلة گرافیکی است با استفاده از منوها و آیکون های گرافیکی و اشاره گرها، یک موس یا یک سری برنامه ها برای ادیت کردن، داده ها می باشد.
دخالت کاربر در طراحی یک notebook متأثر از طراحی کاربرها برای یک سری کامپیوترهای تخصصی مثل سیستم های به کارگیری کامپیوتر شخصی مثل مکینتاش، مایکروسافت و محل های مربوط به ویندوز می باشد.
در یک برنامه small talk ،‌همه چیز در قالب هدف و یک ساختار قابل محاسبه مرک و قراردادی مطرح می شود. اهداف نه فقط شامل انواع اطلاعات برای محاسبه بلکه شامل انواع روشهای لازم برای محاسبه حالت و وضعیت هدف نیز می شوند.
ارزشهای یک هدف به صورت کلاس ها بیان می شود. اهداف ممکن است اهداف طبقه بندی شده که توصیف کنندة تمامی مواد یک نمونه باشد و بیانگر نوع ذات و توصیف تما می موارد یا مواردی که بیانگر یک عضو واحد هستند را شامل شود.
وقتی مواردی از یک نوع اطلاعات به وسیله اهداف توصیف می شود این موارد ذاتاً دارای نوع توصیف و روشهای توصیفی از عملگرهایشان می باشند،‌برای شکل دادن یک عملیات بر روی یک هدف، یک پیام به سمت هدف فرستاده شده که حاصل روش مناسبی می باشد. به عنوان مثال، اضافه کردن 3 و 4 پیام 4+ به سمت شیء 3 فرستاده می شود و 3 پاسخ می دهد می شود 7 .
به وسیله ایجاد انواع ترکیب اطلاعات و عمل بر روی آنها در یک عمل واحد مربوط به هدف، small talk از کد Modular (پیمانه ای) توسعه و نوع کاربرد برای عناصر اطلاعات و کد مربوط به تکثیر آنها، پشتیبانی می کند.
به دلیل اینکه اهداف small talk در قالب یک کلاس شبکه ای همراه با اهداف کاملاً ویژه که بخشی از تمامی روش هــای کاملاً کلی است ، بسیار ساده است که یک ساختار جدید برنامه ای توصیف کنیم که عملاً با اهداف موجود در برنامه همراه باشد. بنابراین یک برنامه اصولاً می تواند قدرت کامل یک سیستم باشد که شامل گرافیک،‌بازنگری و ارتباط است.
علاوه بر این روش های توسعه نرم افزاری مثل ارائه اطلاعات و زبانهای نهفته، فشار بر اپراتور و استفاده از کدها از طریق یک گروه اصلی و زبانهای نهفته در قالب یک مدل رایج پشتیبانی می شوند.
زبانهای شیء‌گرا همراه با بسیاری از خصوصیات مندرج در یک کلاس اطلاعاتی، شامل کلاس اصلی و توانایی پاسخ در ساختار اطلاعات می شود به همین دلایل زبانهای شیءگرا در برنامه نویسی AI استفاده می شوند.

Reyhane7
سه شنبه 03 شهریور 1388, 17:43 عصر
از دوستانی که به این زبان مسلط هستند خواهش میکنم توضیح بیشتر بدن :قلب::چشمک:
من سعی میکنم یکسری منابع یادگیری و بعضی مقالات درباره این زبانها رو در اينجا قرار بدم!

پرولوگ مخفف عبارت «برنامه‌نویسی منطقی» به زبان فرانسویه.در واقع مهمترین زبان برنامه نویسی منطقیه و برخلاف زبانهای دیگه همه منظوره نیست.کاربردهاش در تقاضای بانک اطلاعاتی و اثبات ریاضیه
هدف پرولوگ ارائه مشخصات یک راه حله به طوریکه کامپیوتر بتونه ترتیب اجرای اون راه حل رو پیدا کنه به جای اینکه الگوریتم راه حل ارائه بشه، یعنی در حقیقت خود زبان در حال رشد و کسب تجربست!
و در ادامه بايد بگم كه كاملا متفاوت با زبان هاي برنامه نويسي متداوله در واقع منطبق بر روشهاي زنجيره اي هوش مصنوعي Backward Chainingو به اين صورته كه شما دانش خود رو بر مبناي First order logic كه منطقي متفاوت و قوي تر از منطق گزاره اي معموليه به سيستم ميديد و بعد يه سوال از اون مي پرسيد و خودش جواب ميده. مثلا براي يه پايگاه دانش (Knowledge based system) ولي براي بازي ميشه از الگوريتم هاي معمولي مسيريابي و چيزاي ديگه استفاده كرد كه سريع تر و راحت ترند. حالا اگه مي خواستيد يه بازي كند بنويسيد كه يه موجود باهوش با قابليت يادگيري توش بود مي تونيد از prolog استفاده كنيد
لیسپ هم برای برنامه نویسی هوشمند مورد استفاده قرار میگیره و زبانی تابعیه (یعنی برنامه نویسی شی ء گرا شاخه ای از اونه )و مبتدیه (یادگیری آسون) و نسخه‌های متعددی از اون وجود داره مثل Elisp، Clisp، و Schemeو..

Reyhane7
سه شنبه 03 شهریور 1388, 17:44 عصر
ترجمه کتاب
Visual Prolog Version 5.x

فصل 1 آشنایی با قواعد پرولوگ
فصل 2 برنامه نویسی در پرولوگ
فصل 3 یکتایی و برگشت به عقب(backtacking)
فصل 4 آبجکتهای ساده و مرکب
فصل 5 پردازشهای تکراری و بهینه سازی
فصل 6 لیست ها
فصل 7 بانکهای درونی
فصل 8 عملیات محاسباتی و مقایسه ای
فصل 9 موضوعات پیشرفته
فصل 10 کلاسها و اشیا
فصل 11 خواندن و نوشتن فایلها
فصل 12 هندلینگ رشته
فصل 13 بانکهای اطلاعاتی خارجی

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

Bill likes Dog

فاکت:
در پرولوگ رابط بین آبجکت ها را پریدیکیت می گویند.در زبان طبیعی اجزاء یک جمله با یکدیگر در ارتباط اند.در زبان ویژوال پرولوگ نیز این ارتباطها بصورت اصول ساده نویسی خاصی وجود دارد.در واقع دانسته های ما در مورد یک چیز را می توانیم فاکت بنامیم.برای مثال bill ،Cindy را دوست دارد.bill وCindy آبجکتها ی ما در زبان پرولوگ هستند.در واقع جمله bill ،Cindy را دوست دارد یک فاکت است.یک فاکت در انتها با یک (.) تمام می شود.

در زبان طبیعی
کد:

Bill likes Cindy
Cindy likes Bill
Bill Likes Dogs

اگر بخواهیم جملات زبان طبیعی بالا را به زبان فابل فهم برای پرولوگ تبدیل کنیم بصورت زیر باید بنویسیم:
کد:

likes(bill,cindy).
likes(cindy,bill).
likes(bill,dogs).

در زبان ویژوال پرولوگ می توان تا حد امکان مشخصه ها را کوتاه نویسی کرد.برای مثال Caitlin یک دختر است.
کد:

Girl(caitlin).

Reyhane7
سه شنبه 03 شهریور 1388, 17:46 عصر
رول :
به قوانینی که شما می توانید از واقعیت های موجود(فاکت ها) استنباطهایی را انجام دهید رول می گویند.
کد:

Cindy likes everything that bill likes.
Caitlin likes everything that is green.

شما بر اساس واقعیت های مثال بالا می توانید استنباط کنید که Cindy و Caitlin چه چیزهایی را دوست دارند.
برای مثال گفته شده است که cindy دوست دارد هر چیزی را که bill دوست دارد،در واقع می توان استنباط نمود که cindy هم به سگ ها علاقه مند است و یا مثال دیگر caitlin هر چیزی را که سبز باشد دوست دارد پس caitlin درختان را نیز دوست دارد.
اگر بخواهیم جملات بالا را به گرامر زبان پرولوگ تبدیل کنیم باید بصورت زیر بنویسیم:
کد:

likes(cindy, Something):- likes(bill, Something).
likes(caitlin, Something):- green(Something).

پرسش ها:
ما پرسش های متفاوتی را از فاکت های داده شده می توانیم بپرسیم،برای مثال می توان پرسید آیا Bill ،Cindy را دوست دارد،در صورتی که بخواهیم این سوال را به زبان پرولوگ تبدیل کنیم باید بصورت زیر بنویسیم:
کد:

likes(bill,cindy).

جوابی که پرولوگ به این پرسش می دهد مثبت است.
پرسش دیگری را در نظر بگیرید،bill چه چیزهایی را دوست دارد، نحوه نوشتن این پرسش در پرولوگ بصورت زیر است:
کد:

likes(bill,What).

در مثال های بالا به استفاده از حروف کوچک و بزرگ دقت کنید.What یک متغیر است.در واقع bill یک ثابت است.متغیر ها همیشه با حروف بزرگ شروع می شوند.
پرولوگ همیشه در پیدا کردن پاسخ به سوالات مطرح شده از ساختار بالا به پایین استفاده می کند.
برای سوال مطرح شدهbill چه چیز هایی را دوست دارد؟
کد:

likes(bill,What)

پاسخ های زیر ارائه خواهد شد.
کد:

What=cindy
What=dogs
2 Solutions

دلیل ارایه شدن این جواب هم در این است که ما صریحا در واقعیت های موجود اعلام کرده ایم که bill ،cindy را دوست دارد و باز صریحا اعلام کرده ایم که bill ،سگ ها را نیز دوست دارد.
حال فرض بگیرید سوالی به این صورت مطرح شود:
Cindy چه چیز هایی را دوست دارد؟
کد:

likes(cindy,What).

Reyhane7
سه شنبه 03 شهریور 1388, 17:48 عصر
برنامه زیر را در محیط ویژوال پرولوگ نوشته و اجرا نمایید
کد:

PREDICATES
likes(symbol,symbol)
CLAUSES
linkes(elen,tenis).
linkes(john,football).
linkes(tom,baseball).
linkes(eric,swimming).
linkes(mark,tennis).
linkes(bill,Activity):-links(tom,Activity)
GOALS
linkes(bill,baseball).

جوابی که بازگشت داده خواهد شد،True است.در واقع درون Goal این موضوع مطرح شده است که آیا Bill ، بازی بیس بال را دوست دارد که نتیجه True می باشد.
می خواهیم به دقت مثال بالا را بررسی کنیم:
کد:

linkes(tom,baseball).

این فاکت به ما می گوید که tom بازی بیس بال را دوست دارد .
کد:

linkes(bill,Activity):-links(tom,Activity)

این رول به ما می گوید که bill بازیی را که tom دوست دارد،وی نیز دوست دارد.
پس می توان نتیجه گرفت که bill هم بازی بیس بال را دوست دارد.
حال این عبارت را امتحان کنید
کد:

likes(bill, tennis).

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

از زبان طبیعی تا برنامه های پرولوگ
در اولین بخش از این فصل ما در باره واقعیت ها و قوانین و ارتباط بین آنها و همچنین در باره پرسش ها توضیحاتی را ارائه دادیم.تمام این عبارات از زابن طبیعی گرفته شده اند.حال نوبت آن رسیده است که از کلمات خاص زبان پرولوگ استفاده نماییم،بعنوان مثال کلمات clauses,predicate,variables و goal.
در ادامه فصلهای کتاب با کلمات بیشتری آشنا خواهید شد.

Clauses
بطور کلی دو نوع از عبارات اصلی زبان پرولوگ در این بخش ساخته می شوند.در واقع فاکت ها و رول ها دراین بخش ساخته می شوند و می توان گفت که در این بخش شناسایی می شوند. این بخش را می توان قلب زبان برنامه نویسی پرولوگ نامید.
مثال 1:
می خواهیم یک رول بسازیم که منوی غذایی مناسبی را برای شخصی بنام diane انتخاب ارائه کنیم:
Diane غذاهای گیاهی مصرف می کند و فقط غذاهایی را می خورد که دکترش تجویز کرده است.
می خواهیم یک رول از غذاهایی را که diane می تواند انتخاب کند، بسازیم .
برای انتخاب غذای مناسب باید چند فاکتور را در نظر داشته باشیم.
1- غذای انتخاب شده در لیست غذاهای گیاهی است؟
2- غذای انتخاب شده در لیست غذاهایی که دکتر تجویز کرده است،می باشد؟
3- در پایان اگر جواب دوسوال ما مثبت بود،پس diane غذای مورد نظر را می تواند سفارش دهد.
کل مطالب ذکر شده در بالا را در پرولوگ بصورت زیر می توان نوشت:
کد:

diane_can_eat(Food_on_menu):-
vegetable(Food_on_menu),
on_doctor_list(Food_on_menu).

به کاما بعد از vegetable(Food_on_menu) توجه نمایید.این کاما عمل و یا همان ترکیب عطفی است.منظور این است که vegetable(Food_on_menu) و on_doctor_list(Food_on_menu) باید صحیح باشند که diane_can_eat(Food_on_menu) بتواند دارای جواب مثبت باشد.
مثال 2:
فرض کنید قصد داریم فاکت صحیحی از والدین ایجاد کنیم .به اصطلاح ساده تر person1 والد person2 باشد.برای این منظور می توانیم بصورت زیر عمل کنیم:
کد:

parent(paul, samantha).

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

father(paul, samantha).

مفهوم فاکت بالا این است که paul پدر Samantha است.
اگر بخواهیم ارتباط مادر و فرزند را نشان دهیم می توانیم بصورت زیر عمل کنیم:
mother(julie, samantha).
مفهوم فاکت بالا این است که Julie مادر Samantha است.
نکته ای که در اینجا شاید مهم باشد این است که دیگر نیازی به نوشتن فاکتهای اضافی parent(person1,person2) ندارید.در واقع می توانید این رول را بنویسید که درصورتی Person1 والد person2 است،در صورتی که person1 یا ارتباط پدری و یا ارتباط مادری با Person2 داشته باشد.
کد:

parent(Person1, Person2):- father(Person1, Person2).
parent(Person1, Person2):- mother(Person1, Person2).

به عبارت ساده تر:

person1 والد person2 است اگر person1 پدر person2 باشد.
person1 والد person2 است اگر person1 مادر person2 باشد.

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

can_buy(Name, Model):-
person(Name),
car(Model),
likes(Name, Model),
for_sale(Model).

رول بالا ارتباطهای زیر را نشان می دهد:
. نام انتخابی می تواند یک ماشین را بخرد اگر
. نام انتخابی یک شخص حقیقی باشد و
. مدل ذکر شده هم یک ماشین باشد و
. شخص انتخابی آن مدل را دوست داشته باشد و
. آن مدل هم برای فروش باشد.
رول بالا در صورتی صحیح است که هر چهار شرط آن برقرار باشد.

Reyhane7
سه شنبه 03 شهریور 1388, 17:50 عصر
مثال 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).

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

Reyhane7
سه شنبه 03 شهریور 1388, 17:51 عصر
حال به عبارت زیر توجه نمایید:
کد:

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

Reyhane7
سه شنبه 03 شهریور 1388, 17:52 عصر
متغیر های بی نام:
معمولا برای جلوگیری از پیچیدگی برنامه استفاده می شود.اگر ما به یکسری از اطلاعات معین نیاز داشته باشیم ،ما می توانیم برای چشم پوشی از اطلاعاتی که نیاز نداریم از متغیر های بی نام استفاده کنیم.
برای متغیر های بی نام می توان از 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

Reyhane7
سه شنبه 03 شهریور 1388, 17:53 عصر
به مثال زیر توجه نمایید:
کد:

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را با شرایطی که ذکر شده بیاب.

Reyhane7
سه شنبه 03 شهریور 1388, 17:54 عصر
Comment ها(توضیحات):
در هر زبان برنامه نویسی این قابلیت به نحوی گنجانده شده است. می توان توضیحاتی را که یک دستور نیاز دارد به آن اضافه کرد تا خوانایی برنامه بالا برود.در واقع توضیحات،اجرا نمی شود و فقط به خوانایی برنامه کمک می کند و یا زمانی که نیاز به اجرا شدن یک دستور نداشته باشیم ،از توضیحات استفاده می کنیم.
برای توضیحات چند خطی می توان از /* comments*/ استفاده نمود و برای تک استفاده از comment های تک خطی می توان از % استفاده نمود.
همانند هم خانواده های زبان C
مثال:
کد:

/* This is an example of a comment */
% This is also a comment
/***************************************/
/* and so are these three lines */
/***************************************/
/*You can also nest a Visual Prolog comment /*within a comment*/ like this */

در زبان پرولوگ می توان بعد از هر Sub Domain از توضیحات استفاده نمود.
کد:

domains
articles = book(STRING title, STRING author); horse(STRING name)

و یا حتی می توان در تعریف Predicate ها نیز بهره برد.
کد:

predicates
conv(STRING uppercase,STRING lowercase)

از کلمات title, author, name, uppercase و lowercaseدر اجرای برنامه صرفنظر می شود و فقط برای خوانایی بیشتر نوشته شده اند.

Match چیست؟
در بخشهای قبلی از Match چند بار استفاده شد.پیدا کردن یک match،شرایط Match با Fact و ... .در این بخش این مطلب را مورد بررسی قرار می دهیم.
پرولوگ از چندین راه برای Match کردن یک چیز با چیزهای دیگر استفاده می کند.
بدیهی است که چیزهای همسان با هم match می شوند.برای مثال:
کد:

parent(joe,tammy) matches parent(joe,tammy).

بهرحال یک match از یک یا چند متغیر آزاد تشکیل شده است. برای مثال:
کد:

parent(joe,X) matches parent(joe,tammy)

و متغیر X با مقدار tammy مقید خواهد شد.
نکته:
کد:

parent(joe,X) matches parent(joe,tammy) but
parent(joe,X) would not match parent(joe,millie)

در این مثال همانطور که نوشته شده است،X با tammy ،match خواهد شد ولی X با millie ، Match نخواهد شد.دلیل این است که X یک بار مقید شده است و برای بار دوم امکان مقید سازی وجود ندارد.در واقع اگر X مقید شده باشد همانند یک ثابت عمل می کند و مقدار نمی گیرد.

Reyhane7
سه شنبه 03 شهریور 1388, 17:55 عصر
مرور:
1- زبان پرولوگ بر اساس دو مفهوم اصلی fact و rule بنا نهاده شده است:
• Fact : یک رابطه یا یک خاصیت که شما می دانید صحیح است و یا به عبارت ساده تر چیزی که شما از وجودش مطمعن هستید.برای مثال bill بازی baseball را دوست دارد . در واقع دانش شما از مساله همین fact است.
• Rule : قوانین ارتباطی هستند که به پرولوگ اجازه می دهند بوسیله یک قسمت از اطلاعات ،اطلاعات دیگر را استنباط کنند.شما ازطریق این قوانین میتوانید از دانش های موجود ،اطلاعات دیگری را استنباط نمایید.
2- فاکت ها عموما بصورت زیر نوشته می شوند:
کد:

property(object1, object2, ..., objectN)

یا
کد:

relation(object1, object2, ..., objectN)

property یک خصوصیت از آبجکته می تواند باشد و relation هم می تواند ارتباط بین آبجکتها باشد.

3-هر فاکت در برنامه از یک ارتباط دهنده و یک یا بیشتر آبجکت تشکیل شده است و یا از یک خصوصیت و یک یا بیشتر خصوصیت تشکیل شده است برای مثال:
کد:

likes(tom, baseball).

like یک ارتباط دهنده بین دو آبجکت tom و baseball است.
عبارت زیر هم یک فاکت است
کد:

left_handed(benjamin)

left_handed یک خصوصیت و Benjamin یک آبجکت است. به عبارت ساده تر و به زبان طبیعی، بنجامین چپ دست است.

4- فرم عمومی رول بصورت Head:-Body است
کد:

relation(object,object,...,object):-
relation(object,...,object),
.
.
relation(object,...,object).

5- شما در انتخاب نام های ارتباطی و آبجکتها اختیار عمل دارید.موارد محدود کننده عبارت اند از:
• نام آبجکت باید با حروف کوچک شروع شود و بدنبال آن هر عدد و حرف کوچک و یا بزرگ و یا under score می تواند بیاید.
• خصوصیت ارتباطی باید با حروف کوچک آغاز شود و بدنبال آن هر عدد و حرف کوچک و یا بزرگ و یا under score می تواند بیاید.
6- پریدیکیت نام سمبلیکی از ارتباط های بین آرگومانها است.
7- متغیر ها شما را قادر می سازند که پرسش ها و فاکت ها و رولهای عمومی بسازید.
• نام یک متغیر باید با حروف بزرگ ایجاد گردد و یا فقط یک under Score باشد و بدنبال آن هر عدد و حرف کوچک و یا بزرگ و یا under score می تواند بیاید.
• متغیرها مقدار خود را با تطبیق در فاکت ها و رولها می گیرند.تا زمانی که متغیر ،مقداری را نپذیرفته است اصلاحا گفته می شود که آزاد است و با گرفتن مقدار گفته می شود که مقید شده است.
• شما نمی توانید اطلاعات سراسری خود را در متغیر در هنگام ایجاد متغیر ،ذخیره نمایید.متغیر در روند اجرایی برنامه مقید خواهد شد.
8- اگر شما به اطلاعات معینی از پرسش هانیاز داشته باشید می توانید از متغیر های بی نام استفاده نمایید.در پرولوگ متغیر بی نام با یک under score تکی نمایش داده می شود.
متغیر بی نام هر گز مقدار نمی پذیرد.
9-جهت حرکت پرولوگ در حل مسایل همیشه از بالا به پایین است.وقتی پرولوگ می خواهد یک برنامه را اجرا نماید همیشه از بالاترین و اولین فاکت برنامه شروع به حل برنامه می نماید.
10- goal های مرکب از دو یا بیشتر بخش تشکیل شده اند.هر بخش یک goal مرکب را subgoal می گویند.goal های مرکب می توانند از ترکیب عطفی و یا ترکیب فصلی استفاده نمایند.
11- توضیحات برنامه شما را خواناتر می کنند.شما می توانید با در میان قراردادن عبارات توضیحی خود در بین /* */ و یا // به خونایی هرچه بیشتر برنامه خود کمک کنید.

برنامه نویسی در پرولوگ:
عموماً برنامه نویسی ویژوال پرولوگ از چهار بخش برنامه نویسی تشکیل یافته است.این بخشها عبارت اند از :بخش Clauses،بخش Predicates،بخش Domains و بخش Goal.
بخش Clauses قلب برنامه نویسی پرولوگ است،در این بخش Fact ها و Rule ها را وارد می نماییم.در واقع نتیجه گیری های داخل Goal به این قسمت وابسته است.
Predicates: در این بخش predicate هایی را که می خواهیم ،در این قسمت وارد می کنیم.این قسمت می تواند به domain ها هم وابسته باشد.
Domains: در این قسمت می توان دامنه های را تعریف کرد که در استاندارد ویژوال پرولوگ نمی باشند.
Goal: در این قسمت اهداف ما،یا در واقع سولاتی را که از سیستم داریم و نتیجه اش را می خواهیم بدانیم،می پرسیم.

بخش Clauses:
در این بخش فاکت های ها و رول های که در برنامه می خواهید داشته باشید،وارد می نمایید.
اگر شما بفهمید که فاکت و رول چیست و در واقع مفهوم آنها را درک کنید،ضرورت استفاده از Clauses نیز برای شما قابل فهم خواهد شد.
یک رشته از پریدیکیت ها که در Clauses تعریف می شود را پروسیجر می گویند.
وقتی ما در برنامه سعی در حل برنامه از طریق Goal می کنیم،در این موقع ویژوال پرولوگ شروع به نگاه کردن فاکت هاا و رولهای های داخل Clauses ،از بالا به پایین می کند.در واقع به دنبال چیزی می گردد که بتواند با محتویات Goal آن را تطبیق دهد(match).اگر چیزی که در حال حاضر با آن کار می کند جزء جواب ما نباشد ، در واقع با آن کاری نداریم و در این حالت اشاره گر به قسمت بعدی فرستاده می شود.به این عمل Backtracking یا بازگشت به عقب می گویند که در بخشهای بعدی مورد بررسی قرار می گیرد.

بخش Predicates:
چیزهایی را که در Clauses استفاده می کنیم به این بخش وابستگی دارند.اگر بدون تعریف در Predicate ،سعی به استفاده از فاکت ها و رولها ها کنیم،در این حالت برنامه نمی فهمد که در باره چه چیزی داریم سوال می کنیم.در این قسمت تعریف نوع انجام می شود.این تعریف نوع جزء اساسی برنامه نویسی پرولوگ می باشد.

چگونگی تعریف داده های کاربر
(user-defined) در Predicates:
تعریف یک پریدیکیت با نام پریدیکیت شروع می شود و در ادامه یک پرانتز باز و سپس نام آرگومانها (که از طول صفر تا ... می باشد) و د رآخر پرانتز بسته قرار می گیرد.مابین هر دو آرگومان(حد فاصل دو آرگومان)یک (،) قرار می گیرد.
نام یک آرگومان باید با حروف کوچک شروع شود و دنباله آن می تواند حروف کوچک،اعدادو یا Underscore باشد.

predicateName(argument_type1, argument_type2, ..., argument_typeN)

نام یک پریدیکیت می تواند تا 250 کارکتر طول داشته باشد.امکان استفاده از Space،-،/ و یا حروفی که جزء کارکتر های الفبایی اصلی نیستند ، وجود ندارد.
کارکتر های که می توان از آنها در تعریف پریدیکیت استفاده نمود عبارت اند از:
کد:

حروف بزرگ انگلیسی A,B,C,D,…,Z
حروف کوچک انگلیسی a,b,c,d,…,z
اعداد 0,1,2,…,9
زیرخط Underscore(_)

در زیر مثالی از نامهای پریدیکیت معتبر و نا معتبر آورده شده است.
کد:

معتبر نا معتبر
[fact] fact
*is_a* is_a
has/a has_a
Pattern-check-list pattern_check_list

آرگومانهای موجود در پریدیکیت باید در دامنه ویژوال پرولوگ شناخته شده باشند.این دامنه می تواند یک دامنه استاندارد باشد و یا یک دامنه تعریف شده توسط کاربر باشد.
کد:

PREDICATES
my_predicate(symbol,integer)

در تعریف بالا یک نوع تعریف سیستمی می باشد.نیازی به تعریف Domain در بالا ندارید.اگر تعریف پریدیکیت از نوع کاربری باشد آنگاه باید Domain را برای آن تعریف کرد.مثال زیر از تعریف نوع کاربر است:
کد:

Domains
name=symbol
number=integer
PREDICATES
my_pricates(name,number)

مثال زیر برای درک مفاهیم ذکر شده در بالا مناسب می باشد:
کد:

DOMAINS
person, activity = symbol
car, make, color = symbol
mileage, years_on_road, cost = integer
PREDICATES
likes(person, activity)
parent(person, person)
can_buy(person, car)
car(make, mileage, years_on_road, color, cost)
green(symbol)
ranking(symbol, integer)

در مثال بالا پریدیکیت likes دارای دو آرگومان است،که هر دو در domain تعریف شده اند و با symbol ،تعریف نوع شده اند.
پریدیکیت parent با دو آرگومان person تعریف شده است که نوع ارگومان person از نوع symbol است.
پردیکیت can_buy نیز دارای دو آرگومان است که هر دو از نوع symbol هستند و در domain تعریف شده اند.
پردیکیت car از پنج آرگومان تشکیل شده است که این آرگومانها، color از نوع symbol و mileage ،years_on_road،cost وmake از نوع integer می باشند.
پردیکیت green از یک آرگومان تعریف شده است که آن هم از نوع symbol است و نیازی به تعریف آن در Domain نیست چون بصورت استاندارد تعریف شده است.
در پردیکیت ranking از دونوع آرگومان استفاده شده است که باز در اینجا نیاز به تعریف در Domain نیست چون بصورت استاندارد تعریف شده است.نوع آرگومانهای بکار رفته در این پریدیکیت از نوع symbol و integer است.

Reyhane7
سه شنبه 03 شهریور 1388, 17:56 عصر
بخش 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 را خودتان بیابید.

Reyhane7
سه شنبه 03 شهریور 1388, 17:57 عصر
بخش 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).

ادامه دارد....

rogaieh
سه شنبه 14 آذر 1391, 13:07 عصر
سلام بابت مقاله مفید ممنون
ادامه این مقاله درو کی قراره بگذارید؟