نمايش پست تنها
قديمي ۰۴-۱۲-۱۳۸۹, ۰۵:۲۳ بعد از ظهر   #2 (لینک دائم)
alijy Male
Super Moderator
 
آواتار alijy
 
تاريخ عضويت: خرداد ۱۳۸۹
محل سكونت: ارض الله الواسعة
پست ها: 78
تشكرها: 23
250 تشكر در 77 پست
My Mood: Khonsard
پيش فرض

سلام

range/2 : عدد N رو میگیره و لیست [1,...,N] رو تولید میکنه.

queens/2 : تعداد وزیرها رو میگیره و راه حل مسئله رو تولید میکنه.

queens/3 : این predicate در واقع کار اصلی برنامه رو انجام میده. با گرفتن لیست [1,...,N] ، ازش به عنوان شماره ستون های جدول (نه شماره وزیر!) استفاده میکنه. این گزاره بصورت iteration و با فراخوانی مجدد خودش، در هر مرحله ستون محل قرار گیری وزیر هر سطر رو انتخاب (select)میکنه. سپس چک میکنه که وزیر جدید با وزیرهای انتخاب شده برای سطرهای قبل برخورد (attack) نداشته باشه. اگر این شرط برقرار باشه، شماره ستون به لیست راه حل (SafeQs) اضافه میشه. در غیر اینصورت هم ستون دیگه ای برای وزیر سطر کنونی انتخاب میشه. اگر هیچ ستون جدیدی که قابل قبول باشه پیدا نشه، آخرین گزاره queens/3 فراخوانی شده fail میشه و در نتیجه گزاره queens/3 قبلی که اون رو فراخوانی کرده بوده دوباره اجرا میشه و ستون جدیدی رو برای وزیر قبلی انتخاب میکنه. این برگشت تا جایی که بشه یه ستون جدید قابل قبول برای وزیر همون سطر انتخاب کرد ادامه پیدا میکنه و به محض انتخاب جدید برگشت متوقف شده و پیشروی دوباره ادامه پیدا میکنه. در نهایت هم وقتی لیست سطرها (وزیرها) خالی شد، لیست ستونهایی که به ترتیب برای سطرها (وزیرها) انتخاب شده به عنوان خروجی به queens/2 برمیگرده.

attack/2 : با فراخوانی گزاره کمکی attack/3 احتمال برخورد رو یک وزیر با وزرای قبلی رو چک میکنه.

attack/3 : این گزاره کمکی بصورت iteration و با فراخوانی مجدد خودش امکان برخورد وزیر جدید رو با تک تک وزرای قبلی چک میکنه. نکته مهم در مورد این predicate اینه که تک تک حالات برخورد ممکن تا جایی چک میشه که یه برخورد پیدا بشه. در غیر اینصورت attack/3 بعد از بررسی تمامی حالات ممکن fail میشه که مطلوب هست. برای بررسی حالات ممکن در هر مرحله آیتم اول لیست SafeQs (لیست ستونهای وزرای قبلی) انتخاب میشه. اولین انتخاب، شماره ستون وزیر سطر قبلی رو نشون میده. برای این شماره ستون چک میشه که وزیر جدید در ستون قبلی یا بعدی این ستون قرار میگیره یا نه. سپس سطر قبل تر (سطری که با سطر کنونی 2 تا فاصله داره. مثلا سطر 4 و سطر 6) از اون رو چک میکنه تا ببینه که ستون انتخاب شده برای سطر (وزیر) جدید (مثلا سطر 6) در دو ستون قبل یا 2 ستون بعد از ستون سطر چک شونده (مثلا سطر 4) قرار نگیره، و به همین ترتیب تا سطر 1 همه انتخابهای قبلی با انتخاب کنونی چک میشه. این نکته رو هم خوبه بگم که لازم نیست هم ستون بودن هیچ دو وزیری رو چک کنیم، چون در موقع انتخاب شماره ستون انتخاب شده برای هر وزیر از لیست امکان انتخاب برای وزرای بعدی حذف میشه.

** دو predicate آخر هم هیچ ربطی به برنامه N وزیر داده شده نداره و احتمالا مربوط به برنامه یا بخش دیگه از یه برنامه مفصل تر هست. ضمن اینکه برای tk_do_one_event هم هیچ تعریفی ارائه نشده و در واقع اجرای جداگانه tk_do_all_events در این برنامه همیشه با error همراهه.

امیدوارم که توضیحات مفهوم بوده باشه. اگر سؤالی در مورد قسمت بخصوصی از برنامه هست خوشحال میشم جواب بدم.
alijy آفلاين است   پاسخ با نقل قول
از alijy تشكر كرده اند:
Astaraki (۰۴-۱۲-۱۳۸۹), nasersalehiazar (۰۸-۲۵-۱۳۸۹), salar_cpp_cs (۰۴-۱۲-۱۳۸۹)