সরাসরি পর্বে যান
পর্ব ০৬ · ৮৩-এর মধ্যে · মডিউল ১

অনুমানের নিয়ম — modus ponens থেকে resolution

Rules of Inference — Valid Arguments, Fallacies, Quantifier Rules, Formal Proofs and Resolution

Taught in Bangla, this lesson defines validity as a tautology of premises implying the conclusion and proves the eight basic rules, from modus ponens and modus tollens to resolution. It exposes affirming the consequent and denying the antecedent with counterexample rows, writes formal proofs with a reason on every line, and covers universal and existential instantiation and generalization. In-page Python checks every rule, flags an unjustified proof step, and runs resolution refutation to the empty clause.

এই পর্বে যা শিখবেন

  • Argument, premise, valid আর sound-এর নির্ভুল সংজ্ঞা, আর valid হওয়ার truth-table পরীক্ষা
  • আটটি অনুমানের নিয়ম, প্রতিটির tautology, আর দুটির পূর্ণ প্রমাণ
  • সাধারণ fallacy চেনা আর counterexample সারি দিয়ে দেখানো
  • প্রতিটি লাইনের কারণসহ formal proof লেখা, quantifier-ওয়ালা বাক্যেও
  • Resolution refutation দিয়ে প্রমাণ, আর soundness ও completeness-এর পার্থক্য

১ · Argument কখন valid — premise, উপসংহার আর আকারের নিশ্চয়তা

বাজারঘরের সাপোর্ট টিমে একজন কর্মী রিপোর্ট লিখলেন: “অর্ডার ক্যানসেল হলে টাকা ফেরত যায়। এই অর্ডার ক্যানসেল হয়েছে। অতএব টাকা ফেরত গেছে।” আরেকজন লিখলেন: “অর্ডার ক্যানসেল হলে টাকা ফেরত যায়। এই গ্রাহকের টাকা ফেরত গেছে। অতএব অর্ডার ক্যানসেল হয়েছে।” দুটি দেখতে প্রায় একই রকম। প্রথমটি নির্ভরযোগ্য, দ্বিতীয়টি নয়: টাকা ফেরত যাওয়ার অন্য কারণও থাকতে পারে, যেমন ভুল দামে চার্জ। এই পর্বের বিষয় ঠিক এই পার্থক্য।

সংজ্ঞা

Propositional logic-এ একটি argument হলো কয়েকটি proposition-এর একটি তালিকা। শেষটি উপসংহার (conclusion), আগেরগুলো premise (ভিত্তি-বাক্য)। লেখা হয় p1, p2, …, pn ∴ q (∴ পড়া হয় “অতএব”)।

Argument-টি valid, যদি এমন কোনো মান-বসানো না থাকে যেখানে সব premise সত্য অথচ উপসংহার মিথ্যা। সমতুল্যভাবে, (p1 ∧ p2 ∧ … ∧ pn) → q একটি tautology, অর্থাৎ সব সারিতে সত্য। তখন লেখা হয় p1, …, pn ⊨ q; চিহ্ন ⊨-কে বলে entailment (“থেকে নিশ্চিতভাবে আসে”)।

খেয়াল করুন, validity premise-গুলোর সত্যতা নিয়ে কিছু বলে না; বলে শুধু আকার নিয়ে। “সব রিকশা উড়তে পারে; আমার বাহন একটি রিকশা; অতএব আমার বাহন উড়তে পারে” — আকার নিখুঁত, তাই valid, যদিও প্রথম premise মিথ্যা। যে argument valid এবং যার সব premise আসলেই সত্য, তাকে বলে sound argument. শুধু sound argument-এর উপসংহার নিশ্চিতভাবে সত্য।

আকারPremiseউপসংহার সম্পর্কে কী জানি
Validসব সত্য (sound)নিশ্চিতভাবে সত্য
Validঅন্তত একটি মিথ্যাসত্যও হতে পারে, মিথ্যাও
Invalidসব সত্যকিছুই নিশ্চিত নয়; সত্য হলেও ভাগ্যক্রমে
Invalidঅন্তত একটি মিথ্যাকিছুই নিশ্চিত নয়
উপপাদ্য ১.১

p1, …, pn ∴ q valid হয় যদি এবং কেবল যদি (p1 ∧ … ∧ pn) → q একটি tautology হয়।

প্রমাণ: P = p1 ∧ … ∧ pn লিখি।

  1. ∧-এর সংজ্ঞায় একটি সারিতে P সত্য ঠিক তখন, যখন সেই সারিতে প্রতিটি pi সত্য।
  2. →-এর সংজ্ঞায় (পর্ব ০২) P → q একটি সারিতে মিথ্যা ঠিক তখন, যখন সেখানে P সত্য আর q মিথ্যা।
  3. ধাপ ১ আর ২ মিলিয়ে: P → q মিথ্যা এমন সারি আছে ⟺ এমন সারি আছে যেখানে সব premise সত্য অথচ q মিথ্যা।
  4. বাঁ দিকের অস্বীকার “P → q কোনো সারিতে মিথ্যা নয়” মানে tautology; ডান দিকের অস্বীকার মানে valid. সমান দুটি বাক্যের অস্বীকারও সমান। ∎

এই উপপাদ্য থেকেই যাচাইয়ের একটি সরল যান্ত্রিক পদ্ধতি পাওয়া যায়: সব সারি ঘুরে দেখুন, শুধু সেই সারিগুলোতে চোখ রাখুন যেখানে সব premise সত্য (এদের বলে “গুরুত্বপূর্ণ সারি”), আর দেখুন সেখানে উপসংহার সত্য কি না। একটিও ব্যতিক্রম পেলে সেটিই counterexample. Truth table তৈরি পর্ব ০২-এ দেখেছেন; এখানে একই কৌশল নতুন প্রশ্নে খাটাব।

Valid argument যেন ভালো একটি ময়দার কল: ভালো গম দিলে ভালো আটা বের হবেই। পচা গম দিলে কল দায়ী নয়। কল ভালো কি না, সেটি পরীক্ষা করা হয় “ভালো গম দিলে কখনো পচা আটা বেরোয় কি না” দেখে। Invalid argument এমন কল, যেটি ভালো গম পেয়েও কখনো কখনো পচা আটা দেয়; একবার দিলেই কলটি বাতিল।

২ · আটটি অনুমানের নিয়ম — প্রতিটির পেছনে একটি tautology

প্রতিবার ৩২ বা ৬৪ সারির টেবিল বানানো ক্লান্তিকর, আর ২০টি variable-এ অসম্ভব। তাই গণিতবিদরা কয়েকটি ছোট, একবার-যাচাই-করা ছাঁচ রাখেন। প্রতিটি ছাঁচের নাম rule of inference (অনুমানের নিয়ম)। বড় argument-কে এই ছাঁচগুলোর শিকল হিসেবে লিখলে আর টেবিল লাগে না।

নিয়মছাঁচপেছনের tautologyবাজারঘরের উদাহরণ
Modus ponensp, p → q ∴ q(p ∧ (p → q)) → qক্যানসেল হলে ফেরত; ক্যানসেল হয়েছে; ∴ ফেরত
Modus tollens¬q, p → q ∴ ¬p(¬q ∧ (p → q)) → ¬pক্যানসেল হলে ফেরত; ফেরত যায়নি; ∴ ক্যানসেল হয়নি
Hypothetical syllogismp → q, q → r ∴ p → r((p → q) ∧ (q → r)) → (p → r)ঢাকায় হলে আজ ডেলিভারি; আজ হলে SMS; ∴ ঢাকায় হলে SMS
Disjunctive syllogismp ∨ q, ¬p ∴ q((p ∨ q) ∧ ¬p) → qকার্ডে অথবা ক্যাশে; কার্ডে নয়; ∴ ক্যাশে
Additionp ∴ p ∨ qp → (p ∨ q)আজ ডেলিভারি; ∴ আজ অথবা কাল ডেলিভারি
Simplificationp ∧ q ∴ p(p ∧ q) → pপরিশোধিত এবং প্যাকড; ∴ পরিশোধিত
Conjunctionp, q ∴ p ∧ q((p) ∧ (q)) → (p ∧ q)পরিশোধিত; প্যাকড; ∴ দুটোই
Resolutionp ∨ q, ¬p ∨ r ∴ q ∨ r((p ∨ q) ∧ (¬p ∨ r)) → (q ∨ r)কার্ড অথবা ক্যাশ; কার্ড নয় অথবা রসিদ; ∴ ক্যাশ অথবা রসিদ

Modus ponens (লাতিনে মোটামুটি “স্থাপন করে”) আর modus tollens (“সরিয়ে দিয়ে”) নাম দুটি মধ্যযুগীয় লাতিন যুক্তিশাস্ত্র থেকে এসেছে। Syllogism মানে দুটি premise থেকে একটি উপসংহার টানার ছাঁচ; hypothetical কারণ premise দুটি “যদি… তবে”, disjunctive কারণ একটি premise “অথবা”।

এই ছাঁচগুলোর অনেকগুলো লিখিতভাবে খ্রিস্টপূর্ব তৃতীয় শতকের Stoic দার্শনিক Chrysippus-এর নামে প্রচলিত পাঁচটি “indemonstrable” (প্রমাণ লাগে না এমন মৌলিক) ছাঁচের মধ্যে পাওয়া যায়, ইতিহাসবিদদের পুনর্গঠন অনুযায়ী: প্রথমটি modus ponens, দ্বিতীয়টি modus tollens, আর পঞ্চমটি disjunctive syllogism-এর মতো। Aristotle-এর syllogism ছিল “সব A হলো B” ধরনের বাক্য নিয়ে, যা আজকের predicate logic-এর কাছাকাছি; Stoic-দের ছাঁচ ছিল পুরো বাক্য নিয়ে, যা propositional logic-এর পূর্বসূরি।

দুটি নিয়মের প্রমাণ

উপপাদ্য ২.১

(ক) Modus tollens valid: ¬q, p → q ⊨ ¬p. (খ) Resolution valid: p ∨ q, ¬p ∨ r ⊨ q ∨ r.

(ক)-এর প্রমাণ (সরাসরি, সারি ধরে):

  1. ধরি কোনো সারিতে দুটি premise সত্য: ¬q সত্য, অর্থাৎ q = F; আর p → q সত্য।
  2. p = T হলে p → q হতো T → F = F, যা ধাপ ১-এর বিরোধী। তাই p = T হতে পারে না।
  3. অতএব p = F, অর্থাৎ ¬p সত্য। সব premise সত্য এমন প্রতিটি সারিতে উপসংহার সত্য, তাই argument valid. ∎

বিকল্প পথ: p → q-এর contrapositive ¬q → ¬p (পর্ব ০২-এর উপপাদ্য ৩.১), তারপর ¬q-এর সঙ্গে modus ponens. অর্থাৎ modus tollens হলো contrapositive-এ modus ponens.

(খ)-এর প্রমাণ (p-এর মান ধরে দুই ক্ষেত্র):

  1. ধরি কোনো সারিতে p ∨ q আর ¬p ∨ r দুটোই সত্য। p-এর মান T অথবা F, তৃতীয় কিছু নয়।
  2. ক্ষেত্র p = T: তখন ¬p = F, তাই ¬p ∨ r সত্য রাখতে r = T লাগবে। ফলে q ∨ r সত্য।
  3. ক্ষেত্র p = F: তখন p ∨ q সত্য রাখতে q = T লাগবে। ফলে q ∨ r সত্য।
  4. দুই ক্ষেত্রেই উপসংহার সত্য, আর ক্ষেত্র দুটি সব সম্ভাবনা ঢাকে। ∎

Resolution-এর বিশেষ রূপ দেখুন: r-এর জায়গায় “কিছুই না” (সবসময় মিথ্যা, F) বসালে ¬p ∨ F মানে ¬p, আর উপসংহার q ∨ F মানে q: এটিই disjunctive syllogism. আর p → q-কে ¬p ∨ q লিখলে modus ponens-ও resolution-এর একটি রূপ। এই কারণেই পরে দেখবেন, যন্ত্রে প্রমাণের জন্য শুধু resolution রাখলেই চলে।

প্রতিটি নিয়ম হাতে প্রমাণ করা যায়, কিন্তু কম্পিউটারে সব সারি ঘুরে এক নিমেষে যাচাইও করা যায়। নিচের ব্লক উপপাদ্য ১.১-এর পদ্ধতিটিই চালায়: যে সারিতে সব premise সত্য অথচ উপসংহার মিথ্যা, তা খোঁজে। প্রথমবার চালালে ব্রাউজারে Python (Pyodide) নামতে কয়েক সেকেন্ড লাগে।

from itertools import product

def check(name, names, premises, goal):
    # valid মানে: যে সারিতে সব premise সত্য, সেখানে goal-ও সত্য
    bad = []
    for row in product([True, False], repeat=len(names)):
        v = dict(zip(names, row))
        if all(f(v) for f in premises) and not goal(v):
            bad.append(" ".join(f"{n}={'T' if v[n] else 'F'}" for n in names))
    print(f"{name:23}", "VALID" if not bad else "INVALID, e.g. " + bad[0])

imp = lambda a, b: (not a) or b
p, q, r = (lambda v: v["p"]), (lambda v: v["q"]), (lambda v: v["r"])
nt = lambda f: (lambda v: not f(v))
IF = lambda f, g: (lambda v: imp(f(v), g(v)))
OR = lambda f, g: (lambda v: f(v) or g(v))
AND = lambda f, g: (lambda v: f(v) and g(v))

check("modus ponens", "pq", [p, IF(p, q)], q)
check("modus tollens", "pq", [nt(q), IF(p, q)], nt(p))
check("hypothetical syllogism", "pqr", [IF(p, q), IF(q, r)], IF(p, r))
check("disjunctive syllogism", "pq", [OR(p, q), nt(p)], q)
check("addition", "pq", [p], OR(p, q))
check("simplification", "pq", [AND(p, q)], p)
check("conjunction", "pq", [p, q], AND(p, q))
check("resolution", "pqr", [OR(p, q), OR(nt(p), r)], OR(q, r))
print("--- দেখতে একই রকম, কিন্তু ---")
check("affirming consequent", "pq", [IF(p, q), q], p)
check("denying antecedent", "pq", [IF(p, q), nt(p)], nt(q))
check("p or q, p  =>  not q", "pq", [OR(p, q), p], nt(q))

আসল আউটপুট (ব্রাউজারের Python):

modus ponens            VALID
modus tollens           VALID
hypothetical syllogism  VALID
disjunctive syllogism   VALID
addition                VALID
simplification          VALID
conjunction             VALID
resolution              VALID
--- দেখতে একই রকম, কিন্তু ---
affirming consequent    INVALID, e.g. p=F q=T
denying antecedent      INVALID, e.g. p=F q=T
p or q, p  =>  not q    INVALID, e.g. p=T q=T

আটটি নিয়মই প্রতিটি সারিতে টিকে গেল: কোনো সারিতে premise সব সত্য অথচ উপসংহার মিথ্যা নেই। শেষ তিনটি দেখতে নিয়মের মতো, কিন্তু প্রতিটির জন্য প্রোগ্রাম একটি counterexample সারি ছেপেছে। শেষটি মজার: “কার্ডে অথবা ক্যাশে দিয়েছেন; কার্ডে দিয়েছেন; অতএব ক্যাশে দেননি” ভুল, কারণ ∨ inclusive; দুটোতেই ভাগ করে দেওয়া সম্ভব (p = T, q = T). ⊕ (exclusive or) হলে argument-টি valid হতো। এখানে প্রতিটি premise একটি ছোট function, যা একটি সারি নিয়ে True বা False ফেরত দেয়।

৩ · Fallacy — যে যুক্তি দেখতে ঠিক, কিন্তু ভুল

Fallacy মানে এমন যুক্তির ধরন, যা বিশ্বাসযোগ্য শোনায় কিন্তু valid নয়। গণিতে আর প্রোগ্রামের যুক্তিতে তিনটি সবচেয়ে বেশি দেখা যায়।

  • Affirming the consequent (ফলকে সত্য ধরে শর্তে ফেরা): p → q, q ∴ p. এটি আসলে converse q → p-কে মূল বাক্যের সমান ধরা।
  • Denying the antecedent (শর্তকে মিথ্যা ধরে ফলকেও মিথ্যা বলা): p → q, ¬p ∴ ¬q. এটি inverse ¬p → ¬q-কে মূল বাক্যের সমান ধরা।
  • Begging the question বা circular reasoning (চক্রাকার যুক্তি): যা প্রমাণ করার কথা, সেটিকেই কোনো premise-এ (প্রায়ই অন্য ভাষায়) ধরে নেওয়া। “বাজারঘরের রিভিউ বিশ্বাসযোগ্য, কারণ বাজারঘর কখনো ভুয়া রিভিউ রাখে না” — দ্বিতীয় অংশটিই প্রথম অংশের দাবি।

Circular reasoning-এর একটি মজার বৈশিষ্ট্য: আকারের দিক থেকে এটি প্রায়ই valid (p ∴ p সবসময় valid!)। সমস্যা হলো এটি কিছুই প্রমাণ করে না, কারণ উপসংহারটি premise-এ আগেই বসানো। তাই এটি truth table দিয়ে ধরা যায় না; ধরতে হয় প্রশ্ন করে: “এই premise-টি কি আমার উপসংহার না মেনেই বিশ্বাস করা যায়?”

প্রথম দুটি fallacy truth table দিয়েই ধরা যায়। বাজারঘরের নিরাপত্তা দলের একটি সতর্কবার্তা: “পাসওয়ার্ড ফাঁস হলে অচেনা ডিভাইস থেকে লগইন দেখা যায়। এই অ্যাকাউন্টে অচেনা লগইন দেখা গেছে। অতএব পাসওয়ার্ড ফাঁস হয়েছে।” Argument-টি valid কি না, সারি ধরে দেখুন:

1premise 1: p → q2premise 2: q3∴ p
এই সারি
p q
p → q
q
উপসংহার p
অবস্থা
  1. অনুবাদ। p = “পাসওয়ার্ড ফাঁস হয়েছে”, q = “অচেনা ডিভাইস থেকে লগইন দেখা গেছে”। Premise: p → q আর q; উপসংহার: p. চারটি সারি আছে; খুঁজছি এমন সারি, যেখানে দুই premise সত্য অথচ p মিথ্যা।
  2. সারি T T. p → q = T → T = T, q = T: দুই premise সত্য, তাই এটি গুরুত্বপূর্ণ সারি। উপসংহার p = T. এই সারিতে কোনো সমস্যা নেই।
  3. সারি T F. p → q = T → F = F. একটি premise মিথ্যা, তাই এই সারি validity-র বিচারে আসে না।
  4. সারি F T. p → q = F → T = T (ফাঁকা সত্য), q = T: দুই premise সত্য। কিন্তু উপসংহার p = F. এই সারিই counterexample: গ্রাহক নিজেই নতুন ফোন থেকে লগইন করেছেন, পাসওয়ার্ড ফাঁস হয়নি।
  5. সারি F F. q = F, তাই premise ২ মিথ্যা; এই সারিও বিচারে আসে না।
  6. রায়: INVALID. সারি F T-তে সব premise সত্য, উপসংহার মিথ্যা। একটি এমন সারিই যথেষ্ট। সঠিক সিদ্ধান্ত হতো দুর্বলতর: “পাসওয়ার্ড ফাঁস হয়ে থাকতে পারে, তদন্ত দরকার।” আর “অচেনা লগইন দেখা যায়নি, তাই পাসওয়ার্ড ফাঁস হয়নি” বললে সেটি modus tollens, যা valid (যদি premise ১ সত্যিই সত্য হয়)।

Affirming the consequent প্রোগ্রাম ডিবাগিংয়েও ঘটে: “বাগটি থাকলে টেস্ট ফেল করে; টেস্ট ফেল করেছে; তাই বাগটিই কারণ।” টেস্ট অন্য কারণেও ফেল করতে পারে (নেটওয়ার্ক, ভুল টেস্ট ডেটা)। উল্টো দিকে, “টেস্ট পাস করেছে, তাই বাগ নেই” হলো denying the antecedent-এর আত্মীয়, কারণ “বাগ থাকলে টেস্ট ফেল করে” প্রায়ই সব বাগের জন্য সত্য নয়। টেস্ট বাগের উপস্থিতি দেখাতে পারে, অনুপস্থিতি প্রমাণ করে না।

৪ · Formal proof — প্রতিটি লাইনের কারণসহ

একটি formal proof হলো বাক্যের একটি ক্রমিক তালিকা, যার প্রতিটি লাইন হয় একটি premise, নয়তো আগের কোনো লাইন থেকে একটি অনুমানের নিয়ম খাটিয়ে পাওয়া; শেষ লাইনটি উপসংহার। প্রতিটি লাইনের পাশে কারণ লেখা থাকে: কোন নিয়ম, কোন কোন লাইন থেকে। ফলে যে কেউ, এমনকি একটি প্রোগ্রামও, প্রতিটি লাইন আলাদা করে যাচাই করতে পারে।

বাজারঘরের অপারেশন দলের আজকের পরিস্থিতি:

  • H1: “আজ মিরপুরের গুদাম খোলা নেই, এবং ঈদের ভিড় চলছে।” → ¬g ∧ e
  • H2: “মিরপুর থেকে পাঠানো হবে শুধু যদি মিরপুরের গুদাম খোলা থাকে।” → m → g (“শুধু যদি”-র দিক পর্ব ০২-এ দেখেছেন)
  • H3: “মিরপুর থেকে পাঠানো না হলে উত্তরা থেকে পাঠানো হবে।” → ¬m → u
  • উপসংহার: “আজ উত্তরা থেকে পাঠানো হবে।” → u

চার variable-এ টেবিল হলে ১৬ সারি লাগত। নিয়মের শিকলে মাত্র ছয় লাইন। Stepper-এ নামগুলো সংক্ষেপে: simpl. = simplification, MT = modus tollens, MP = modus ponens. “পরে” চাপুন:

1¬g ∧ e  premise2¬g      simpl. 13m → g   premise4¬m      MT 2, 35¬m → u  premise6u       MP 4, 5
এই লাইন
লাইন
কারণ
ছাঁচ
জানা নতুন বাক্য
  1. লাইন ১: premise H1. ¬g ∧ e সরাসরি দেওয়া আছে। এতে দুটি তথ্য জোড়া; আমাদের দরকার শুধু প্রথমটি।
  2. লাইন ২: simplification. ছাঁচ A ∧ B ∴ A, যেখানে A = ¬g, B = e. লাইন ১ থেকে ¬g পেলাম: “গুদাম খোলা নেই”। ঈদের ভিড় (e) এই প্রমাণে আর লাগবে না।
  3. লাইন ৩: premise H2. m → g: মিরপুর থেকে পাঠাতে হলে গুদাম খোলা থাকা প্রয়োজন।
  4. লাইন ৪: modus tollens. ছাঁচ ¬B, A → B ∴ ¬A, যেখানে A = m, B = g. লাইন ২ (¬g) আর লাইন ৩ (m → g) থেকে ¬m: মিরপুর থেকে পাঠানো হবে না।
  5. লাইন ৫: premise H3. ¬m → u. খেয়াল করুন, এর শর্ত ¬m, যা আমরা লাইন ৪-এ পেয়ে গেছি।
  6. লাইন ৬: modus ponens. ছাঁচ A, A → B ∴ B, যেখানে A = ¬m, B = u. লাইন ৪ আর ৫ থেকে u: উত্তরা থেকে পাঠানো হবে। শেষ লাইনটিই উপসংহার।
  7. পুরো প্রমাণ। ছয় লাইন, তিনটি premise, তিনটি নিয়ম। প্রতিটি নিয়ম valid, আর valid ধাপের শিকলও valid (কারণ “সব premise সত্য” এমন প্রতিটি সারিতে প্রতিটি নতুন লাইনও সত্য থাকে)। তাই H1, H2, H3 ⊨ u. ∎

নিচের ছবিতে একই প্রমাণকে নির্ভরতার জালে দেখানো হয়েছে: কোন লাইন কোন লাইনের ওপর দাঁড়িয়ে। প্রমাণ পড়ার সময় এই জালটি মাথায় রাখলে বোঝা যায় কোন premise আসলে লাগেনি (এখানে H1-এর e অংশটি)।

প্রমাণের নির্ভরতার জাল

Premises (blue) → derived lines (green) → conclusion (amber)

Dependency graph of the six-line proof ১ · ¬g ∧ e ৩ · m → g ৫ · ¬m → u ২ · ¬g ৪ · ¬m ৬ · u simplification modus tollens modus ponens premise
ছবি ৪.১ — প্রতিটি তীর একটি নিয়মের ব্যবহার। নিচের কমলা বাক্সে পৌঁছানোর প্রতিটি পথ শেষ পর্যন্ত ওপরের নীল premise-এ গিয়ে থামে; কোনো লাইন “হাওয়া থেকে” আসেনি।

প্রমাণের প্রতিটি লাইন ঠিক কি না, যন্ত্রও যাচাই করতে পারে: প্রতিটি লাইন যে লাইনগুলোর উল্লেখ করেছে, সেগুলো সত্য এমন প্রতিটি সারিতে লাইনটি সত্য কি না দেখলেই হয়। নিচের ব্লকে ইচ্ছা করে একটি সপ্তম লাইন যোগ করা হয়েছে, যার বাক্যটি সত্য, কিন্তু কারণটি ভুল:

from itertools import product

imp = lambda a, b: (not a) or b
# g = মিরপুরের গুদাম খোলা, e = ঈদের ভিড়,
# m = মিরপুর থেকে পাঠানো, u = উত্তরা থেকে পাঠানো
proof = [
    ("¬g ∧ e",  lambda g, e, m, u: (not g) and e, "premise", []),
    ("¬g",      lambda g, e, m, u: not g,         "simplification", [1]),
    ("m → g",   lambda g, e, m, u: imp(m, g),     "premise", []),
    ("¬m",      lambda g, e, m, u: not m,         "modus tollens", [2, 3]),
    ("¬m → u",  lambda g, e, m, u: imp(not m, u), "premise", []),
    ("u",       lambda g, e, m, u: u,             "modus ponens", [4, 5]),
    ("¬m",      lambda g, e, m, u: not m,         "from 5 and 6 ?", [5, 6]),
]

def follows(i, refs):
    # উল্লেখ করা লাইনগুলো সত্য এমন প্রতিটি সারিতে লাইন i কি সত্য?
    for row in product([True, False], repeat=4):
        if all(proof[j - 1][1](*row) for j in refs) and not proof[i][1](*row):
            return False
    return True

for i, (text, f, why, refs) in enumerate(proof):
    if why == "premise":
        verdict = "given"
    else:
        verdict = "ok" if follows(i, refs) else "NOT JUSTIFIED"
    cite = ",".join(map(str, refs))
    print(f"{i + 1}. {text:8} {why:16} {cite:4} {verdict}")

আসল আউটপুট (ব্রাউজারের Python):

1. ¬g ∧ e   premise               given
2. ¬g       simplification   1    ok
3. m → g    premise               given
4. ¬m       modus tollens    2,3  ok
5. ¬m → u   premise               given
6. u        modus ponens     4,5  ok
7. ¬m       from 5 and 6 ?   5,6  NOT JUSTIFIED

প্রথম ছয় লাইন stepper-এর প্রমাণ মেলায়। সপ্তম লাইনের বাক্য ¬m আসলে সত্য (লাইন ৪-এ এটি ঠিকভাবেই প্রমাণিত)। কিন্তু লাইন ৫ (¬m → u) আর ৬ (u) থেকে ¬m টানা হলো affirming the consequent: সারি m = T, u = T-তে দুটি উল্লেখিত লাইন সত্য অথচ ¬m মিথ্যা। শিক্ষাটি গুরুত্বপূর্ণ: প্রমাণে শুধু সত্য বাক্য থাকলেই হয় না, প্রতিটি লাইনের কারণও সঠিক হতে হয়। প্রমাণ-যাচাইকারী সফটওয়্যার (proof assistant) ঠিক এভাবেই প্রতিটি ধাপ আলাদা করে পরীক্ষা করে।

প্রমাণ লেখার কয়েকটি কৌশল

  • উপসংহার থেকে উল্টো ভাবুন: u চাই; কোন premise-এ u আছে? ¬m → u. তাহলে ¬m চাই; সেটি কোথা থেকে? m → g আর ¬g থেকে। এভাবে পেছনে হেঁটে তারপর সামনে লিখুন।
  • যৌগিক premise ভাঙুন: ∧ দেখলে simplification দিয়ে টুকরো করুন।
  • দরকারে সমতুল্য রূপ ব্যবহার করুন: p → q-এর জায়গায় ¬p ∨ q বা contrapositive; এগুলো logical equivalence-এর নিয়ম, যা পর্ব ০৩ “Logical equivalence — De Morgan, normal form আর satisfiability”-এ বিস্তারিত।

৫ · Quantifier-ওয়ালা বাক্যে অনুমান — instantiation আর generalization

“বাজারঘরের প্রতিটি প্রিমিয়াম সদস্য ফ্রি ডেলিভারি পান। রিনা প্রিমিয়াম সদস্য। অতএব রিনা ফ্রি ডেলিভারি পান।” এটি propositional logic-এ লেখা যায় না, কারণ “প্রতিটি” লাগে; লাগে পর্ব ০৪ “Predicate logic আর quantifier”-এর ∀ (সব) আর ∃ (অন্তত একটি)। এদের জন্য চারটি অতিরিক্ত নিয়ম আছে:

নিয়মছাঁচশর্ত
Universal instantiation (UI)∀x P(x) ∴ P(c)c domain-এর যেকোনো উপাদান
Universal generalization (UG)P(c), যেকোনো c-র জন্য ∴ ∀x P(x)c একটি ইচ্ছামতো উপাদান: c সম্পর্কে বিশেষ কিছু ধরে নেওয়া যাবে না
Existential instantiation (EI)∃x P(x) ∴ P(c)c একটি নতুন নাম, প্রমাণে আগে কোথাও ব্যবহার হয়নি
Existential generalization (EG)P(c) ∴ ∃x P(x)c domain-এর কোনো একটি উপাদান

রিনার উদাহরণে UI আর modus ponens একসঙ্গে খাটে। M(x) = “x প্রিমিয়াম সদস্য”, F(x) = “x ফ্রি ডেলিভারি পান” ধরলে: ∀x (M(x) → F(x)) থেকে UI দিয়ে M(রিনা) → F(রিনা); তারপর M(রিনা)-র সঙ্গে modus ponens দিয়ে F(রিনা)। এই দুই ধাপের জোড়াকে বলে universal modus ponens.

এবার একটু বড় উদাহরণ। Domain = বাজারঘরের সব অর্ডার। W(x) = “x এই সপ্তাহের অর্ডার”, K(x) = “x-এ কুপন লেগেছে”, D(x) = “x ডেলিভারি হয়েছে”।

  • Premise ১: এই সপ্তাহের কোনো এক অর্ডারে কুপন লাগেনি: ∃x (W(x) ∧ ¬K(x))
  • Premise ২: এই সপ্তাহের প্রতিটি অর্ডার ডেলিভারি হয়েছে: ∀x (W(x) → D(x))
  • উপসংহার: ডেলিভারি হয়েছে এমন কোনো অর্ডারে কুপন লাগেনি: ∃x (D(x) ∧ ¬K(x))

প্রমাণ:

  1. ∃x (W(x) ∧ ¬K(x)) — premise ১
  2. W(a) ∧ ¬K(a) — EI (১), যেখানে a একটি নতুন নাম: “সেই অর্ডারটির নাম দিলাম a”
  3. W(a) — simplification (২)
  4. ∀x (W(x) → D(x)) — premise ২
  5. W(a) → D(a) — UI (৪); a domain-এর একটি উপাদান, তাই বসানো চলে
  6. D(a) — modus ponens (৩, ৫)
  7. ¬K(a) — simplification (২)
  8. D(a) ∧ ¬K(a) — conjunction (৬, ৭)
  9. ∃x (D(x) ∧ ¬K(x)) — EG (৮) ∎

লাইনের ক্রম লক্ষ করুন: EI আগে, UI পরে। উল্টো করলে, অর্থাৎ আগে UI দিয়ে কোনো c বসিয়ে পরে EI-তে সেই একই c ব্যবহার করলে, “নতুন নাম” শর্ত ভাঙত। ∃ শুধু বলে “কেউ একজন আছে”, সে কে তা নয়; তাই তাকে আগে থেকে পরিচিত কারও সঙ্গে মিলিয়ে ফেলা যায় না।

EI-এর সবচেয়ে সাধারণ ভুল: ∃x P(x) আর ∃x Q(x) থেকে দুবারই একই নাম c বসিয়ে P(c) ∧ Q(c), তারপর ∃x (P(x) ∧ Q(x)) টানা। “কোনো একটি অর্ডার কার্ডে পরিশোধিত, আর কোনো একটি অর্ডার ক্যাশে” থেকে “কোনো একটি অর্ডার কার্ডে এবং ক্যাশে” আসে না। দ্বিতীয় EI-তে নতুন নাম d লাগত, আর তখন P(c) ∧ Q(d) থেকে কিছুই জোড়া যায় না। একইভাবে UG-তে c-কে সত্যিই ইচ্ছামতো হতে হয়: “a-তে কুপন লাগেনি” থেকে “কোনো অর্ডারেই কুপন লাগেনি” টানা যায় না, কারণ a একটি বিশেষ অর্ডার।

Quantifier-ওয়ালা argument-এ truth table চলে না, কারণ domain যেকোনো আকারের, এমনকি অসীম হতে পারে। তবে ছোট domain-এ সব সম্ভাব্য অর্থ ঘুরে counterexample খোঁজা যায়। নিচের ব্লক domain-এর আকার ১, ২ আর ৩ নিয়ে প্রতিটি predicate-এর সব সম্ভাব্য অর্থ পরীক্ষা করে:

from itertools import product

def test(name, k, premises, goal, max_n=3):
    # ছোট সব domain {0..n-1}, আর k-টি predicate-এর সব সম্ভাব্য অর্থ
    checked = 0
    for n in range(1, max_n + 1):
        U = range(n)
        for preds in product(product([True, False], repeat=n), repeat=k):
            checked += 1
            if all(f(U, *preds) for f in premises) and not goal(U, *preds):
                shown = ["".join("T" if b else "F" for b in P) for P in preds]
                print(f"{name}: FAILS at n={n}, predicates {shown}")
                return
    print(f"{name}: no counterexample in {checked} small models")

# W = এই সপ্তাহের অর্ডার, K = কুপন লেগেছে, D = ডেলিভারি হয়েছে
test("coupon argument", 3,
     [lambda U, W, K, D: any(W[x] and not K[x] for x in U),
      lambda U, W, K, D: all((not W[x]) or D[x] for x in U)],
     lambda U, W, K, D: any(D[x] and not K[x] for x in U))

# P = কার্ডে পরিশোধ, Q = ক্যাশে পরিশোধ
test("same-c argument", 2,
     [lambda U, P, Q: any(P[x] for x in U),
      lambda U, P, Q: any(Q[x] for x in U)],
     lambda U, P, Q: any(P[x] and Q[x] for x in U))

আসল আউটপুট (ব্রাউজারের Python):

coupon argument: no counterexample in 584 small models
same-c argument: FAILS at n=2, predicates ['TF', 'FT']

কুপনের argument-এ n = 1, 2, 3-এ মোট 23 + 43 + 83 = 8 + 64 + 512 = 584টি অর্থ পরীক্ষা হয়েছে, কোনো counterexample নেই। এটি প্রমাণ নয় (বড় domain বাকি); প্রমাণ উপরের নয় লাইন। কিন্তু ভুল EI-এর argument-টি n = 2-এই ভেঙে পড়ল: অর্ডার ০ শুধু কার্ডে (P = TF), অর্ডার ১ শুধু ক্যাশে (Q = FT). দুটি premise সত্য, কিন্তু কার্ড আর ক্যাশ দুটোই এমন কোনো অর্ডার নেই। এখানে any হলো ∃, আর all হলো ∀, ছোট domain-এর ওপর।

৬ · Resolution আর refutation — একটিমাত্র নিয়মে প্রমাণ

মানুষ প্রমাণ লেখার সময় আট-দশটি নিয়ম থেকে বেছে নেয়। কম্পিউটারের জন্য এত পছন্দ ঝামেলার: কোন ধাপে কোন নিয়ম? Resolution-এর আকর্ষণ হলো এটি একাই যথেষ্ট, যদি সব বাক্য একটি নির্দিষ্ট আকারে লেখা থাকে।

সংজ্ঞা

একটি literal হলো একটি variable বা তার negation (p বা ¬p). একটি clause হলো কয়েকটি literal-এর ∨, যেমন ¬p ∨ r; একে সেট হিসেবে {¬p, r} লেখা হয়। কোনো literal নেই এমন clause-কে বলে empty clause, চিহ্ন □; এটি কখনো সত্য হয় না (কোনো literal-ই নেই যে সত্য হবে)। কয়েকটি clause-এর ∧-কে বলে CNF (conjunctive normal form). যেকোনো propositional সূত্রকে সমতুল্য CNF-এ আনা যায়; পদ্ধতি পর্ব ০৩-এ।

Resolution নিয়ম: একটি clause-এ literal L আর আরেকটিতে ¬L থাকলে, দুটিকে জুড়ে L আর ¬L বাদ দিয়ে নতুন clause (resolvent) পাওয়া যায়: {L} ∪ A আর {¬L} ∪ B থেকে A ∪ B.

উপপাদ্য ২.১(খ)-এর প্রমাণ এখানেও হুবহু খাটে (q আর r-এর জায়গায় A আর B-এর ∨), তাই resolution sound: যা বের করে, তা সত্যিই premise থেকে আসে।

এখন প্রমাণ কীভাবে? চালাকিটির নাম resolution refutation, বিরোধ খুঁজে প্রমাণ:

  1. KB (জানা বাক্যের সংগ্রহ, knowledge base) ⊨ α প্রমাণ করতে চাই।
  2. KB-র সঙ্গে ¬α যোগ করি, সব CNF-এ আনি।
  3. বারবার resolution চালাই। □ পেলে KB ∧ ¬α একসঙ্গে অসম্ভব (unsatisfiable).
  4. KB সত্য অথচ α মিথ্যা এমন কোনো সারি তাই নেই; অর্থাৎ KB ⊨ α. এটি proof by contradiction-এর যান্ত্রিক রূপ (পর্ব ০৮-এ বিস্তারিত)।

বাজারঘরের নিয়ম: p = “অর্ডার কার্ডে পরিশোধিত”, q = “অর্ডার ক্যাশ অন ডেলিভারিতে”, r = “গ্রাহককে রসিদ পাঠানো হয়”। জানা: প্রতিটি অর্ডার কার্ডে অথবা ক্যাশে (p ∨ q); কার্ডে হলে রসিদ যায় (p → r ≡ ¬p ∨ r); ক্যাশে হলে রসিদ যায় (q → r ≡ ¬q ∨ r). প্রমাণ করতে চাই: রসিদ সবসময় যায় (r).

1C1 {p, q}       KB2C2 {¬p, r}      KB3C3 {¬q, r}      KB4C4 {¬r}         ¬লক্ষ্য5C5 {q, r}       C1 + C26C6 {r}          C5 + C37C7 □            C6 + C4
এই ধাপ
clause সংখ্যা
কাটা literal
নতুন clause
  1. KB-কে clause-এ। p ∨ q → C1 = {p, q}. p → r ≡ ¬p ∨ r → C2 = {¬p, r}. q → r ≡ ¬q ∨ r → C3 = {¬q, r}. সব clause একসঙ্গে সত্য ধরা হচ্ছে (∧)।
  2. লক্ষ্যের negation যোগ। লক্ষ্য r, তাই ¬r যোগ করি: C4 = {¬r}. এখন দেখাতে চাই, C1 থেকে C4 একসঙ্গে সত্য হতে পারে না।
  3. C1 আর C2, literal p দিয়ে। C1-এ p, C2-এ ¬p. দুটি বাদ দিয়ে বাকিগুলো জুড়ি: {q} ∪ {r} = C5 = {q, r}. মানে “ক্যাশে অথবা রসিদ”।
  4. C5 আর C3, literal q দিয়ে। C5-এ q, C3-এ ¬q. বাকি {r} ∪ {r} = {r}; সেটে একই literal দুবার থাকে না। C6 = {r}.
  5. C6 আর C4, literal r দিয়ে। C6 = {r}, C4 = {¬r}. দুটি বাদ দিলে কিছুই থাকে না: C7 = □, empty clause. □ কোনো সারিতে সত্য নয়, আর এটি premise থেকে sound নিয়মে এসেছে।
  6. সিদ্ধান্ত। KB ∧ ¬r থেকে □ এলো, তাই KB ∧ ¬r unsatisfiable, অর্থাৎ KB ⊨ r: প্রতিটি অর্ডারে রসিদ যায়। এটি আসলে “proof by cases” (কার্ড অথবা ক্যাশ, দুই ক্ষেত্রেই রসিদ), শুধু resolution-এর যান্ত্রিক ভাষায়। ∎

এই কাজটিই একটি ছোট প্রোগ্রাম করতে পারে: সব জোড়া clause-এ resolution চালাতে থাকে, নতুন কিছু না এলে থামে। □ পেলে প্রমাণ কোন পথে এলো, তা পেছনে হেঁটে ছাপে।

from itertools import combinations
neg = lambda L: L[1:] if L[0] == "~" else "~" + L
show = lambda c: "{" + ", ".join(c).replace("~", "¬") + "}" if c else "□"
key = lambda x: (x.lstrip("~"), x)

def resolvents(a, b):
    for L in a:
        c = tuple(sorted(set(a) - {L} | set(b) - {neg(L)}, key=key))
        if neg(L) in b and not any(neg(x) in c for x in c):  # tautology বাদ
            yield c

def refute(clauses):
    known = [tuple(sorted(c, key=key)) for c in clauses]
    parent = dict.fromkeys(known)
    while True:
        new = []
        for a, b in combinations(known, 2):
            for c in resolvents(a, b):
                if c in parent: continue
                parent[c] = (a, b); new.append(c)
                if c == (): return parent, len(parent)
        if not new: return None, len(parent)
        known += new

def explain(c, parent):
    if parent[c]:
        a, b = parent[c]; explain(a, parent); explain(b, parent)
        print(f"  {show(a)} + {show(b)}  ->  {show(c)}")

# p কার্ডে পরিশোধ, q ক্যাশ অন ডেলিভারি, r রসিদ, s এসএমএস
KB = [["p", "q"], ["~p", "r"], ["~q", "r"]]
for goal in ["r", "s"]:
    parent, n = refute(KB + [[neg(goal)]])
    print(f"goal {goal}: {n} clauses seen,", "PROVED" if parent else "not provable")
    if parent: explain((), parent)

আসল আউটপুট (ব্রাউজারের Python):

goal r: 12 clauses seen, PROVED
  {p, q} + {¬q, r}  ->  {p, r}
  {¬p, r} + {p, r}  ->  {r}
  {¬r} + {r}  ->  □
goal s: 7 clauses seen, not provable

প্রোগ্রাম □ পেয়েছে, কিন্তু stepper-এর পথে নয়: আগে q দিয়ে জুড়ে {p, r}, তারপর p দিয়ে {r}. Resolution প্রমাণ অনন্য নয়; যেকোনো একটি পথ □-এ পৌঁছালেই চলে। প্রোগ্রাম সব জোড়া পরীক্ষা করে বলে অপ্রয়োজনীয় clause-ও বানিয়েছে (মোট ১২টি দেখা হয়েছে, প্রমাণে লেগেছে ৩টি ধাপ)। দ্বিতীয় লক্ষ্য s (“এসএমএস যায়”) KB-তে কোথাও নেই; ৭টি clause-এ থেমে গেছে, নতুন কিছু আসে না, □-ও আসেনি। Propositional ক্ষেত্রে এই থেমে যাওয়া নিশ্চিত (সম্ভাব্য clause সসীম), আর □ না আসা মানে KB ⊭ s: KB সত্য রেখে s মিথ্যা করা যায়। tautology বাদ লাইনটি {p, ¬p, …} জাতীয় সবসময়-সত্য clause ফেলে দেয়; এগুলো কোনো কাজে আসে না।

এক ধাপে একটিই literal কাটুন। {p, q} আর {¬p, ¬q} থেকে দুটি জোড়া একসঙ্গে কেটে □ টানা ভুল। p দিয়ে কাটলে {q, ¬q}, q দিয়ে কাটলে {p, ¬p}: দুটোই tautology, কোনো তথ্য নেই। আসলে দুই clause একসঙ্গে সত্য হতে পারে (p = T, q = F), তাই □ পাওয়ার কথাই নয়।

৭ · Soundness আর completeness — নিয়মের সেট কতটা ভালো

দুটি আলাদা ধারণা গুলিয়ে ফেলা খুব সাধারণ: “⊨” (সত্যের দিক থেকে আসে, truth table দিয়ে সংজ্ঞায়িত) আর “⊢” (নিয়ম খাটিয়ে বের করা যায়)। একটি নিয়মের সেটকে দুই প্রশ্নে বিচার করা হয়:

Soundness

⊢ হলে ⊨. নিয়ম দিয়ে যা বের হয়, তা সত্যিই premise থেকে আসে। ভুল কিছু প্রমাণ হয় না।

Completeness

⊨ হলে ⊢. যা সত্যিই আসে, তার প্রতিটির জন্য নিয়ম দিয়ে একটি প্রমাণ আছে। কিছু বাদ পড়ে না।

Soundness প্রমাণ সহজ, আর এই পর্বে আসলে করেই ফেলেছেন: প্রতিটি নিয়ম valid (উপপাদ্য ২.১ আর Python যাচাই), আর valid ধাপের শিকলও valid. Completeness অনেক গভীর। এই পর্বের আটটি নিয়ম একসঙ্গে কোনো পূর্ণাঙ্গ ব্যবস্থা নয়; যেমন “p → q” ধরনের উপসংহার সরাসরি প্রমাণ করতে “ধরে নিয়ে দেখানো” (conditional proof) জাতীয় কৌশল লাগে। পাঠ্যবইয়ের পূর্ণ ব্যবস্থাগুলো (যেমন natural deduction) propositional logic-এ sound আর complete বলে প্রমাণিত।

Resolution-এর ক্ষেত্রটি সূক্ষ্ম। এটি sound, কিন্তু সাধারণ অর্থে complete নয়: p থেকে p ∨ q valid (addition), অথচ শুধু {p} clause থেকে resolution দিয়ে {p, q} বানানো যায় না, কারণ কাটার মতো কোনো জোড়াই নেই। তবে এটি refutation-complete: clause-এর একটি সেট unsatisfiable হলে resolution দিয়ে □ পাওয়া যাবেই। আর KB ⊨ α প্রশ্নকে আমরা সবসময় “KB ∧ ¬α unsatisfiable কি না” প্রশ্নে বদলাই, তাই refutation-completeness-ই যথেষ্ট। এই উপপাদ্যের প্রমাণ এই পর্বে দেওয়া হচ্ছে না; এটি automated reasoning-এর পাঠ্যবইয়ের বিষয় (একটি সাধারণ পথ হলো variable-এর সংখ্যার ওপর induction).

আরও গভীরে: First-order logic-এর (quantifier-সহ) জন্য একটি sound আর complete প্রমাণ-ব্যবস্থা আছে, যা Kurt Gödel তাঁর ১৯২৯ সালের ডক্টরাল থিসিসে প্রমাণ করেন (প্রকাশ ১৯৩০); একে Gödel's completeness theorem বলে। এর মাত্র দুই বছর পরের (১৯৩১) incompleteness theorem আলাদা কথা বলে: পাটিগণিত ধারণ করতে পারে এমন সামঞ্জস্যপূর্ণ (consistent) কোনো স্বীকার্য-ব্যবস্থায় কিছু সত্য বাক্য প্রমাণ করা যায় না। প্রথমটি “নিয়মগুলো যথেষ্ট কি না”, দ্বিতীয়টি “স্বীকার্যগুলো যথেষ্ট কি না”। আরেকটি সীমা: resolution-এ কিছু unsatisfiable সূত্রের সবচেয়ে ছোট প্রমাণও variable-এর সংখ্যায় exponential দৈর্ঘ্যের; Armin Haken ১৯৮৫ সালে pigeonhole principle-এর সূত্রের জন্য এটি দেখান।

পরীক্ষা ও ইন্টারভিউতে: বিশ্ববিদ্যালয়, চাকরি বা ইন্টারভিউর পরীক্ষায় এই ধরনের প্রশ্ন প্রায়ই আসে:

  • “বৃষ্টি হলে মাঠ ভেজে; মাঠ ভেজেনি; অতএব বৃষ্টি হয়নি” — কোন নিয়ম? Modus tollens; valid.
  • p → q, q ∴ p valid কি না? না, affirming the consequent; counterexample p = F, q = T.
  • (p ∨ q) আর (¬p ∨ r)-এর resolvent? q ∨ r.
  • Valid আর sound-এর পার্থক্য? Valid = আকার ঠিক; sound = valid এবং সব premise সত্য।
  • p → q, ¬p → r, r → s, ¬q থেকে s প্রমাণ করুন। ¬q আর p → q থেকে MT: ¬p; ¬p → r থেকে MP: r; r → s থেকে MP: s.

৮ · AI-এর যুগে — AI-এর লেখা প্রমাণ কীভাবে যাচাই করবেন

AI সহকারী formal proof লিখতে পারে, নিয়মের নামও সুন্দর করে বসায়। কিন্তু এই পর্বের বিষয়েই তার ভুলগুলো সবচেয়ে বিপজ্জনক, কারণ ভুল প্রমাণ দেখতে নিখুঁত লাগে। যে ভুলগুলো বেশি দেখা যায়:

AI-এর ভুলকীভাবে ধরবেন
Affirming the consequent-কে “modus ponens” নামে চালানোলাইনের ছাঁচ নিয়মের ছাঁচের সঙ্গে অক্ষরে অক্ষরে মেলান
উপসংহারকেই কোনো premise-এ লুকিয়ে রাখা (circular)প্রতিটি premise আসলে কোথা থেকে এলো, জিজ্ঞেস করুন
Converse প্রমাণ করে মূল দাবি প্রমাণিত বলাশেষ লাইন আর দাবির → দিক মিলিয়ে দেখুন
EI-তে পুরোনো নাম ব্যবহার, বা বিশেষ c থেকে UGপ্রতিটি EI-এর নাম নতুন কি না, UG-এর c ইচ্ছামতো কি না দেখুন
Resolution-এ এক ধাপে দুটি literal কাটাপ্রতিটি resolvent-এ ঠিক একটি জোড়া বাদ পড়েছে কি না গুনুন
অস্তিত্বহীন উপপাদ্য বা বইয়ের উদ্ধৃতিলেখক, বছর আর শিরোনাম নিজে খুঁজে দেখুন

AI-কে প্রমাণ লিখতে দিলে প্রতিটি লাইনের কারণ আর যাচাইয়ের উপায় চেয়ে নিন। নিচের কাঠামো কাজে দেয়:

নিচের premise-গুলো থেকে উপসংহারটির একটি formal proof লেখো: Premise: [এখানে premise-গুলো] উপসংহার: [এখানে উপসংহার] ১. প্রতিটি লাইন নম্বর দিয়ে লেখো; পাশে নিয়মের নাম আর কোন লাইন থেকে এসেছে তা দাও। ২. শুধু এই নিয়মগুলো ব্যবহার করো: modus ponens, modus tollens, hypothetical syllogism, disjunctive syllogism, addition, simplification, conjunction, resolution, UI, UG, EI, EG. ৩. প্রতিটি EI-তে নতুন নাম দাও, আর UG ব্যবহার করলে কেন c ইচ্ছামতো তা লেখো। ৪. যদি argument-টি valid না হয়, প্রমাণ বানানোর চেষ্টা না করে একটি counterexample সারি দেখাও। ৫. শেষে একটি ছোট Python কোড দাও, যা itertools.product দিয়ে সব সারি ঘুরে validity যাচাই করে।

AI-এর প্রমাণ হাতে পেলে — যাচাইয়ের চেকলিস্ট

AI agent-এর knowledge base-এ resolution আর inference কীভাবে চলে, তা AI-এর ভিত্তি আর Python for AI কোর্সের পর্ব ৪৫ আর পর্ব ৪৬-এ আছে; এখানে আমরা তার নিচের গণিতটুকু প্রমাণসহ দেখলাম।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন, তারপর “→ উত্তর” চাপুন।

প্র ০১Modus ponens-কে কেন একটি premise হিসেবে লিখে দেওয়া যায় না? Lewis Carroll-এর কচ্ছপ কী দেখিয়েছিল?

১৮৯৫ সালে দর্শনের পত্রিকা Mind-এ Lewis Carroll (গণিতবিদ Charles Dodgson-এর ছদ্মনাম, Alice in Wonderland-এর লেখক) একটি ছোট সংলাপ প্রকাশ করেন: What the Tortoise Said to Achilles. কচ্ছপ মেনে নেয় A (“দুটি জিনিস তৃতীয় একটির সমান হলে পরস্পর সমান”) আর B (“এই ত্রিভুজের দুই বাহু তৃতীয় বাহুর সমান”)। কিন্তু Z (“দুই বাহু পরস্পর সমান”) মানতে চায় না, যতক্ষণ না C লেখা হয়: “A আর B সত্য হলে Z সত্য”। Achilles C লিখে দেন। কচ্ছপ বলে, এবার A, B, C মানলাম, কিন্তু Z মানতে D লাগবে: “A, B, C সত্য হলে Z সত্য”। এভাবে অসীম পর্যন্ত।

শিক্ষাটি: অনুমানের নিয়ম আর premise দুই আলাদা স্তরের জিনিস। Premise হলো খেলার “ঘুঁটি”, নিয়ম হলো “চালের নিয়ম”। p → q একটি premise হিসেবে লিখলে সেটি শুধু আরেকটি বাক্য; কিছু করতে হলে একটি নিয়ম লাগে যা বলে “p আর p → q থেকে q লেখা যায়”। নিয়মটিকে আবার বাক্যে রূপান্তর করলে আবার একটি নতুন নিয়ম লাগে। কোথাও না কোথাও “এটি করা যায়” স্তরে থামতে হয়।

কম্পিউটারে একই কথা: একটি প্রোগ্রামের ডেটা আর সেই ডেটা চালানোর interpreter আলাদা। ডেটায় “এই নিয়মটি চালাও” লিখে রাখলেও কাউকে সেটি পড়ে চালাতে হয়। Prolog-এর মতো logic programming ভাষায় ঠিক এই বিভাজন দেখা যায়: clause-গুলো ডেটা, আর resolution-চালানো ইঞ্জিন হলো নিয়ম। এই পর্বের Python প্রমাণ-যাচাইকারীতেও তাই: proof তালিকায় বাক্য, আর follows function-এ নিয়ম।

এর থেকে বোঝা যায়, কেন উপপাদ্য ১.১-এর “(premise-গুলোর ∧) → উপসংহার tautology” আর “argument valid” আলাদা বাক্য হিসেবে প্রমাণ করতে হলো: একটি হলো বস্তু-ভাষার (object language) একটি সূত্র সম্পর্কে, অন্যটি argument সম্পর্কে একটি দাবি (meta-language). গণিতের যুক্তিবিদ্যা এই দুই স্তর সযত্নে আলাদা রাখে।

মূল উপলব্ধি: নিয়ম হলো কাজ, বাক্য হলো বস্তু। যুক্তিকে শুধু বাক্যের স্তূপে রূপান্তর করা যায় না; কোথাও একটি “চালানোর নিয়ম” মেনে নিতে হয়।

প্র ০২মানুষ affirming the consequent এত সহজে কেন করে? মনোবিজ্ঞানের পরীক্ষা কী বলে?

১৯৬০-এর দশকে ব্রিটিশ মনোবিজ্ঞানী Peter Wason একটি পরীক্ষা দেন, যা এখন Wason selection task নামে পরিচিত। টেবিলে চারটি কার্ড: E, K, 4, 7. প্রতিটির এক পাশে অক্ষর, অন্য পাশে সংখ্যা। নিয়ম: “কার্ডের এক পাশে স্বরবর্ণ থাকলে অন্য পাশে জোড় সংখ্যা।” নিয়মটি ভাঙা হয়েছে কি না জানতে ঠিক কোন কার্ডগুলো উল্টাতে হবে? বহু পরীক্ষায় অল্প কিছু অংশগ্রহণকারীই সঠিক উত্তর দেন বলে প্রকাশিত গবেষণায় পাওয়া যায়। অনেকে বেছে নেন E আর 4.

সঠিক উত্তর E আর 7. p = “স্বরবর্ণ”, q = “জোড়”। নিয়ম ভাঙে শুধু p = T, q = F সারিতে। E (p সত্য) উল্টাতেই হবে: অন্য পাশে বিজোড় পেলে নিয়ম ভাঙা। 7 (q মিথ্যা) উল্টাতে হবে: অন্য পাশে স্বরবর্ণ পেলে নিয়ম ভাঙা; এটিই modus tollens-এর পরীক্ষা। 4 উল্টানো অর্থহীন: অন্য পাশে ব্যঞ্জনবর্ণ থাকলেও নিয়ম ভাঙে না (p = F হলে p → q সত্য)। 4 বেছে নেওয়ার পেছনের মনোভাবই affirming the consequent: “q দেখা গেছে, তাই p সম্পর্কে কিছু জানা যাবে।” K-ও অর্থহীন।

বাস্তব প্রসঙ্গে ফল বদলায়: একই যুক্তি পরিচিত সামাজিক নিয়মে দিলে, যেমন “কেউ মদ্যপান করলে তার বয়স ১৮-র বেশি হতে হবে”, অনেক বেশি মানুষ ঠিক উত্তর দেন বলে পরবর্তী গবেষণায় পাওয়া গেছে। কেন, তা নিয়ে মনোবিজ্ঞানীদের মধ্যে একাধিক ব্যাখ্যা আছে।

Bayes-এর দৃষ্টিতে: “অচেনা লগইন দেখা গেছে, তাই পাসওয়ার্ড ফাঁস” পুরোপুরি অর্থহীন নয়: q দেখলে p-এর সম্ভাবনা বাড়তে পারে। ভুল হলো নিশ্চয়তা দাবি করা। কতটা বাড়ে, তা নির্ভর করে অন্য কারণগুলো কত সাধারণ তার ওপর; এটি পর্ব ৩৯ “শর্তসাপেক্ষ সম্ভাবনা, independence আর Bayes-এর উপপাদ্য”-এর বিষয়। চিকিৎসা, আদালত আর সাইবার নিরাপত্তায় এই পার্থক্য জীবন-মরণের প্রশ্ন হতে পারে।

মূল উপলব্ধি: মানুষের স্বাভাবিক যুক্তি প্রায়ই “নিশ্চিত” আর “সম্ভাব্য”-এর পার্থক্য গুলিয়ে ফেলে। নিয়ম পরীক্ষার সময় খুঁজুন কোন ক্ষেত্রে নিয়ম ভাঙতে পারে (p সত্য বা q মিথ্যা), কোন ক্ষেত্রে নিয়ম মেনে চলছে বলে মনে হয় তা নয়।

প্র ০৩Resolution কীভাবে কম্পিউটারের প্রমাণ-যন্ত্রের মূল নিয়ম হয়ে উঠল?

১৯৫০-এর দশকে কম্পিউটার দিয়ে উপপাদ্য প্রমাণের প্রথম চেষ্টাগুলো শুরু হয়। ১৯৫৬ সালের দিকে Allen Newell, Herbert Simon আর Cliff Shaw-এর Logic Theorist প্রোগ্রাম Whitehead ও Russell-এর Principia Mathematica-র দ্বিতীয় অধ্যায়ের অনেকগুলো উপপাদ্য প্রমাণ করে। কিন্তু সেটি মানুষের মতো অনেক নিয়ম আর অনুমাননির্ভর কৌশল (heuristic) ব্যবহার করত। আর ১৯৬০ সালে Martin Davis আর Hilary Putnam propositional সমস্যার জন্য একটি পদ্ধতি দেন, যাতে resolution-ধরনের একটি ধাপ ছিল।

বড় পরিবর্তন ১৯৬৫ সালে: John Alan Robinson Journal of the ACM-এ “A Machine-Oriented Logic Based on the Resolution Principle” প্রবন্ধে দেখান, first-order logic-এ একটিমাত্র নিয়ম (resolution) আর unification (দুটি সূত্রকে মেলানোর জন্য variable-এ কী বসাতে হবে তা বের করা) দিয়ে refutation-complete একটি পদ্ধতি পাওয়া যায়। মানুষের পক্ষে স্বাভাবিক নয়, কিন্তু যন্ত্রের পক্ষে আদর্শ: একটিমাত্র কাজ, বারবার।

Prolog: ১৯৭০-এর দশকের শুরুতে Alain Colmerauer-এর দল আর Robert Kowalski-র কাজ থেকে Prolog ভাষা আসে (সাধারণত ১৯৭২ সাল বলা হয়)। Prolog প্রোগ্রাম হলো Horn clause-এর তালিকা (বড়জোর একটি positive literal-ওয়ালা clause), আর প্রোগ্রাম চালানো মানে একটি প্রশ্নের negation থেকে resolution দিয়ে □ খোঁজা। অর্থাৎ এই পর্বের stepper-এর কাজটিই একটি প্রোগ্রামিং ভাষার চালানোর নিয়ম।

আজ: বড় স্বয়ংক্রিয় theorem prover-গুলো resolution আর তার উন্নত রূপ (যেমন superposition) ব্যবহার করে। একটি বিখ্যাত সাফল্য: ১৯৯৬ সালে William McCune-এর EQP প্রোগ্রাম Robbins conjecture প্রমাণ করে, যা বীজগণিতের একটি প্রশ্ন হিসেবে কয়েক দশক খোলা ছিল। আর SAT solver-গুলোর clause learning-ও আসলে resolution ধাপের ধারাবাহিকতা; পর্ব ০৭-এ দেখবেন। AI-তে knowledge base-এর inference কীভাবে চলে, তা AI-এর ভিত্তি কোর্সের পর্ব ৪৫-এ আছে।

মূল উপলব্ধি: মানুষের জন্য ভালো নিয়ম আর যন্ত্রের জন্য ভালো নিয়ম আলাদা হতে পারে। Resolution মানুষের কাছে অস্বাভাবিক, কিন্তু একটিমাত্র নিয়মে সব প্রমাণ সম্ভব বলে যন্ত্রের কাছে সবচেয়ে সরল।

প্র ০৪Gödel-এর completeness আর incompleteness — নাম দুটি পরস্পরবিরোধী শোনায়। আসলে কী বলে?

দুটিই Kurt Gödel-এর, মাত্র দুই বছরের ব্যবধানে। Completeness theorem (থিসিস ১৯২৯, প্রকাশ ১৯৩০) বলে: first-order logic-এ, কোনো বাক্য একগুচ্ছ premise-এর প্রতিটি “অর্থে” (model-এ) সত্য হলে, সেটি premise থেকে নির্দিষ্ট নিয়মে প্রমাণ করা যায়। অর্থাৎ ⊨ হলে ⊢. নিয়মগুলো যথেষ্ট; কোনো সত্য অনুমান বাদ পড়ে না।

Incompleteness theorem (১৯৩১) একটি ভিন্ন প্রশ্নের উত্তর: পাটিগণিতের (স্বাভাবিক সংখ্যার যোগ-গুণ) জন্য যদি একটি সামঞ্জস্যপূর্ণ স্বীকার্য-তালিকা লেখা হয়, যা যন্ত্র দিয়ে তালিকাভুক্ত করা যায়, তবে এমন বাক্য থাকবে যা স্বাভাবিক সংখ্যায় সত্য অথচ সেই স্বীকার্য থেকে প্রমাণযোগ্য নয়। এখানে সমস্যা নিয়মে নয়, স্বীকার্যে: স্বীকার্যগুলো স্বাভাবিক সংখ্যার সব সত্য ধরতে পারে না।

বিরোধ নেই কেন? Completeness-এর “সত্য” মানে স্বীকার্য মানে এমন প্রতিটি কাঠামোয় সত্য। পাটিগণিতের স্বীকার্য মানে এমন অদ্ভুত “অ-মানক” কাঠামোও আছে, যেখানে সেই অপ্রমাণযোগ্য বাক্যটি মিথ্যা। তাই বাক্যটি সব model-এ সত্য নয়, ⊨ খাটে না, আর completeness-এর দাবিও ভাঙে না। স্বাভাবিক সংখ্যা সেই অনেক model-এর একটি মাত্র।

Propositional logic-এ: সেখানে সবকিছু আরও সরল। ⊨ যাচাই করা যায় সসীম truth table দিয়ে, আর natural deduction বা resolution refutation-এর মতো ব্যবস্থা sound আর complete. Natural deduction-এর আধুনিক রূপ ১৯৩০-এর দশকের মাঝামাঝি Gerhard Gentzen আর Stanisław Jaśkowski স্বাধীনভাবে দেন। কম্পিউটার বিজ্ঞানে এর প্রভাব সরাসরি: Coq, Lean, Isabelle-এর মতো proof assistant এই ধরনের নিয়মের ওপর দাঁড়িয়ে প্রতিটি প্রমাণ-ধাপ যাচাই করে।

মূল উপলব্ধি: “নিয়ম যথেষ্ট কি না” (completeness) আর “স্বীকার্য যথেষ্ট কি না” (incompleteness) দুটি আলাদা প্রশ্ন। প্রথমটির উত্তর হ্যাঁ, দ্বিতীয়টির উত্তর পাটিগণিতের মতো সমৃদ্ধ তত্ত্বে না।

প্র ০৫প্রমাণ যাচাই করা সহজ, কিন্তু প্রমাণ খুঁজে পাওয়া কঠিন কেন?

এই পর্বের Python প্রমাণ-যাচাইকারী প্রতিটি লাইনে শুধু উল্লেখিত লাইনগুলো দেখে। লাইনে যদি কয়েকটি variable থাকে, যাচাই দ্রুত; আর প্রমাণ ছোট হলে মোট কাজ কম। কিন্তু প্রমাণ খুঁজতে হলে প্রতিটি ধাপে বহু পছন্দ: কোন দুটি লাইন, কোন নিয়ম? পছন্দের গাছ ধাপে ধাপে গুণ হারে বাড়ে। Resolution প্রোগ্রামেও দেখলেন: ৩ ধাপের প্রমাণের জন্য ১২টি clause তৈরি হয়েছে।

সমস্যাটি কত কঠিন: “এই সূত্র কি tautology?” প্রশ্নটি coNP-complete; এর উল্টো প্রশ্ন “এই সূত্র কি satisfiable?” হলো SAT, Stephen Cook ১৯৭১ সালে যাকে প্রথম NP-complete সমস্যা হিসেবে দেখান (Leonid Levin স্বাধীনভাবে প্রায় একই সময়ে)। কোনো propositional প্রমাণ-ব্যবস্থায় প্রতিটি tautology-র ছোট (polynomial দৈর্ঘ্যের) প্রমাণ আছে কি না, এটি NP = coNP প্রশ্নের সমতুল্য, যা Cook আর Reckhow ১৯৭০-এর দশকে দেখান। Resolution-এর জন্য উত্তর জানা: না। Haken ১৯৮৫ সালে দেখান, “n + 1টি পায়রা n-টি খোপে, প্রতি খোপে বড়জোর একটি” সূত্রের resolution প্রমাণ n-এর সঙ্গে exponential হারে লম্বা হতে বাধ্য। Pigeonhole principle পর্ব ৩২-এ আসবে।

বাস্তবে: তবুও SAT solver আর theorem prover বিশাল বাস্তব সমস্যা দ্রুত সমাধান করে, কারণ বাস্তব সমস্যার গঠন থাকে। আর proof assistant (Lean, Coq) বড় গাণিতিক প্রমাণ যাচাই করেছে: যেমন চার রঙের উপপাদ্যের সম্পূর্ণ যন্ত্র-যাচাই Georges Gonthier-এর দল ২০০৫ সালে Coq-এ করে। সেখানে মানুষ প্রমাণের কাঠামো দেয়, যন্ত্র প্রতিটি ধাপ যাচাই করে।

AI-এর প্রসঙ্গে: এই অসমতাই AI সহকারীর সঙ্গে কাজের সূত্র। AI প্রমাণ “খুঁজে” দিতে পারে, কখনো ভুলসহ; আপনার কাজ প্রতিটি লাইন “যাচাই” করা, যা অনেক সহজ। সাম্প্রতিক কিছু AI গবেষণায় ভাষা-মডেলের প্রস্তাবিত প্রমাণ Lean-এর মতো যাচাইকারী দিয়ে পরীক্ষা করা হয়, ঠিক এই কারণে।

মূল উপলব্ধি: প্রমাণ খোঁজা সাধারণভাবে কঠিন, যাচাই সহজ। তাই প্রতিটি লাইনে কারণ লেখা formal proof এত মূল্যবান: যে কেউ, যেকোনো সময়, যান্ত্রিকভাবে পরীক্ষা করতে পারে।

অনুশীলন

আগে খাতায় করুন, তারপর উত্তর খুলে মেলান।

  1. প্রমাণ: বাজারঘরের রিফান্ড নীতি: “পণ্য ক্ষতিগ্রস্ত হলে ছবি জমা পড়ে” (p → q), “পণ্য ক্ষতিগ্রস্ত না হলে গ্রাহক রিটার্ন পিকআপ চান” (¬p → r), “রিটার্ন পিকআপ চাইলে কুরিয়ার পাঠানো হয়” (r → s), আর “ছবি জমা পড়েনি” (¬q). প্রতিটি লাইনের কারণসহ একটি formal proof লিখুন যে কুরিয়ার পাঠানো হয় (s).
    1. ¬q — premise
    2. p → q — premise
    3. ¬p — modus tollens (১, ২)
    4. ¬p → r — premise
    5. r — modus ponens (৩, ৪)
    6. r → s — premise
    7. s — modus ponens (৫, ৬) ∎

    বিকল্প: লাইন ৪ আর ৬ থেকে hypothetical syllogism দিয়ে ¬p → s, তারপর ৩-এর সঙ্গে modus ponens. যাচাই: p, q, r, s-এর ১৬টি সারির কোনোটিতেই চারটি premise সত্য অথচ s মিথ্যা নয় (scratch-এ Python দিয়ে পরীক্ষিত)।

  2. হিসাব: (ক) Premise p ∨ q, ¬p ∨ r, ¬q ∨ r. p, q, r-এর ৮টি সারির কয়টিতে তিনটি premise একসঙ্গে সত্য, আর সেগুলোর প্রতিটিতে r কী? (খ) ৫টি variable-এর একটি argument-এর validity truth table দিয়ে যাচাই করতে কয়টি সারি দেখতে হবে? (গ) {p, q, ¬r} আর {¬q, r, s}-এর সম্ভাব্য resolvent-গুলো লিখুন। এ দুটি থেকে কি {p, s} টানা যায়?

    (ক) ৩টি সারি: (p, q, r) = (T, T, T), (T, F, T), (F, T, T). তিনটিতেই r = T, তাই p ∨ q, ¬p ∨ r, ¬q ∨ r ⊨ r; resolution stepper-এর ফলের সঙ্গে মেলে। r = F হলে ¬p আর ¬q বাধ্যতামূলক, তখন p ∨ q মিথ্যা: তাই r = F-এর কোনো সারি টেকে না।

    (খ) 25 = ৩২টি সারি। কাজ কমানোর উপায়: শুধু সেই সারিগুলো খুঁটিয়ে দেখুন যেখানে উপসংহার মিথ্যা, আর তাদের কোনোটিতে সব premise সত্য কি না দেখুন।

    (গ) দুটি পরিপূরক জোড়া আছে (q/¬q আর ¬r/r), কিন্তু এক ধাপে একটিই কাটা যায়। q দিয়ে: {p, ¬r, r, s}; r দিয়ে: {p, q, ¬q, s}. দুটোই tautology, কোনো তথ্য দেয় না। {p, s} টানা যায় না: p = F, q = T, r = T, s = F সারিতে দুই clause সত্য অথচ p ∨ s মিথ্যা (আরেকটি counterexample: সব F).

  3. আউটপুট অনুমান: কোড না চালিয়ে বলুন কী ছাপা হবে, আর এটি কোন fallacy পরীক্ষা করছে। তারপর যেকোনো Python-এ চালিয়ে মেলান।
    from itertools import product
    imp = lambda a, b: (not a) or b
    rows = [(p, q) for p, q in product([True, False], repeat=2)
            if imp(p, q) and not p]
    print(len(rows), rows)
    print(all(not q for p, q in rows))
    2 [(False, True), (False, False)]
    False

    তালিকায় শুধু সেই সারি, যেখানে p → q আর ¬p দুটোই সত্য: p = F-এর দুটি সারি (product-এর ক্রমে আগে q = True). দ্বিতীয় লাইন জিজ্ঞেস করে, এই সব সারিতে ¬q সত্য কি না; (False, True) সারিতে q = True, তাই উত্তর False. অর্থাৎ p → q, ¬p ∴ ¬q argument-টি invalid: এটি denying the antecedent, আর counterexample p = F, q = T.

  4. প্রমাণের ভুল ধরুন: একজন লিখলেন: “দাবি: বাজারঘরে কোনো অর্ডার কার্ডে পরিশোধিত আর কোনো অর্ডার ক্যাশে পরিশোধিত হলে, কোনো একটি অর্ডার কার্ড এবং ক্যাশ দুটোতেই পরিশোধিত। প্রমাণ: ১. ∃x P(x) — premise. ২. ∃x Q(x) — premise. ৩. P(c) — EI (১). ৪. Q(c) — EI (২). ৫. P(c) ∧ Q(c) — conjunction (৩, ৪). ৬. ∃x (P(x) ∧ Q(x)) — EG (৫). ∎” ভুল কোথায়, আর দাবিটি কি সত্য?
    • লাইন ৪-এ EI-এর শর্ত ভাঙা: EI-তে নামটি একেবারে নতুন হতে হয়, কিন্তু c লাইন ৩-এ ইতিমধ্যে ব্যবহার হয়েছে। লাইন ২ শুধু বলে “কেউ একজন ক্যাশে দিয়েছেন”; তিনি লাইন ৩-এর c-ই, এমন কোনো কারণ নেই। সঠিক লাইন হতো Q(d), নতুন d.
    • তার পরে: P(c) আর Q(d) থেকে conjunction দিয়ে P(c) ∧ Q(d) পাওয়া যায়, কিন্তু EG দিয়ে এটিকে ∃x (P(x) ∧ Q(x))-এ আনা যায় না, কারণ দুই অংশে আলাদা উপাদান।

    দাবিটি মিথ্যা। Counterexample: দুটি অর্ডার, ০ শুধু কার্ডে, ১ শুধু ক্যাশে। দুই premise সত্য, উপসংহার মিথ্যা। Python-এর ছোট domain অনুসন্ধানে ঠিক এটিই এসেছিল: n = 2, P = TF, Q = FT.

নিজেকে যাচাই করুন

ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।

ক্রমResolution refutation দিয়ে KB ⊨ α প্রমাণের ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. KB-র প্রতিটি বাক্যকে CNF-এ এনে clause-এর তালিকা বানানো
  2. লক্ষ্য α-এর negation ¬α-কে clause হিসেবে যোগ করা
  3. পরিপূরক literal আছে এমন দুটি clause বেছে একটি literal-জোড়া কেটে resolvent বানানো
  4. নতুন resolvent তালিকায় যোগ করে আবার জোড়া খোঁজা
  5. Empty clause □ পেলে সিদ্ধান্ত: KB ∧ ¬α unsatisfiable, তাই KB ⊨ α

“p → q আর ¬q থেকে ¬p” — এই অনুমানের নিয়মের নাম কী?

  • Modus ponens
  • Modus tollens
  • Hypothetical syllogism
  • Disjunctive syllogism

নিচের কোন argument-টি invalid?

  • যদি অর্ডার ক্যানসেল হয় তবে টাকা ফেরত যায়; অর্ডার ক্যানসেল হয়েছে; অতএব টাকা ফেরত যায়
  • পেমেন্ট কার্ডে অথবা ক্যাশে; কার্ডে নয়; অতএব ক্যাশে
  • যদি অর্ডার ক্যানসেল হয় তবে টাকা ফেরত যায়; টাকা ফেরত গেছে; অতএব অর্ডার ক্যানসেল হয়েছে
  • যদি অর্ডার ক্যানসেল হয় তবে টাকা ফেরত যায়; টাকা ফেরত যায়নি; অতএব অর্ডার ক্যানসেল হয়নি

Existential instantiation-এ ∃x P(x) থেকে P(c) লেখার সময় c সম্পর্কে কোন শর্তটি অবশ্যই মানতে হয়?

  • c domain-এর যেকোনো উপাদান হতে পারে
  • c প্রমাণে আগে ব্যবহার হওয়া কোনো নাম হতে হবে
  • c একটি ইচ্ছামতো উপাদান, যাতে পরে ∀ টানা যায়
  • c একটি নতুন নাম, প্রমাণে আগে কোথাও আসেনি

একটি argument valid, কিন্তু তার উপসংহার বাস্তবে মিথ্যা। এ থেকে নিশ্চিতভাবে কী বলা যায়?

  • Argument-এর আকারে ভুল আছে
  • অন্তত একটি premise মিথ্যা
  • সব premise সত্য
  • এমন অবস্থা অসম্ভব

Resolution refutation দিয়ে KB ⊨ α দেখাতে কী করা হয়?

  • KB-তে α যোগ করে □ খোঁজা হয়
  • KB থেকে সরাসরি resolution দিয়ে α বানানো হয়
  • KB-তে ¬α যোগ করে □ খোঁজা হয়
  • KB আর α-এর পূর্ণ truth table বানানো হয়

“p ∨ q, p ∴ ¬q” argument-টি সম্পর্কে কোনটি সঠিক? (∨ এখানে inclusive or)

  • Invalid; counterexample p = T, q = T
  • Valid; এটি disjunctive syllogism
  • Invalid; counterexample p = F, q = F
  • Valid, কারণ “অথবা” মানে দুটির একটি

শব্দকোষ

লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন, অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:

মনে রাখুন

  1. Valid = সব premise সত্য এমন প্রতিটি সারিতে উপসংহার সত্য = (premise-এর ∧) → উপসংহার tautology; sound = valid আর premise সত্য।
  2. আটটি নিয়ম: MP, MT, hypothetical ও disjunctive syllogism, addition, simplification, conjunction, resolution; প্রতিটি একবার প্রমাণ করা tautology.
  3. Fallacy: p → q, q ∴ p আর p → q, ¬p ∴ ¬q invalid (counterexample p = F, q = T); circular যুক্তি কিছুই প্রমাণ করে না।
  4. Quantifier: UI ও EG সহজ; EI-তে নতুন নাম, UG-তে ইচ্ছামতো উপাদান। EI আগে, UI পরে।
  5. Resolution refutation: KB ∧ ¬α থেকে □ মানে KB ⊨ α; resolution sound আর refutation-complete, কিন্তু প্রমাণ কখনো exponential লম্বা।

পরের পর্বে: কাজে যুক্তি — কোডের শর্ত সরল করা, পরস্পরবিরোধী চাহিদা খোঁজা, সুডোকুকে clause-এ লেখা, আর একটি আসল SAT solver দিয়ে বাজারঘরের ডেলিভারি-সময়সূচি সমাধান।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

এই পর্বটি শেয়ার করুন:
এই পর্বে ভুল পেয়েছেন? জানান