رزولوشن (اثبات با تفکیک)
از دو بند که یکی ℓ و دیگری ¬ℓ را دارد، بند تازهای میسازد که بقیهی هر دو را دارد. اگر به بند تهی برسیم، مجموعهی بندها ناسازگار است؛ اثبات با برهان خلف به همین شکل است.
از دو بند p ∨ A و ¬p ∨ B نتیجه میشود A ∨ B: اگر p درست باشد، B باید درست باشد و اگر نادرست، A. بند حاصل را تفکیکگر (resolvent) میگویند.
- زمان:
exponential in the worst case - حافظه:
up to 3^n clauses on n variables - جانسونباو، فصل ۱
اثبات q از p ∨ q، ¬p ∨ r و ¬r: نقیض نتیجه (¬q) را اضافه میکنیم و به بند تهی میرسیم.
def resolution(clauses):# clauses: "p|q, ~p|r, ~q": a conjunction of disjunctions. Each clause becomes a sorted list of literals.known = []rows = [] # for the picture: number, clause, where it came fromfor part in clauses.split(","):lits = sorted(set(x.strip() for x in part.split("|") if x.strip()))if lits and lits not in known:known.append(lits)rows.append([len(rows) + 1, " ∨ ".join(lits), "given"])count = len(known)i = 0while i < len(known):for j in range(i):for lit in known[i]:other = lit[1:] if lit.startswith("~") else "~" + litif other not in known[j]:continuer = []for x in known[i] + known[j]:if x != lit and x != other and x not in r:r.append(x)r.sort()tautology = Falsefor x in r:if "~" + x in r:tautology = Trueif tautology or r in known:continueknown.append(r)rows.append([len(rows) + 1, " ∨ ".join(r) if r else "□", str(j + 1) + ", " + str(i + 1)])if not r:return Falsei = i + 1return True
شروع اجرا
جدول هنوز خالی است.
متغیرهای محلی
نارنجی = در همین گام عوض شد
Call stack
- resolution()خط 1
توضیح
قاعدهی تفکیک
از دو بند p ∨ A و ¬p ∨ B نتیجه میشود A ∨ B: اگر p درست باشد، B باید درست باشد و اگر نادرست، A. بند حاصل را تفکیکگر (resolvent) میگویند.
اثبات با تفکیک
برای اثبات اینکه q از فرضها نتیجه میشود:
- فرضها و نقیض
qرا به شکل بندی (CNF) بنویس. - تا جایی که میشود تفکیک کن.
- اگر به بند تهی
□رسیدی (مثلاً ازrو¬r)، مجموعه ناسازگار است، پسqنتیجه میشود (برهان خلف).
تفکیک کامل است: اگر مجموعهای ناسازگار باشد، این روش دیر یا زود بند تهی را میسازد. اگر بند تازهای نیاید و بند تهی هم ساخته نشده باشد، مجموعه سازگار است.
ورودی
بندها با ویرگول جدا میشوند و لیترالهای هر بند با |؛ ~ یعنی نقیض. متغیرها p، q، r و s اند.