الگوریتم روش کاهش در درستی نگارش فرمول در منطق گزارهها
روش کاهش
آزمایشگاه منطق و رایانش
■ آزمایشگاه الگوریتم کاهش فرمول
برای اجرای الگوریتم کاهش، که شرح آن در قسمت تصمیم پذیری فرمول خوش-ساخت و در یادداشت نگارش صورت و الگوریتم آن در منطق آمده است، فرمول ورودی مورد نظر را وارد کرده و سپس دکمه «اجرای کاهش» را کلیک کنید.
به جای نمادهای ['⊃', '∧', '∨', '~'] می توانید به ترتیب از نمادهای ['>', '&', '|', '~'] استفاده کنید.
فرمول ورودی را وارد کنید:
نتیجه (اجرا و ردگیری):
کد پایتون الگوریتم تصمیمپذیری نگارش فرمول در زیر آمده است. این کد را میتوانید با کلیک کردن کنید.
تعریب زبان، وازگان و رابطها
import re # Regular expressions :درخواست برای کتابخوانه
CONNECTIVES = ['⊃', '∧', '∨', '~']
BINARY_CONNECTIVES = ['⊃', '∧', '∨']
CONNECTIVE_MAPPING = {
'>': '⊃',
'&': '∧',
'|': '∨',
}
جایگزینی رابطهای ['>', '&', '|'] به رابطهای استاندارد'z'.
def _standardize_connectives(formula_str):
for ascii_char, unicode_char in CONNECTIVE_MAPPING.items():
formula_str = formula_str.replace(ascii_char, unicode_char)
return formula_str
جایگزینی اتمها به 'z'.
def _f1_replace_atoms(sub_formula_str, new_atom_char='z'):
result = []
for char in sub_formula_str:
""" بررسی به قاعده بودن نویسههای"""
if 'a' <= char <= 'z' and char != new_atom_char and char not in CONNECTIVES:
result.append(new_atom_char)
else:
result.append(char)
return "".join(result)
کاهش '~z' به '(z)' و 'z' به 'z':
def _f2_negation_and_parens(sub_formula_str):
s = sub_formula_str.replace("~z", "z")
ss = s.replace("(z)", "z")
return ss
کاهش (z γ z) به 'z' [یا z γ z به 'z' برای وقتی که پرانتز نباشد، یعنی تمام رشته است.] (نماد γ یک رابط دوتایی است.)
def _f3_binary_reduction(sub_formula_str):
escaped_binary_connectives = '|'.join(re.escape(c) for c in BINARY_CONNECTIVES)
parenthesized_pattern = re.compile(r"\(z\s*(" + escaped_binary_connectives + r")\s*z\)")
match = parenthesized_pattern.search(sub_formula_str)
if match:
start_index = match.start()
end_index = match.end()
return sub_formula_str[:start_index] + 'z' + sub_formula_str[end_index:]
""" اگر مطابقت پرانتزی وجود ندارد
z γ z
مورد جستجو قرار میگیرد """
bare_pattern = re.compile(r"^z\s*(" + escaped_binary_connectives + r")\s*z$")
bare_match = bare_pattern.search(sub_formula_str)
if bare_match:
return 'z'
return sub_formula_str """ کاهش بیشتر میسر نیست"""
با کاهش یک فرمول در منطق گزارهای به 'z'، «صحت نحوی» آن معین میشود. در صورت صحت، مقدار True و در غیر این صورت مقدار False برگردانده میشود.
def formula_reduction_algorithms(formula):
z_atom = 'z'
# Step 0: استاندارد سازی رابطهای ورودی
standardized_formula = _standardize_connectives(formula)
# Step 1: A1 = f1(standardized_formula)
A1 = _f1_replace_atoms(standardized_formula, z_atom)
# Step 2: A2 = f2(A1)
A2 = _f2_negation_and_parens(A1)
# Step 3 چرخه کاهش، یعنی کارزدن
# F4
# تا پابرجایی
current_formula_state = A2
MAX_ITERATIONS = 1000 """ حداکثر مجاز تعداد دور در چرخه:
نقطه خروج برای مانع شدن از دورهای بیپایان"""
for _ in range(MAX_ITERATIONS):
next_formula_state = _f4_combined_reduction(current_formula_state)
if next_formula_state == current_formula_state:
""" بررسی پابرجایی، یعنی اگر حالت بعد با حالت قبل مساوی است"""
return current_formula_state == z_atom
current_formula_state = next_formula_state
""" اگر چرخه پیش از رسیدن به حداکثر دور مجاز پایان یافته است"""
return False """ فرمول صحت نحوی ندارد"""
اجرا و آزمون
if __name__ == "__main__":
print(f"'(p & q) > r' is correct: \
{formula_reduction_algorithms('(p & q) > r')}")
print(f"'(p & q) > (~r)' is correct:\
{formula_reduction_algorithms('(p & q) > (~r)')}")