الگوریتم DPLL کیست؟ توضیح بده.
الگوریتم DPLL (کوته‌نوشت Davis–Putnam–Logemann–Loveland) در منطق و علوم رایانه، یک الگوریتم جستجوی کامل و مبتنی بر پس‌گرد برای تصمیم‌گیری درمورد صدق‌پذیری برای فرمول‌های منطق گزاره‌ای در حالت نرمال عطفی است، به عبارت دیگر الگوریتم DPLL دارد مسئله CNF-SAT را حل می‌کند.این الگوریتم در سال ۱۹۶۱ توسط مارتین دیویس، جرج لاگِمن، و دونالد لاولند معرفی گردید، که یک روش اصلاحی برای بود. بخصوص در نشریات قدیمی، به الگوریتم دیویس-پاتانم-لاولند، «روش دیویس-پاتنام» یا «الگوریتم DP» گفته می‌شد. نام‌های معمول‌تر دیگری که این تفاوت را حفظ نموده‌اند، DLL و DPLL می‌باشند.بعد از حدود ۵۰ سال، هنوز هم فرایند DPLL مبنایی برای موثرترین حل‌کننده‌های کامل SAT می‌باشد. این الگوریتم، امروزه، این الگوریتم، در زمینه اثبات قضیه خودکار برای قطعه‌هایی از منطق مرتبه اول، به روش الگوریتم گسترش داده شده‌است.پیاده‌سازی و کاربردها.مسئله SAT هم از دیدگاه نظری و هم عملی مهم می‌باشد. در نظریه پیچیدگی، این الگوریتم، اولین مسئله‌ای بود که ثابت شد که ان‌پی کامل است. مسئله SAT در موارد متنوع و گسترده‌ای مثل «وارسی مدل»، «زمان‌بندی و برنامه‌ریزی خودکار» و «» کاربرد دارد.از این رو، این الگوریتم سال‌ها مورد پژوهش‌های فراوان بوده‌است، و به صورت منظم صحنه رقابت‌های زیادی بین بوده‌است. در سال‌های اخیر، پیاده‌سازی‌های نوین DPLL مثل ، یا MiniSat در مقام اول این رقابت‌ها بوده‌اند.یک کاربرد دیگر که DPLL را درگیر نموده‌است، اثبات قضیه خودکار، یا (SMT) است. SMT یک نظریه SAT است که در آن متغیرهای گزاره‌ای توسط فرمول‌های دیگر نظریهٔ ریاضیاتی جایگزین شده‌اند.الگوریتم.الگوریتم پس‌گرد اصلی توسط انتخاب یک لیترال، انتساب یک مقدار درستی به آن، ساده‌سازی فرمول، و سپس بررسی بازگشتی این موضوع رخ می‌دهد که آیا فرمول ساده‌سازی شده صدق‌پذیر هست یا نه؛ اگر صدق‌پذیر بود، یعنی فرمول اصلی صدق‌پذیر است، در غیر این صورت، با فرض مقدار درستی معکوس، بررسی بازگشتی مشابهی باید انجام شود. به این موضوع «"قاعده جداسازی"» گفته می‌شود، زیرا مسئله را به دو زیرمسئله ساده‌تر جداسازی می‌کند. گام ساده‌سازی به صورت اساسی این است که همه بندهایی که تحت انتساب از فرمول، «درست» می‌شوند، و همه لیترال‌هایی که از بندهای باقیمانده «نادرست» می‌شوند، را حذف می‌کند.با استفاده حریصانه این قواعد در هر گام، الگوریتم DPLL روی الگوریتم پسگرد، افزایش می‌یابد:حذف لیترال خالص.یک انتساب جزئی داده شده موقعی صدق‌ناپذیری اش تشخیص داده می‌شود که یکی از بندها «خالی» شود، یعنی همه متغیرهایش به شیوه ای منتسب شوند که لیترال‌های متناظر را نادرست کنند. صدق‌پذیری فرمول در دو حالت تشخیص داده می شود: یا موقعی که همه متغیرها را انتساب دهیم اما بند خالی تولید نشود، یا در پیاده‌سازی‌های نوین، اگر همه بندها صادق شوند. صدق‌ناپذیری کامل فرمول تنها پس از «جستجوی جامع» تشخیص داده می‌شود.الگوریتم DPLL را می‌توان در شبه کد زیر خلاصه کرد، که در آن Φ همان فرمول CNF است: Input: A set of clauses Φ. Output: A Truth Value. function DPLL(Φ) if Φ is a consistent set of literals then return true; if Φ contains an empty clause then return false; for every unit clause "{l}" in Φ do Φ ← "unit-propagate"("l", Φ); for every literal "l" that occurs pure in Φ do Φ ← "pure-literal-assign"("l", Φ); "l" ← "choose-literal"(Φ); return "DPLL"(Φ ∧ {l}) or "DPLL"(Φ ∧ {not(l)});در این شبه‌کدcodice_1 و codice_2 توابعی هستند که نتیجه اعمال «انتشار واحد» و «قاعده لیترال خالص» را برای لیترال codice_3 و فرمول codice_4 به ترتیب برمی‌گردانند. به زبان دیگر، این توابع در فرمول codice_4 هر رخداد codice_3 را به «درست» و هر رخداد codice_7 را با «نادرست» جایگزین می‌کنند، و سپس فرمول نتیجه‌شده را ساده‌سازی می‌کنند. codice_8 موجود در عبارت codice_9 یک عملگر اتصال کوتاه است. codice_10 نشان دهنده نتیجه ساده‌سازی‌شده جایگزینی «درست» برای codice_3 در codice_4 است.این الگوریتم در یکی از این دو حالت خاتمه می‌یابد: یا اینکه فرمول CNF ای با نام codice_4 پیدا می‌شود که شامل مجموعه سازگاری از لیترال‌ها باشد، یعنی هیچ codice_3 و &lt;bdi&gt;codice_15&lt;/bdi&gt; ای برای لیترال codice_3 در فرمول موجود نباشد. اگر این موضوع رخ دهد، متغیرها را به صورت بدیهی با تنظیم آن‌ها به قطبیت متناظر لیترال شامل‌شونده در ارزیابی صادق می‌کنیم. در غیر این صورت، موقعی که فرمول شامل یک بند خالی باشد، این بند به صورت پوچ «نادرست» است، زیرا یک فصل حتماً نیاز دارد تا حداقل یک عضوش درست باشد تا مجموعه کلی درست شود. در این حالت، وجود چنین بندی به معنی آن است که فرمول (که به صورت عطف همه بندها ارزیابی می‌شود) را نمی‌توان «درست» ارزیابی کرد، و فرمول باید صدق‌ناپذیر باشد.شبه‌کد تابع DPLL فقط این موضوع را برمی‌گرداند که آیا انتساب نهایی برای فرمول، صدق‌پذیر هست یا نه. در یک پیاده‌سازی واقعی، یک انتساب نیمه‌صادق نیز معمولاً موفقیت را برمی‌گرداند؛ این موضوع از مجموعه سازگار لیترال‌های بیانیه codice_17 اول در تابع، قابل دستیابی است.الگوریتم دیویس-لاگمن-لاولند به گزینه «لیترال انتشعابی» بستگی دارد، که همان لیترالی است که در گام پسگرد درنظرگرفته شده‌است. و این موضوع، یعنی الگوریتم DPLL یک الگوریتم دقیق نیست، بلکه «خانواده‌ای از الگوریتم‌ها» است، که هر عضو آن خانواده یک روش ممکن برای انتخاب لیترال انشعاب دارد. «کارایی» الگوریتم به شدت از نحوه انتخاب گزینه لیترال انشعاب تأثیر می‌پذیرد: نمونه‌هایی وجود دارد که در آن زمان اجرایی ثابت است، و همچنین در نمونه‌هایی زمان‌اجرا نمایی است، این موضوع بستگی به نحوه انتخاب لیترال‌های انشعابی دارد. به این توابع انتخابی، «توابع اکتشاف»، یا «اکتشاف برای انشعاب» هم گفته می‌شود.نحوه تصور.در سال ۱۹۶۱ دیویس، لاگمن، لاومن این الگوریتم را ایجاد کردند. بعضی از ویژگی‌های این الگوریتم از این قرار است:یک مثال با تصور مرتبط با آن از یک الگوریتم DPLL که پسگرد زمانی دارد:کارهای جدید روی الگوریتم.در سال‌های دهه ۲۰۱۰، کار روی بهبود الگوریتم در سه جهت انجام شد:یک الگوریتم جدیدتر از سال ۱۹۹۰، روش استالمارک است. از این رو از سال ۱۹۸۶، از نمودارهای تصمیم دودویی (با مرتبه پایین) برای حل SAT استفاده شده‌است.ارتباط با دیگر مفاهیم.اجرای الگوریتم‌های مبتنی بر DPLL روی نمونه‌های صدق‌ناپذیر با «اثبات‌های انکار وجود رزلوشن درختی» متناظر است.