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

رای دهنده
44. شما نمی توانید در این رای گیری رای بدهید
  • عالی

    29 65.91%
  • خوب

    11 25.00%
  • متوسط

    1 2.27%
  • ضعیف

    0 0%
  • خیلی ضعیف

    3 6.82%
نظرسنجی چند گزینه ای
نمایش نتایج 1 تا 21 از 21

نام تاپیک: زبان ویژوال پرولوگ و نظر سنجی

  1. #1

    آموزش زبان ویژوال پرولوگ

    با سلام به همه دوستان و علاقه مندان زبانهای هوش مصنوعی

    من کتاب Visual Prolog Version 5.xرو تقریبا ترجمه کردم .در حال حاضر هم نزدیک به 300 صفحه فارسی با مثالهای عملی که خودم اجرا کردم و جواب میده.

    فصل 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).

  2. #2
    کاربر دائمی آواتار aidinwashere
    تاریخ عضویت
    فروردین 1384
    محل زندگی
    پشته سرت
    پست
    632
    با سلام
    ترم پیش من خیلی با پرولوگ سر و کله زدم, اکثر برنامه هایی کلاس رو خودم مینوشتم ولی هنوز حس میکنم چیزی ازش نمیدونم.
    با تشکر از شما, کاش چند فصل اول رو اگه صلاح دونستید بذارید بعدی feedback رو ببینید اگه خوب بود ادامه بدین.

  3. #3
    رول :
    به قوانینی که شما می توانید از واقعیت های موجود(فاکت ها) استنباطهایی را انجام دهید رول می گویند.

    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).

    پاسخی را که پرولوگ به شما می دهد بصورت زیر است:

    What = bill
    What = cindy
    What = dogs
    3 solutions

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

    استفاده از واقعیت ها و قوانین با یکدیگر
    واقعیت ها و قوانین زیر را دنبال کنید:
    یک ماشین سریع جذاب است.
    یک ماشین بزرگ جالب است.
    یک ماشین کوچک کاربردی است.
    Bill ماشینی را دوست دارد اگر آن ماشین جذاب باشد.
    وقتی شما واقعیت های (fact) جملات بالا را می خوانید ،استدلال می کنید که bill ماشین سریع را دوست دارد
    حال فرض کنید که واقعیت مربوط به ماشین سریع وجود نداشت چه اتفاقی می افتاد؟
    شما بر اساس واقعیت های منطقی نمی توانستید علاقه مندی شخص bill را استدلال کنید.ممکن است در فکر انسانی حدس و یا گمان کاربرد داشته باشد ولی در پرولوگ امکان استدلال بدون ارائه یک واقعیت منطقی وجود ندارد،در واقع پرولوگ گمان نمی کند.
    در مثال زیر نشان می دهیم که پرولوگ چگونه از قوانین برای پاسخ دهی به پرسش ها استفاده می نماید:

    likes(ellen, tennis).
    likes(john, football).
    likes(tom, baseball).
    likes(eric, swimming).
    likes(mark, tennis).
    likes(bill, Activity):- likes(tom, Activity).

    آخرین عبارت در این مثال rule می باشد.زبان طبیعی rule مورد نظر بصورت زیر است.
    bill فعالیتی را دوست دارد اگر tom نیز آن فعالیت را دوست داشته باشد.
    سر یاhead این رول عبارت likes(bill, Activity) است و بدنه یا body آن عبارت
    likes(tom, Activity) است.توجه اینکه در این مثال واقعیتی دال بر علاقه مندی bill به بازی بیس بال وجود ندارد.پرولوگ بر اساس پرسش ها و واقعیت های موجود به علاقه مندی bill به بازی بیس بال پی می برد.
    برنامه زیر را در محیط ویژوال پرولوگ نوشته و اجرا نمایید

    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).

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

  4. #4
    با سلام مجدد به همه دوستان
    من فکر می کردم که زبان ویژوال پرولوگ ممکنه که بتونه بین طرفدار های هوش مصنوعی واسه خودش جایی پیدا کنه.
    می خواستم کل کتابی را که ترجمه کردم بصورت بخش به بخش بهمراه مثالها و جزئیاتی که خودم در اجرایشون نکاتی پیدا کرده بودم در اختیار دوستان بذارم ولی متاسفانه می بینم که طرفدار نداره .
    پس فعلا بهتر می بینم که از پرداختن به بخشهای دیگر این زبان جالب ،زیبا و منحصر بفرد خود داری کنم.

    با تشکر
    کوچک همه عزیزان
    مرزبان
    آخرین ویرایش به وسیله marzban : شنبه 19 خرداد 1386 در 23:45 عصر دلیل: اشتباه تایپی

  5. #5
    سلام من تازه این قسمت رو دیدم .
    من باید بگم که این زبان بین دانشجویان کامپیوتر جایگاه خاصی دارد ولی به دلیل نبودن منابع به سر عت از یاد گیری ان منصرف می شوند اگر سه فصل اول را به صورت pdf منتشر کنی باعث می شود دانشجویان لذت برنامه نویسی از پرولوگ را درک کنند
    با تشکر
    رستمی

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

  7. #7
    منم خیلی با پرولوگ کار کردم منظورم SWI Prolog هست.
    اولش فکر می کردم زبان به درد نخوری هست ولی بعدش پشیمون شدم.

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

    اگه عمری بود دارم مطلب جمع می کنم که یه کتاب جامع در مورد هوش مصنوعی و پرولوگ به صورت کتاب الکترونیکی درست کنم.

    امیدوارم مطالب هیمنطور ادامه داشته باشه.

    راستی یادم رفت ویژوال پرولوگ کرک نداره؟

  8. #8
    مثال 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را با شرایطی که ذکر شده بیاب.

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

  9. #9
    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 مقید شده باشد همانند یک ثابت عمل می کند و مقدار نمی گیرد.

    مرور:
    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 است.

    بخش 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 را خودتان بیابید.

    بخش 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).

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

  10. #10

    نقل قول: زبان ویژوال پرولوگ و نظر سنجی

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

  11. #11

    نقل قول: زبان ویژوال پرولوگ و نظر سنجی

    با سلام و عرض تشکر از شما
    چرا دیگر ادامه نمی دهید؟

  12. #12
    کاربر دائمی آواتار icegirl_f2r
    تاریخ عضویت
    اردیبهشت 1388
    محل زندگی
    ESF_Ashrafi Esfahani
    پست
    204

    نقل قول: زبان ویژوال پرولوگ و نظر سنجی

    با سلام
    سوالی داشتم لطفاً آن را رفع کنید.
    مچکرم.
    سوال: من با swiprolog کار می کنم .
    چندین قانون دارم که قسمت شرط آنها مثل هم هستند ولی جواب های متفاوت دارند در اجرا فقط اولین جواب را به من برمی گردونه می خواستم ببینم اگه بخوام همه ی جوابها رو نشون بده باید چه کار کنم؟
    مثلا درکد زیر درصورتیکه کامپیوتر خاموش باشه پس باید یک سری کارها را انجام بدهد این را چطور باید انجام داد؟

    check(checks_total_cable):-off(computer).
    check(check_not_faile_cpu):-off(computer).
    check(check_cpu_correct_place):-off(computer).

  13. #13
    کاربر دائمی آواتار vbiman
    تاریخ عضویت
    بهمن 1384
    محل زندگی
    مشهد
    پست
    148

    Smile نقل قول: زبان ویژوال پرولوگ و نظر سنجی

    با سلام
    من تازه به مطالب شما برخوردم من خيلي دنبال اطلاعاتي در رابطه با زبان پرولوگ مي گشتم كه مطالب شما برام جالب ومفيد بود من دنبال زمان انقياد(Binding time)و يا ساختمان داده زبان پرولوگ مي گردم كه متاسفانه مطلب فارسي پيدا نكردم لطف مي كنين در رابطه با ابن دو موردي كه گفتم يك pdf يا يك منبع فارسي خوب معرفي كنين .

  14. #14

    نقل قول: زبان ویژوال پرولوگ و نظر سنجی

    سلام
    استاد بابت توضیحات کاملتون در مورد prolog کمال تشکر را دارم.

    استاد من دارم در مورد prolog تحقیقات گسترده ای رو انجام می دم.اما با کمی منابع مواجه هستم.
    یه سوال بزرگ در مورد prolog این هست که ما چطور میتونیم یک تابع داشته باشیم که چندتا ورودی و خروجی داشته باشه؟؟ و از همه مهم تر چطور میشه که ما از تابع خودمون یه dll داشته باشیم؟؟؟

    ممنون میشم اگه بهم دراین مورد کمک کنید :)

  15. #15

    نقل قول: زبان ویژوال پرولوگ و نظر سنجی

    حالا این کدها رو تو ویژوال پرولوگ کجا باید نوشت؟
    [

    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).

  16. #16

    نقل قول: زبان ویژوال پرولوگ و نظر سنجی

    بابا کسی به من نیست بگه که این کدها رو کجایی visaul prolog باید بنویسیم و خروجی بگیریم
    کسی نیست به من یک کتاب عملی پیشنهاد کنه تا من با ان این زبان را یاد بگیرم
    نقل قول نوشته شده توسط marzban مشاهده تاپیک
    مثال 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را با شرایطی که ذکر شده بیاب.

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

  17. #17

    Question نقل قول: زبان ویژوال پرولوگ و نظر سنجی

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

    شما چه پیشنهادی دارید برای اینکه بفهمیم این دو شخص چه نسبتی با هم دارند؟
    Name:  main.gif
Views: 267
Size:  30.7 کیلوبایتبا تشکر

  18. #18

    نقل قول: زبان ویژوال پرولوگ و نظر سنجی

    باید خیلی بیشتر از این در ایران به زبان پرولوگ پرداخته شود

  19. #19

    نقل قول: زبان ویژوال پرولوگ و نظر سنجی

    بابا یه 2 تا برنامه توی بازار که با پرولوگ نوشته شده به ما نشون بدید تا بدونیم این زبان به درد بخور هستش ، اصلاً این مثالهایی که میزنید مثل این است که با پاسکال دارید کار میکنید

  20. #20

    نقل قول: زبان ویژوال پرولوگ و نظر سنجی

    نقل قول نوشته شده توسط ali_reza.ahmadi مشاهده تاپیک
    بابا یه 2 تا برنامه توی بازار که با پرولوگ نوشته شده به ما نشون بدید تا بدونیم این زبان به درد بخور هستش ، اصلاً این مثالهایی که میزنید مثل این است که با پاسکال دارید کار میکنید
    با این زبان چقدر آشنایی دارید؟ دستوراتش منظورم نیست. فلسفه و کارکرد و غیره.

    پرولوگ زبان برنامه‌نویسی تجاری به اون معنی که شاید شما در ذهن داشته باشید نیست.

  21. دوشنبه 27 شهریور 1391, 16:48 عصر

    دلیل
    Off-Topic

  22. چهارشنبه 29 شهریور 1391, 13:39 عصر

    دلیل
    Off-Topic

  23. #21

    نقل قول: زبان ویژوال پرولوگ و نظر سنجی

    واقعا ممنون اگه در مورد فرم ها هم توضیح بدین عالی میشه

برچسب های این تاپیک

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •