رزلوشن SLD
رزلوشن بند معین خطی انتخابی با کوته‌نوشت SLD قاعده استنتاج اصلی استفاده شده در برنامه‌نویسی منطقی است. این رزلوشن یک روش اصلاحی از رزلوشن معمولی است و مزیت اصلی‌اش آن است که برای بندهای هورن، استوار و کامل ابطال است.
اگر به ما یک بند هدف به صورت زیر داده شود:
formula_1
و لیترال انتخابی ما formula_2 باشد و نیز یک بند معین ورودی به صورت زیر داشته باشیم:
formula_3
که در آن لیترال مثبت (اتم)formula_4 با اتم formula_5 از لیترال انتخابی formula_6 همان‌سازی شود، رزلوشن SLD یک بند هدف دیگر را نتیجه می‌دهد، که در این بند، لیترال انتخابی با لیترال‌های منفی بند ورودی جایگزین شده‌اند، و نیز جایگزینی همان‌سازی formula_7 در آن اعمال شده‌است:
formula_8
به صورت ساده، در منطق گزاره‌ای، اتم‌های formula_5 و formula_10 همان هستند، و جایگزینی همان‌سازی formula_7 پوچ و بی‌معنی است. با این حال، در حالت کلی‌تر، این جایگزینی همانی، برای آنکه دو لیترال همان‌سازی شوند، لازم است.
نام «رزلوشن SLD» توسط آقای ماارتن ون امرن ارائه شد، او در واقع نامی را برای قاعده استنتاج بی‌نام روبرت کوالسکی انتخاب کرده بود. این نام از زرلوشن SL گرفته شده‌است، که برای «منطق بندهای بدون محدودیت»، هم استوار و هم ابطال کامل بود. در واقع «SLD» به معنی «رزلوشن SL با بندهای معین» است.
هم در SL و هم در SLD، حرف «L» به این واقعیت اشاره دارد که یک اثبات رزلوشن را می‌توان به ترتیب خطی بندها محدود کرد:
formula_12
که در آن «بند ابتدا» یعنی formula_13 یک بند ورودی است، و هر بند دیگر formula_14 یک حل مسئله است که والدین آن بند قبلی formula_15 است. اثبات موقعی رد می‌شود که بند نهایی formula_16 یک بند خالی باشد.
در SLD، همه بندهای موجود در ترتیب، بند هدف هستند، و والد دیگر یک بند ورودی است. اما در رزلوشن SL، والد دیگر یا یک بند ورودی است، یا یک بند جد (نیا)‌ی قبلی موجود در ترتیب است.
حرف «S» هم در SL و هم در SLD به معنی آن است که تنها لیترالی که در هر بند formula_15 دربرابر آن حل مسئله انجام می‌شود آن لیترالی است که به صورت یکتا، توسط یک قاعده گزینش یا تابع گزینش، انتخاب شده‌است. در رزلوشن SL، لیترال انتخابی محدود به همان لیترالی است که جدیدتر به بند معرفی شده‌است. در ساده‌ترین حالت، این تابع گزینش ورودی-آخر-خروجی-اول را می‌توان با ترتیبی که لیترال‌ها توسط آن نوشته شده‌اند، تعیین نمود، مثلاً پرولوگ از این روش استفاده می‌کند. با این حال، تابع گزینش در رزلوشن SLD همگانی‌تر از رزلوشن SL و رزلوشن پرولوگ است؛ یعنی هیچ محدودیتی روی لیترال گزینش شده وجود ندارد.
در منطق بندی، یک انکار SLD، نشان‌دهنده آن است که مجموعه ورودی بندها صدق‌ناپذیر هستند. با این حال، در برنامه‌نویسی منطقی، یک ابطال SLD یک تفسیر محاسباتی دارد. بند اولیه formula_1 را می‌توان به صورت انکار عطف زیرهدف‌های formula_19 تفسیر کرد. استنتاج بند formula_14 از formula_15 یک نتیجه خروجی، به کمک ، از مجموعه جدیدی از زیرهدف‌ها است که از یک بند ورودی به عنوان فرایند کاهش هدف استفاده می‌کند. جایگزین همان‌ساز formula_7 دو کار می‌کند: هم ورودی را از زیرهدف انتخابی به بدنه فرایند انتقال می‌دهد، و هم به صورت همزمان خروجی را از انتهای فرایند به زیرهدف‌های باقیمانده و گزینش نشده انتقال می‌دهد. بند خالی یعنی یک مجموعه خالی از زیرهدف‌ها، نشان‌دهنده آن است که «عطف اولیه زیرهدف‌ها در بند اولیه» حل شده‌است.
رزلوشن SLD به صورت ضمنی یک درخت جستجو از محاسبات مختلف را تعریف می‌کند، که در آن «بند هدف اولیه» با «ریشه درخت» مرتبط است. برای هر گره در درخت، و برای هر بند معین در برنامه که لیترال مثبت آن با لیترال انتخابی در بند هدف مرتبط با گره، همان‌سازی می‌شود، یک گره فرزند مرتبط با بند هدف وجود دارد که این گره فرزند، از رزلوشن SLD به دست آمده‌است.
یک گره برگ (که هیچ فرزندی ندارد) موقعی گره موفقیت است که بند هدف مرتبط با آن بند خالی باشد. و موقعی یک گره شکست است که بند هدف مرتبط با آن غیرخالی باشد، و نیز لیترال انتخاب شده‌اش با هیچ لیترال مثبتی از هر بند ورودی همان‌سازی نشود.
رزلوشن SLD از یک نظر غیرمعین است: زیرا راهبرد جستجو برای کاوش درخت جستجو را تعیین نمی‌کند. پرولوگ، درخت را به صورت اول-عمق جستجو می‌کند، یعنی یک شاخه در هر زمان بررسی می‌شود، و موقعی که به یک گره شکست می‌رسد، از پس‌گرد استفاده می‌کند. جستجوی اول عمق از نظر استفاده از منابع بسیار کارا و مؤثر است، اما ایرادش آن است که اگر فضای جستجو شامل شاخه‌های بی‌انتها باشد، و راهبرد جستجو آن شاخه‌ها را قبل از شاخه‌های متناهی جستجو کند، یک الگوریتم غیر کامل می‌شود: یعنی محاسبات خاتمه نمی‌یابد. راهبردهای دیگر جستجو، شامل اول-سطح، اول-بهترین، و جستجوی شاخه و حد، هم ممکن هستند. بعلاوه جستجو را می‌توان به صورت ترتیبی یا موازی انجام داد، یعنی در حالت ترتیبی هر زمان یک گره را بررسی کنیم یا به صورت موازی باشد یعنی همزمان چندین گره بررسی شوند.
رزلوشن SLD از این نظر که قاعده گزینش توسط قاعده استنتاج تعیین نمی‌شود، یک الگوریتم «غیر معین» است، این قاعده گزینش را می‌توان توسط یک فرایند تصمیم جداگانه تعیین کرد، که می‌تواند نسبت به موارد پویای فرایند اجرای برنامه حساس باشد.
فضای جستجوی رزلوشن SLD یک درخت or است، که در آن شاخه‌های مختلف نشان دهنده محاسبات متفاوت هستند. در حالت برنامه‌های منطق گزاره‌ای، می‌توان SLD را به شیوه ای تعمیم داد که فضای جستجو یک درخت and-or بشود، که در آن گره‌ها توسط لیترال منفرد برچسب‌زنی می‌شوند، و نشان دهنده زیرهدف هستند، و این گره‌ها یا با عطف یا با فصل به یکدیگر پیوند می‌یابند. به صورت کلی، موقعی که زیرهدف‌های عطفی، متغیرهای مشترک دارند، نمایش درخت and-or پیچیده‌تر است.
اگر به ما برنامه منطقی زیر داده شده باشد:
q :- p p
و هدف سطح بالای ما اینطوری باشد:
q
فضای جستجو شامل فقط یک شاخه است، که در آن codice_1 به codice_2 کاهش می‌یابد که آن هم به مجموعه خالی از زیرهدف‌ها کاهش می‌یابد، که این موضوع اشاره به محاسبات موفقیت می‌کند. در این حالت برنامه بسیار ساده است، و در آن نقشی برای تابع گزینش وجود ندارد و هیچ نیازی به جستجو هم نیست.
در منطق بندها، برنامه توسط مجموعه‌ای از بندها نمایش می‌یابد:
formula_23
formula_24
و هدف سطح بالا، توسط بند هدف با یک لیترال منفی منفرد نمایش می‌یابد:
formula_25
و فضای جستجو شامل یک ابطال منفرد است:
formula_26
که در آن formula_27 نشان‌دهنده بند خالی است.
اگر این بند به برنامه اضافه گردد: q :- r آنوقت یک شاخه اضافی به فضای جستجو اضافه می‌شود، که در آن گره برگ codice_3 یک گره شکست است. در پرولوگ، اگر این بند به جلوی برنامه اصلی اضافه شود، آنوقت پرولوگ از ترتیب نوشته شدن بندها استفاده می‌کند تا در شاخه‌های فضای جستجو، ترتیب بررسی را تعیین کند. پرولوگ این شاخه جدید را اول امتحان می‌کند، و شکست می‌خورد، و سپس پس‌گرد می‌کند تا شاخه منفرد برنامه اصلی را بررسی کند، و سپس موفق می‌شود.
اگر اکنون بند زیر
p :- p
به برنامه اضافه شود، آنوقت درخت جستجو شامل یک شاخه نامتناهی می‌شود، و اگر این بند را اول امتحان کند، پرولوگ وارد یک حلقه نامتناهی می‌شود، و شاخه موفق را پیدا نمی‌کند.
SLDNF یک گسترش برای رزلوشن SLD است، که با برخورد می‌کند. در SLDNF، بندهای هدف می‌تواند شامل نفی به صورت لیترال شکست باشد، که فرم formula_28 دارند، که این لیترال فقط موقعی قابل گزینش است که شامل هیچ متغیری نباشد. موقعی که چنین لیترالی فاقد متغیری گزینش شود، یک زیراثبات (یا زیرمحاسبه) سعی می‌کند تا تعیین کند که «آیا یک انکار SLDNF با شروع از لیترال غیرمنفی متناظر formula_24 به عنوان بند اولیه، وجود دارد یا نه». زیرهدف گزینش شده formula_28 موقعی موفقیت است که زیراثبات شکست بخورد، و موقعی شکست می‌خورد که زیراثبات موفق باشد.