এই পর্বে যা শিখবেন
- কোন বাক্য proposition আর কোনটি নয়, কারণসহ বলতে পারা
- ছয়টি connective-এর সংজ্ঞা, truth table বানানো আর সারির সংখ্যা 2ⁿ কেন তার প্রমাণ
- Conditional-এর converse, inverse আর contrapositive আলাদা করা, contrapositive-এর সমতার প্রমাণ
- বাংলা নিয়ম-বাক্যকে নির্ভুল সূত্রে লেখা, আর নিয়মের তালিকা পরস্পরবিরোধী কি না যাচাই করা
- Bit string-এর ওপর AND/OR/XOR আর knights-and-knaves ধাঁধা ক্ষেত্র ধরে সমাধান
১ · Proposition — কোন বাক্যকে সত্য বা মিথ্যা বলা যায়
“বাজারঘর” আমাদের কোর্সের কাল্পনিক অনলাইন দোকান। তার কোড-বেসে হাজারো শর্ত লেখা: “অর্ডার ৫০০ টাকার বেশি হলে কুপন চলবে”, “পাসওয়ার্ড তিনবার ভুল হলে অ্যাকাউন্ট লক হবে”, “ঢাকার ভেতরে হলে আজই ডেলিভারি”। প্রতিটি শর্তের ভেতরে লুকিয়ে আছে কয়েকটি ছোট দাবি, যার প্রতিটি কোনো একটি মুহূর্তে হয় সত্য, নয় মিথ্যা। এই ছোট দাবিগুলো আর তাদের জোড়া লাগানোর নিয়মই propositional logic.
একটি proposition হলো এমন একটি ঘোষণামূলক বাক্য, যা হয় সত্য, নয় মিথ্যা; দুটো একসঙ্গে নয়, আর তৃতীয় কোনো মানও নয়। সত্যকে লেখা হয় T (বা 1), মিথ্যাকে F (বা 0). এই দুটি মানকে বলে truth value.
নিচের তালিকা দেখুন। কোনটি proposition, কোনটি নয়, আর কেন:
| বাক্য | Proposition? | কারণ |
|---|---|---|
| ঢাকা বাংলাদেশের রাজধানী। | হ্যাঁ (T) | ঘোষণা, আর মানটি নির্দিষ্ট |
| 7 একটি জোড় সংখ্যা। | হ্যাঁ (F) | মিথ্যা বাক্যও proposition |
| অর্ডার নম্বর BG-1042 ডেলিভারি হয়েছে। | হ্যাঁ | আমরা মান না জানলেও মান একটিই আছে |
| আপনার অর্ডার কি পৌঁছেছে? | না | প্রশ্ন, কোনো দাবি নেই |
| পাসওয়ার্ডটি বদলে নিন। | না | আদেশ বা অনুরোধ |
| x + 1 = 5 | না | x-এর মান না জানলে সত্য-মিথ্যা ঠিক হয় না (পর্ব ০৪-এর predicate) |
| এই বাক্যটি মিথ্যা। | না | সত্য ধরলে মিথ্যা হয়, মিথ্যা ধরলে সত্য হয় |
তৃতীয় সারিটি গুরুত্বপূর্ণ। Proposition হওয়ার জন্য আমাদের মান জানা লাগে না; শুধু মানটি নির্দিষ্টভাবে একটিই হতে হবে। শেষ সারির বাক্যটি বিখ্যাত liar paradox; এটি কেন proposition হতে পারে না, ভাবনার প্রশ্ন ৪-এ দেখবেন।
যুক্তির হিসাবে প্রতিটি মৌলিক proposition-এর জায়গায় একটি অক্ষর বসানো হয়: p, q, r, s… এদের বলে propositional variable. যেমন p = “অর্ডার ৫০০ টাকার বেশি”, q = “ক্রেতা নতুন”। এরপর ছোট ছোট variable জুড়ে বড় বাক্য বানানো হয়, যার নাম compound proposition. জোড়া লাগানোর আঠাটির নাম connective.
যুক্তিকে বীজগণিতের মতো হিসাব করার ধারণাটি বড় আকারে আসে George Boole-এর কাছ থেকে: ১৮৪৭ সালে The Mathematical Analysis of Logic আর ১৮৫৪ সালে An Investigation of the Laws of Thought. তাঁর নামেই Boolean algebra. তবে “যদি… তবে” বাক্যের সত্য-মিথ্যা নিয়ে তর্ক এর দুই হাজার বছরেরও বেশি আগে প্রাচীন গ্রিসের Stoic দার্শনিকরা করেছিলেন বলে ইতিহাসে পাওয়া যায়। আজকের truth table-এর সারণি রূপটির কৃতিত্ব সাধারণত দেওয়া হয় ১৯২০-এর দশকের শুরুর দিকে Emil Post আর Ludwig Wittgenstein-কে, যদিও এর আগেও অনেকে এমন হিসাব করেছেন।
২ · Connective আর truth table — ¬ ∧ ∨ ⊕
প্রতিটি connective-এর অর্থ তার truth table দিয়ে সংজ্ঞায়িত: প্রতিটি সম্ভাব্য মান-বসানোর জন্য ফল কী। দৈনন্দিন ভাষার আবছা অর্থ এখানে চলে না; টেবিলই শেষ কথা।
- Negation ¬p (“p নয়”): p-এর উল্টো মান। p = “আজ হরতাল”, তাহলে ¬p = “আজ হরতাল নয়”।
- Conjunction p ∧ q (“p এবং q”): দুটোই সত্য হলে তবেই সত্য।
- Disjunction p ∨ q (“p অথবা q”): অন্তত একটি সত্য হলেই সত্য, দুটোই সত্য হলেও সত্য। একে বলে inclusive or.
- Exclusive or p ⊕ q (XOR): ঠিক একটি সত্য হলে সত্য; দুটোই সত্য হলে মিথ্যা।
| p | q | ¬p | p ∧ q | p ∨ q | p ⊕ q | p → q | p ↔ q |
|---|---|---|---|---|---|---|---|
| T | T | F | T | T | F | T | T |
| T | F | F | F | T | T | F | F |
| F | T | T | F | T | T | T | F |
| F | F | T | F | F | F | T | T |
শেষ দুটি কলাম (→ আর ↔) পরের অংশে বিস্তারিত দেখব। নিচের ছবিতে চারটি connective-কে Venn diagram-এ দেখানো হয়েছে। আয়তক্ষেত্রটি চারটি সারির সব সম্ভাবনা; বাঁ বৃত্ত “p সত্য”, ডান বৃত্ত “q সত্য”, আর নীল রঙ সেই অংশ, যেখানে সূত্রটি সত্য। দুই বৃত্তের বাইরের জায়গাটি p = F, q = F সারি।
চারটি connective — কোন অংশে সত্য
Shaded region = rows where the formula is true
“অথবা” — inclusive না exclusive?
বাংলায় “অথবা” দুই অর্থে চলে। রেস্তোরাঁর মেনুতে “ভাতের সঙ্গে ডাল অথবা সবজি” মানে সাধারণত একটি, দুটো নয়: exclusive. আবার চাকরির বিজ্ঞপ্তিতে “প্রার্থীর CSE অথবা EEE ডিগ্রি থাকতে হবে” মানে দুটো থাকলেও আবেদন চলবে: inclusive. গণিত আর প্রোগ্রামিংয়ে ∨ (Python-এর or) সবসময় inclusive. Exclusive দরকার হলে আলাদা চিহ্ন ⊕ লিখতে হয়, অথবা স্পষ্ট করে বলতে হয় “তবে দুটো একসঙ্গে নয়”।
কতগুলো সারি, কতগুলো আলাদা টেবিল
n-টি propositional variable (n ≥ 1) থাকলে truth table-এ ঠিক 2ⁿটি সারি থাকে। আর n-টি variable-এর আলাদা আলাদা truth table (অর্থাৎ আলাদা সত্য-মিথ্যা ফাংশন) আছে ঠিক 22ⁿটি।
প্রমাণ (সারির সংখ্যা, induction দিয়ে):
- ভিত্তি: n = 1 হলে একটিমাত্র variable p, তার মান T বা F; সারি ২টি = 2¹.
- ধরে নিই: কোনো n ≥ 1-এর জন্য n-টি variable-এর সারি 2ⁿ.
- ধাপ: নতুন variable যোগ করলে আগের প্রতিটি সারি দুটি সারিতে ভাগ হয়: একটিতে নতুন variable = T, অন্যটিতে F. দুটি নতুন সারি আলাদা (নতুন ঘরে মান আলাদা), আর আলাদা পুরোনো সারি থেকে আসা সারিও আলাদা। তাই সারি 2 · 2ⁿ = 2n+1.
- Induction-এর নীতিতে সব n ≥ 1-এর জন্য সারি 2ⁿ. ∎
দ্বিতীয় অংশ: একটি truth table মানে 2ⁿটি সারির প্রতিটির শেষ ঘরে T বা F বসানো। প্রতিটি সারিতে ২টি স্বাধীন পছন্দ, তাই গুণের নিয়মে মোট 2 · 2 · … · 2 (2ⁿ বার) = 22ⁿ. ∎
সংখ্যাগুলো দ্রুত বাড়ে। n = 2 হলে 24 = ১৬টি সম্ভাব্য দুই-ইনপুট connective; আমরা নাম দিয়েছি তার কয়েকটির (∧, ∨, ⊕, →, ↔; NAND আর NOR পর্ব ০৩-এ)। n = 3 হলে ২৫৬টি, n = 5 হলে 232 = 4,294,967,296টি। Induction-এর পূর্ণ নিয়ম পর্ব ১০-এ, আর গুণের নিয়ম পর্ব ৩১-এ বিস্তারিত আসবে; এখানে শুধু ব্যবহার করলাম।
৩ · Conditional p → q — প্রতিশ্রুতি, ফাঁকা সত্য আর তার তিন আত্মীয়
Conditional বা implication p → q পড়া হয় “যদি p তবে q”. p-কে বলে hypothesis (শর্ত), q-কে conclusion (ফল)। এর truth table-এ নতুনরা সবচেয়ে বেশি অবাক হন, তাই একটি প্রতিশ্রুতি দিয়ে ভাবি।
বাজারঘর ঘোষণা দিল: “যদি সন্ধ্যা ৬টার আগে অর্ডার দেন, তবে আজই ডেলিভারি পাবেন।” p = “৬টার আগে অর্ডার”, q = “আজই ডেলিভারি”। প্রতিশ্রুতি কখন ভাঙল? শুধু তখন, যখন আপনি ৬টার আগে অর্ডার দিলেন (p = T) অথচ আজ পেলেন না (q = F). আপনি রাত ৯টায় অর্ডার দিলে (p = F) বাজারঘর আজ দিক বা কাল দিক, প্রতিশ্রুতি ভাঙেনি; কারণ প্রতিশ্রুতিটি রাতের অর্ডার নিয়ে কিছুই বলেনি। যা ভাঙেনি, যুক্তিতে তা সত্য।
তাই p → q মিথ্যা শুধু একটি সারিতে: p = T, q = F. বাকি তিন সারিতে সত্য। এই অর্থকে বলে material implication, আর সংক্ষেপে:
p → q-এর মান সবসময় ¬p ∨ q-এর মানের সমান
টেবিলের চার সারিতে মিলিয়ে দেখুন। এর একটি ফল: p মিথ্যা হলে q যা-ই হোক, p → q সত্য। একে বলে vacuous truth (ফাঁকা সত্য)। “বাজারঘরের যে ক্রেতার বয়স ২০০ বছর, তিনি ৯০% ছাড় পাবেন” — এমন কেউ নেই, তাই প্রতিশ্রুতিটি কখনো পরীক্ষাতেই পড়ে না, আর সেটি সত্য। Python-এ all([]) যে True দেয়, সেটিও এই ফাঁকা সত্য: খালি তালিকায় শর্ত ভাঙার মতো কোনো উপাদানই নেই (পর্ব ০৪-এ quantifier দিয়ে আবার আসবে)। খেয়াল করুন, → কোনো কারণ-ফল দাবি করে না: “যদি 2 + 2 = 4 হয় তবে সূর্য পূর্বে ওঠে” যুক্তিতে সত্য বাক্য, যদিও দুই অংশের মধ্যে কোনো সম্পর্ক নেই।
একটি conditional, তিনটি আত্মীয়
| নাম | রূপ | ডেলিভারির উদাহরণে | p → q-এর সমার্থক? |
|---|---|---|---|
| মূল বাক্য | p → q | ৬টার আগে অর্ডার দিলে আজই ডেলিভারি | — |
| Converse | q → p | আজই ডেলিভারি পেলে অর্ডার ৬টার আগে ছিল | না |
| Inverse | ¬p → ¬q | ৬টার পরে অর্ডার দিলে আজ ডেলিভারি নয় | না |
| Contrapositive | ¬q → ¬p | আজ ডেলিভারি না পেলে অর্ডার ৬টার আগে ছিল না | হ্যাঁ |
Converse কেন আলাদা? বাজারঘর রাতের কিছু অর্ডারও আজই পৌঁছে দিতে পারে (p = F, q = T). তখন মূল প্রতিশ্রুতি অটুট, কিন্তু converse “আজ পেলে অর্ডার ৬টার আগে ছিল” ভুল প্রমাণ হলো।
যেকোনো মান-বসানোয় p → q আর তার contrapositive ¬q → ¬p-এর মান সমান। একইভাবে converse q → p আর inverse ¬p → ¬q-এর মানও সবসময় সমান।
প্রমাণ (সারি না লিখে, “কখন মিথ্যা” ধরে):
- →-এর সংজ্ঞা অনুযায়ী A → B মিথ্যা ঠিক তখন, যখন A = T আর B = F.
- তাই p → q মিথ্যা ঠিক তখন, যখন p = T আর q = F.
- ¬q → ¬p মিথ্যা ঠিক তখন, যখন ¬q = T আর ¬p = F, অর্থাৎ (¬-এর সংজ্ঞায়) q = F আর p = T.
- ধাপ ২ আর ৩-এর শর্ত হুবহু এক। তাই দুটি বাক্য ঠিক একই সারিতে মিথ্যা, আর বাকি সব সারিতে দুটোই সত্য। অর্থাৎ প্রতিটি সারিতে মান সমান।
- Inverse ¬p → ¬q আসলে converse q → p-এর contrapositive (q-এর জায়গায় ¬p, p-এর জায়গায় ¬q বসালে ধাপ ১–৪ হুবহু খাটে)। তাই এ দুটিও সমান। ∎
এই সমতা পর্ব ০৮-এর “contrapositive দিয়ে প্রমাণ” পদ্ধতির ভিত্তি: p → q সরাসরি প্রমাণ কঠিন হলে ¬q → ¬p প্রমাণ করলেই চলে।
p → q বলার নানা ভঙ্গি, আর ↔
একই p → q ভাষায় অনেকভাবে আসে। সবচেয়ে ভুল হয় “শুধু যদি” (only if) নিয়ে:
- “যদি p তবে q”, “p হলে q”, “q, যদি p” — সবই p → q.
- “p শুধু যদি q” (p only if q) — এটিও p → q. মানে: q ছাড়া p হতে পারে না। “আপনি লগইন করতে পারবেন শুধু যদি OTP দেন” = লগইন → OTP. খেয়াল করুন, OTP দিলেই লগইন নিশ্চিত, এমন কথা বলা হয়নি।
- “p, q-এর জন্য যথেষ্ট” = p → q; “q, p-এর জন্য প্রয়োজনীয়” = p → q.
- “q, যদি না ¬p” বা ইংরেজিতে “q unless r” = ¬r → q, যা r ∨ q-এর সমান।
Biconditional p ↔ q (“p যদি এবং কেবল যদি q”, ইংরেজিতে iff) সত্য যখন দুটির মান এক। এটি (p → q) ∧ (q → p): দুই দিকের প্রতিশ্রুতি একসঙ্গে। “ছাত্রছাড় পাবেন যদি এবং কেবল যদি বৈধ ছাত্র-আইডি দেখান” মানে আইডি দেখালে ছাড় নিশ্চিত, আর আইডি ছাড়া ছাড় নেই। খেয়াল করুন, ↔ হলো ⊕-এর ঠিক উল্টো: p ↔ q-এর মান সবসময় ¬(p ⊕ q)-এর মান।
৪ · Precedence আর বড় সূত্রের truth table — সারি ধরে ধরে
পাটিগণিতে 2 + 3 × 4 = 14, কারণ গুণ আগে। যুক্তিতেও বন্ধনী না থাকলে কোন connective আগে খাটবে, তার নিয়ম আছে। একে বলে operator precedence. সবচেয়ে প্রচলিত ক্রম (বেশিরভাগ discrete math পাঠ্যবইয়ে):
আগে খাটে ⟶ পরে খাটে
তাই p ∨ q ∧ ¬r মানে p ∨ (q ∧ (¬r)), আর p ∧ q → r মানে (p ∧ q) → r. ⊕-এর স্থান বিভিন্ন বইয়ে আলাদা, আর p → q → r-কে কেউ ডান দিক থেকে জোড়েন, কেউ অস্পষ্ট বলেন। নিরাপদ নিয়ম: সন্দেহ হলেই বন্ধনী দিন। Python-এ not, and, or-এর ক্রম ঠিক ¬, ∧, ∨-এর মতো; বিস্তারিত Python প্রোগ্রামিং কোর্সের পর্ব ০৮-এ।
এবার একটি তিন-variable সূত্রের truth table সারি ধরে বানাই:
(p → q) ∧ (q → r) → (p → r)
Precedence অনুযায়ী ∧ আগে, তাই এটি ((p → q) ∧ (q → r)) → (p → r). বাংলায়: “p থেকে q আসে আর q থেকে r আসে, তাহলে p থেকে r আসে।” ভেতরের অংশকে A = (p → q) ∧ (q → r) আর B = p → r ধরে প্রতিটি সারিতে আগে ছোট অংশ, তারপর বড় অংশ হিসাব করুন। “পরে” চাপুন:
1p → q2q → r3A = (p→q) ∧ (q→r)4B = p → r5A → B
| সারি | |
| p q r | |
| p → q | |
| q → r | |
| A | |
| B = p → r | |
| A → B |
- সারি ১: p, q, r সব T. p → q = T → T = T; q → r = T; তাই A = T ∧ T = T. B = p → r = T. শেষে A → B = T → T = T.
- সারি ২: T T F. p → q = T, কিন্তু q → r = T → F = F, তাই A = F. B = T → F = F. A → B = F → F, শর্ত মিথ্যা বলে ফাঁকাভাবে T.
- সারি ৩: T F T. p → q = T → F = F, q → r = F → T = T, A = F. B = T → T = T. A → B = F → T = T.
- সারি ৪: T F F. p → q = F, q → r = F → F = T, A = F. B = T → F = F. A → B = F → F = T. খেয়াল করুন, B মিথ্যা হলেও বিপদ নেই, কারণ A-ও মিথ্যা।
- সারি ৫: F T T. p মিথ্যা, তাই p → q আর p → r দুটোই ফাঁকাভাবে T. q → r = T, A = T. A → B = T → T = T.
- সারি ৬: F T F. p → q = T, q → r = T → F = F, A = F. B = F → F = T. A → B = T.
- সারি ৭: F F T. p → q = T, q → r = F → T = T, A = T. B = T. A → B = T → T = T.
- সারি ৮: F F F. সব conditional-এর শর্ত মিথ্যা, তাই p → q, q → r, p → r সবই T; A = T, A → B = T.
- পুরো কলাম T T T T T T T T. A → B মিথ্যা হতো শুধু যদি কোনো সারিতে A = T অথচ B = F হতো। A সত্য সারিগুলো ১, ৫, ৭, ৮; প্রতিটিতে B-ও সত্য। সব সারিতে সত্য এমন সূত্রকে বলে tautology; এটি পর্ব ০৬-এর hypothetical syllogism নিয়মের ভিত্তি।
হাতে ৮টি সারি চলে, কিন্তু ২০টি variable-এ সারি দশ লাখের বেশি (220 = 1,048,576). এই কাজ কম্পিউটারকে দিন। নিচের Python ব্লক itertools.product দিয়ে সব সারি তৈরি করে; প্রথমবার চালালে ব্রাউজারে Python (Pyodide) নামতে কয়েক সেকেন্ড লাগে, পরে দ্রুত চলে। → চিহ্নের জন্য ছোট একটি function imp লেখা হয়েছে; দুটি bool-এর ক্ষেত্রে == হলো ↔।
from itertools import product
def imp(a, b): # a → b মানে (¬a) ∨ b
return (not a) or b
def table(title, names, f):
print(title)
print(" ".join(names), "| value")
hits = 0
for row in product([True, False], repeat=len(names)):
v = f(*row)
hits += v
print(" ".join("T" if x else "F" for x in row), "|", "T" if v else "F")
print(f"T in {hits} of {2 ** len(names)} rows\n")
table("(p -> q) and (q -> r) -> (p -> r)", "pqr",
lambda p, q, r: imp(imp(p, q) and imp(q, r), imp(p, r)))
table("(p -> q) == (q -> p) [is the converse the same?]", "pq",
lambda p, q: imp(p, q) == imp(q, p))
table("(p -> q) == (not q -> not p) [contrapositive]", "pq",
lambda p, q: imp(p, q) == imp(not q, not p))আসল আউটপুট (ব্রাউজারের Python), সংক্ষেপে:
(p -> q) and (q -> r) -> (p -> r)
p q r | value
T T T | T
…
F F F | T
T in 8 of 8 rows
(p -> q) == (q -> p) [is the converse the same?]
p q | value
T T | T
T F | F
F T | F
F F | T
T in 2 of 4 rows
(p -> q) == (not q -> not p) [contrapositive]
…
T in 4 of 4 rows
প্রথম টেবিল stepper-এর ফল মেলায়: ৮টির ৮টিতেই T. দ্বিতীয় টেবিলে “মূল বাক্য আর converse-এর মান সমান কি না” দেখা হয়েছে; T F আর F T সারিতে মেলে না, তাই converse সমার্থক নয়। তৃতীয়টিতে ৪টির ৪টিতেই মেলে: উপপাদ্য ৩.১-এর কম্পিউটার-যাচাই। প্রমাণ সব ক্ষেত্রের জন্য সত্যের নিশ্চয়তা দেয়; কোড শুধু এই ক্ষেত্রগুলো মিলিয়ে দেখে। দুটো একসঙ্গে থাকলে ভুলের সুযোগ কমে। নিজের সূত্র বসিয়ে দেখুন, যেমন table("p or not p", "p", lambda p: p or not p).
৫ · বাংলা বাক্য থেকে সূত্র — বাজারঘরের কুপন নিয়ম
প্রোগ্রামার আর পরীক্ষার্থী দুজনের সবচেয়ে বড় কাজ: সাধারণ ভাষার নিয়মকে নির্ভুল সূত্রে আনা। ভাষা আবছা, সূত্র আবছা হতে পারে না। পদ্ধতিটি সবসময় একই:
- মৌলিক proposition খুঁজে প্রতিটিকে একটি অক্ষর দিন (প্রতিটি যেন নিজে সত্য-মিথ্যা হয়, ভেতরে “না” না রেখে)।
- Connective-এর শব্দ চিহ্নিত করুন: “এবং/কিন্তু/তবুও” = ∧, “অথবা” = ∨ বা ⊕, “না/নয়” = ¬, “যদি… তবে/শুধু যদি” = →, “যদি এবং কেবল যদি” = ↔।
- →-এর দিক ঠিক করুন; “শুধু যদি”-র পরের অংশটি ফল (q), আগের অংশটি শর্ত (p).
- বন্ধনী ঠিক করুন; অস্পষ্ট হলে নিয়মের মালিককে জিজ্ঞেস করুন।
- একটি-দুটি সারি দিয়ে পরীক্ষা করুন, বাস্তবের অর্থ মেলে কি না।
বাজারঘরের মার্কেটিং দল লিখেছে: “BAZAR50 কুপন চলবে শুধু যদি অর্ডার ৫০০ টাকার বেশি হয় এবং ক্রেতা নতুন হন অথবা অ্যাপ থেকে অর্ডার দেন; তবে ফ্ল্যাশ সেলের পণ্যে কুপন চলবে না।” ধাপে ধাপে অনুবাদ করি:
1BAZAR50 কুপন চলবে2শুধু যদি3অর্ডার ৫০০ টাকার বেশি হয়4এবং ক্রেতা নতুন হন5অথবা অ্যাপ থেকে অর্ডার দেন;6তবে ফ্ল্যাশ সেলে চলবে না
| সূত্র | |
| নোট |
- মৌলিক proposition. c = “কুপন চলে”, b = “অর্ডার ৫০০ টাকার বেশি”, n = “ক্রেতা নতুন”, a = “অ্যাপ থেকে অর্ডার”, f = “পণ্যটি ফ্ল্যাশ সেলের”। লক্ষ করুন, “চলবে না”-কে আলাদা অক্ষর না দিয়ে ¬c লিখব।
- “শুধু যদি”-র দিক। “c শুধু যদি X” মানে c → X: কুপন চললে X অবশ্যই সত্য। ভুল করে X → c লিখলে মানে দাঁড়াত “শর্ত মিললেই কুপন চলবেই”, যা বাক্যটি বলেনি।
- “এবং… অথবা”-র বন্ধনী। দুটি অর্থ সম্ভব: b ∧ (n ∨ a) অথবা (b ∧ n) ∨ a. Python-এ যাচাই করলে দুটি আলাদা হয় ঠিক দুটি ক্ষেত্রে, যখন b = F আর a = T: ৪০০ টাকার অ্যাপ-অর্ডার। মার্কেটিং দলকে জিজ্ঞেস করা হলো; উত্তর: ৫০০ টাকার সীমা সবার জন্য। তাই b ∧ (n ∨ a).
- “তবে ফ্ল্যাশ সেলে নয়”। এটি f → ¬c, যার contrapositive c → ¬f. তাই শর্তে ¬f যোগ হলো: c → (b ∧ (n ∨ a) ∧ ¬f). “তবে” এখানে “কিন্তু”-র মতো, অর্থাৎ ∧।
- একটি সারি দিয়ে পরীক্ষা। ৪০০ টাকার অর্ডার, নতুন ক্রেতা, অ্যাপ থেকে, ফ্ল্যাশ সেল নয়: b = F, n = T, a = T, f = F. ডান দিক F ∧ … = F. সূত্র সত্য রাখতে c = F হতে হবে: কুপন প্রত্যাখ্যান, যা মার্কেটিং দলের উদ্দেশ্যের সঙ্গে মেলে।
- → নাকি ↔? “শুধু যদি” কেবল প্রয়োজনীয় শর্ত দেয়; শর্ত মিললে কুপন চলবে, এমন নিশ্চয়তা দেয় না। চেকআউট কোডে সাধারণত “শর্ত মিললে চালাও, না মিললে আটকাও” লাগে, সেটি c ↔ (b ∧ (n ∨ a) ∧ ¬f). b, n, a, f-এর ১৬টি সারির ঠিক ৩টিতে শর্তটি সত্য (b = T, f = F, আর n বা a-র অন্তত একটি T).
ধাপ ৩-এর মতো অস্পষ্টতা বাস্তবে সবচেয়ে দামি ভুলগুলোর একটি। কোড লিখে ফেলার পর ধরা পড়লে ক্রেতার অভিযোগ, ফেরত আর বিশ্বাস হারানোর খরচ। নিয়ম লেখার সময়েই সূত্রে আনুন আর মালিককে দুই অর্থের পার্থক্য দেখিয়ে জিজ্ঞেস করুন: “৪০০ টাকার অ্যাপ-অর্ডারে কুপন চলবে কি?”
নিয়মগুলো কি পরস্পরবিরোধী? — specification consistency
একটি সিস্টেমের specification সাধারণত অনেকগুলো নিয়ম। নিয়মগুলোকে বলে consistent, যদি অন্তত একটি মান-বসানো থাকে যেখানে সবকটি নিয়ম একসঙ্গে সত্য। না থাকলে নিয়মগুলো পরস্পরবিরোধী: যেভাবেই সিস্টেম বানান, কোনো না কোনো নিয়ম ভাঙবেই। গাণিতিকভাবে এটি প্রশ্ন করে, নিয়মগুলোর ∧ satisfiable কি না।
বাজারঘরের লগইন দলের লেখা নিয়ম, যেখানে w = “পাসওয়ার্ড ভুল”, k = “অ্যাকাউন্ট লক”, o = “OTP পাঠানো হয়েছে”, l = “লগইন সফল”:
- S1: পাসওয়ার্ড ভুল হলে লগইন হবে না: w → ¬l
- S2: অ্যাকাউন্ট লক থাকলে OTP যাবে না: k → ¬o
- S3: লগইন হবে শুধু যদি OTP যায়: l → o
- S4: পাসওয়ার্ড ঠিক হলে লগইন হবে: ¬w → l
- S5 (একটি ঘটনা): অ্যাকাউন্টটি লক। S6 (আরেকটি ঘটনা): পাসওয়ার্ড ঠিক ছিল।
from itertools import product
imp = lambda a, b: (not a) or b
# w = ভুল পাসওয়ার্ড, k = অ্যাকাউন্ট লক, o = OTP গেছে, l = লগইন হলো
specs = {
"S1 w -> not l": lambda w, k, o, l: imp(w, not l),
"S2 k -> not o": lambda w, k, o, l: imp(k, not o),
"S3 l -> o": lambda w, k, o, l: imp(l, o),
"S4 not w -> l": lambda w, k, o, l: imp(not w, l),
"S5 k": lambda w, k, o, l: k,
"S6 not w": lambda w, k, o, l: not w,
}
def check(names):
sols = [row for row in product([True, False], repeat=4)
if all(specs[s](*row) for s in names)]
tag = "consistent" if sols else "INCONSISTENT"
print(f"{len(names)} specs: {tag}, {len(sols)} assignment(s)")
for w, k, o, l in sols:
print(f" w={w!s:5} k={k!s:5} o={o!s:5} l={l!s:5}")
check(list(specs)[:4])
check(list(specs)[:5])
check(list(specs)[:6])আসল আউটপুট (ব্রাউজারের Python):
4 specs: consistent, 4 assignment(s)
w=True k=True o=False l=False
w=True k=False o=True l=False
w=True k=False o=False l=False
w=False k=False o=True l=True
5 specs: consistent, 1 assignment(s)
w=True k=True o=False l=False
6 specs: INCONSISTENT, 0 assignment(s)
S1–S4 একসঙ্গে মেলে ১৬টির ৪টি সারিতে। অ্যাকাউন্ট লক (S5) যোগ করলে একটিমাত্র সারি বাকি থাকে, আর তাতে w = True: লক অ্যাকাউন্টে নিয়মগুলো চায় পাসওয়ার্ড ভুল হোক! কারণটি হাতে দেখা যায়: k থেকে S2 দিয়ে ¬o, S3-এর contrapositive দিয়ে ¬l, আর S4-এর contrapositive দিয়ে w. তাই লক অ্যাকাউন্টের মালিক সঠিক পাসওয়ার্ড দিলে (S6) কোনো সারিই টেকে না: নিয়মগুলো পরস্পরবিরোধী। সমাধান নিয়ম বদলানো, যেমন S4-কে লিখুন “পাসওয়ার্ড ঠিক আর অ্যাকাউন্ট লক নয় হলে লগইন হবে”: (¬w ∧ ¬k) → l. সব সারি ঘুরে দেখা ৪টি variable-এ সহজ; শত শত variable-এ এই একই প্রশ্নই SAT, যা পর্ব ০৩ আর ০৭-এ আসবে।
৬ · Bit operation — একসঙ্গে অনেকগুলো truth table
কম্পিউটার T আর F রাখে 1 আর 0 হিসেবে, একেকটি bit-এ। একটি bit string হলো এমন বিটের সারি, যেমন 10110110 (দৈর্ঘ্য ৮)। সমান দৈর্ঘ্যের দুটি bit string-এর প্রতিটি অবস্থানে আলাদা করে ∧, ∨ বা ⊕ খাটালে পাওয়া যায় bitwise AND, OR আর XOR. অর্থাৎ ৮ বিটের একটি bitwise operation মানে একসঙ্গে ৮টি আলাদা truth table-এর সারি, আর CPU সাধারণত পুরো word-এর সব বিট একটিমাত্র নির্দেশে করে।
| ক্রিয়া | ফল | নিয়ম (প্রতিটি অবস্থানে) |
|---|---|---|
| a | 1011 0110 | — |
| b | 0110 0011 | — |
| a AND b | 0010 0010 | দুটোই 1 হলে 1 |
| a OR b | 1111 0111 | অন্তত একটি 1 হলে 1 |
| a XOR b | 1101 0101 | আলাদা হলে 1 |
| NOT a (৮ বিটে) | 0100 1001 | উল্টে দিন |
একটি বাস্তব ব্যবহার bitmask: বাজারঘরের প্রতিটি কর্মীর অনুমতিগুলো একটি সংখ্যার বিটে রাখা হয়, যেমন বিট ০ = অর্ডার দেখা, বিট ১ = পণ্য সম্পাদনা, বিট ২ = টাকা ফেরত, বিট ৩ = অ্যাডমিন। “এই কর্মী টাকা ফেরত দিতে পারেন কি?” প্রশ্নটি হলো mask AND 0100 শূন্য কি না। আর XOR দিয়ে একটি বিট টগল করা যায়, কারণ x ⊕ k ⊕ k = x (প্রতিটি বিটে k = 1 হলে দুবার উল্টে আগের জায়গায়, k = 0 হলে কিছুই বদলায় না)।
a = 0b10110110
b = 0b01100011
for name, v in [("a", a), ("b", b), ("a & b", a & b),
("a | b", a | b), ("a ^ b", a ^ b), ("~a & 0xFF", ~a & 0xFF)]:
print(f"{name:10} {v:08b}")
# বাজারঘরের staff permission: প্রতিটি বিট একটি অনুমতি
VIEW, EDIT, REFUND, ADMIN = 0b0001, 0b0010, 0b0100, 0b1000
roles = {"packer": VIEW, "support": VIEW | REFUND,
"manager": VIEW | EDIT | REFUND}
print()
for role, mask in roles.items():
can_refund = (mask & REFUND) != 0
print(f"{role:8} {mask:04b} refund? {can_refund}")
support = roles["support"]
print("support ^ REFUND ->", format(support ^ REFUND, "04b")) # অনুমতি টগল
# x ^ k ^ k == x : সব 8-বিট x আর k-তে
print("x^k^k == x for all 8-bit x, k:",
all(x ^ k ^ k == x for x in range(256) for k in range(256)))আসল আউটপুট (ব্রাউজারের Python):
a 10110110
b 01100011
a & b 00100010
a | b 11110111
a ^ b 11010101
~a & 0xFF 01001001
packer 0001 refund? False
support 0101 refund? True
manager 0111 refund? True
support ^ REFUND -> 0001
x^k^k == x for all 8-bit x, k: True
প্রথম ছয় লাইন উপরের টেবিল মেলায়। ~a একা লিখলে Python ঋণাত্মক সংখ্যা দেয় (Python-এর int-এর দৈর্ঘ্য নির্দিষ্ট নয়), তাই & 0xFF দিয়ে শুধু নিচের ৮ বিট রাখা হয়েছে। support-এর mask 0101-এ বিট ২ চালু, তাই refund সম্ভব; XOR দিয়ে সেই বিট টগল করলে থাকে শুধু 0001. শেষ লাইন 256 × 256 = 65,536টি জোড়ায় x ⊕ k ⊕ k = x যাচাই করেছে; প্রমাণটি এক লাইনের: প্রতিটি বিটে k ⊕ k = 0 আর x ⊕ 0 = x. বাইনারি সংখ্যার পরিচয় কম্পিউটার ফান্ডামেন্টালস ও ICT কোর্সের পর্ব ১৭-এ, আর gate হিসেবে এই ক্রিয়াগুলো একই কোর্সের পর্ব ২০-এ।
Python-এ and/or আর &/| আলাদা। and short-circuit করে (বাঁ দিক মিথ্যা হলে ডান দিক দেখেই না) আর একটি operand ফেরত দেয়; & পূর্ণসংখ্যার প্রতিটি বিটে কাজ করে, দুই দিকই হিসাব করে। bool-এর ক্ষেত্রে p != q হলো p ⊕ q, আর p == q হলো p ↔ q.
৭ · যুক্তির ধাঁধা — সাধু আর ঠগের চর
পদ্মার এক চরে দুই ধরনের মানুষ থাকেন: সাধু, যাঁরা সবসময় সত্য বলেন, আর ঠগ, যাঁরা সবসময় মিথ্যা বলেন। ধাঁধার এই ধরনটিকে বলে knights and knaves; গণিতবিদ ও যুক্তিবিদ Raymond Smullyan ১৯৭০-এর দশকের শেষে তাঁর ধাঁধার বইগুলোতে (যেমন ১৯৭৮ সালের What Is the Name of This Book?) এটি জনপ্রিয় করেন।
যুক্তিতে রূপান্তরের চাবিটি একটি লাইনে: a = “A সাধু” ধরলে, A যা বলেন, সেই কথাটি সত্য হয় ঠিক তখন, যখন A সাধু। অর্থাৎ A-এর কথা S হলে a ↔ S. এবার ধাঁধা: চরে দেখা হলো A আর B-এর সঙ্গে। A বললেন, “B ঠগ।” B বললেন, “A আর আমি একই দলের।” কে কী?
1A: "B ঠগ" a ↔ ¬b2B: "একই দল" b ↔ (a ↔ b)3ক্ষেত্র ১: a = T4ক্ষেত্র ২: a = F5সিদ্ধান্ত
| a (A সাধু) | |
| b (B সাধু) | |
| A-এর কথা ¬b | |
| B-এর কথা a ↔ b | |
| অবস্থা |
- সূত্রে লেখা। a = “A সাধু”, b = “B সাধু”। A-এর কথা “B ঠগ” = ¬b, তাই a ↔ ¬b. B-এর কথা “A আর আমি একই দলের” = a ↔ b, তাই b ↔ (a ↔ b). দুটি variable, চারটি সম্ভাব্য ক্ষেত্র; কিন্তু a-র দুই মান ধরে এগোলেই চলে।
- ক্ষেত্র ১: A সাধু (a = T). সাধু সত্য বলেন, তাই তাঁর কথা “B ঠগ” সত্য: b = F.
- ক্ষেত্র ১ যাচাই। B-এর কথা a ↔ b = T ↔ F = F, অর্থাৎ মিথ্যা। B ঠগ, আর ঠগ মিথ্যাই বলেন: কোনো বিরোধ নেই। এই ক্ষেত্রটি টিকে গেল।
- ক্ষেত্র ২: A ঠগ (a = F). ঠগের কথা মিথ্যা, তাই “B ঠগ” মিথ্যা: b = T, B সাধু।
- ক্ষেত্র ২ যাচাই। B-এর কথা a ↔ b = F ↔ T = F. কিন্তু B সাধু, তাঁর কথা মিথ্যা হতে পারে না। বিরোধ, তাই এই ক্ষেত্র বাদ।
- সিদ্ধান্ত। একটিমাত্র ক্ষেত্র টিকেছে: A সাধু, B ঠগ। দুই ক্ষেত্রই সব সম্ভাবনা ঢেকেছে (a হয় T নয় F), তাই উত্তরটি নিশ্চিত এবং অনন্য। এই “সব ক্ষেত্র ধরে দেখা” পদ্ধতিটিই পর্ব ০৯-এর proof by cases.
এবার তিনজনের একটি ধাঁধা, যা হাতে করতে একটু সময় লাগে: A বললেন, “আমাদের তিনজনের মধ্যে অন্তত একজন ঠগ।” B বললেন, “A সাধু হলে C-ও সাধু।” C বললেন, “A ঠগ।” নিচের ব্লক ২-জন আর ৩-জন দুটি ধাঁধাই সব সারি ঘুরে সমাধান করে:
from itertools import product
imp = lambda a, b: (not a) or b
show = lambda ok: "সাধু" if ok else "ঠগ"
# সাধু (knight) সবসময় সত্য বলে, ঠগ (knave) সবসময় মিথ্যা।
# তাই "X সাধু" ↔ "X-এর কথা সত্য"।
def solve(people, says):
found = []
for row in product([True, False], repeat=len(people)):
v = dict(zip(people, row))
if all(v[x] == says[x](v) for x in people):
found.append(v)
return found
two = {"A": lambda v: not v["B"], # A: "B ঠগ"
"B": lambda v: v["A"] == v["B"]} # B: "A আর আমি একই দলের"
for s in solve("AB", two):
print("2 people:", {x: show(t) for x, t in s.items()})
three = {"A": lambda v: not (v["A"] and v["B"] and v["C"]), # "অন্তত একজন ঠগ"
"B": lambda v: imp(v["A"], v["C"]), # "A সাধু হলে C-ও সাধু"
"C": lambda v: not v["A"]} # "A ঠগ"
sols = solve("ABC", three)
print("3 people:", len(sols), "solution(s)")
for s in sols:
print(" ", {x: show(t) for x, t in s.items()})আসল আউটপুট (ব্রাউজারের Python):
2 people: {'A': 'সাধু', 'B': 'ঠগ'}
3 people: 1 solution(s)
{'A': 'সাধু', 'B': 'ঠগ', 'C': 'ঠগ'}
২-জনের ধাঁধায় stepper-এর উত্তরই এলো। ৩-জনের ধাঁধায় ৮টি সারির ঠিক একটি টিকেছে। হাতে যাচাই করুন: A সাধু, তাই “অন্তত একজন ঠগ” সত্য হতে হবে, আর B ও C ঠগ বলে তা সত্য। B ঠগ, তাই “A সাধু হলে C সাধু” মিথ্যা হতে হবে; → মিথ্যা হয় শুধু শর্ত সত্য আর ফল মিথ্যায়, অর্থাৎ A সাধু আর C ঠগ: মিলেছে। C ঠগ, তাঁর কথা “A ঠগ” মিথ্যা: মিলেছে। খেয়াল করুন, B-এর কথাটি পুরোপুরি conditional-এর truth table-এর ওপর দাঁড়িয়ে।
আরও গভীরে: উপপাদ্য ২.১-এর ১৬টি দুই-ইনপুট connective-এর সবগুলোই ¬, ∧ আর ∨ দিয়ে লেখা যায়, এমনকি শুধু NAND দিয়েও; একে বলে functional completeness (পর্ব ০৩)। কোন connective-সেট দিয়ে কী কী লেখা যায়, তার পূর্ণ শ্রেণিবিভাগ Emil Post ১৯৪১ সালে প্রকাশ করেন (যাকে এখন Post's lattice বলা হয়)। আর “একগুচ্ছ সূত্র satisfiable কি না” প্রশ্নটি প্রথম প্রমাণিত NP-complete সমস্যা, যা সাধারণত Stephen Cook-এর ১৯৭১ সালের প্রবন্ধের নামে পরিচিত (Leonid Levin স্বাধীনভাবে প্রায় একই সময়ে); তাই বড় truth table-এর চেয়ে দ্রুত কোনো সাধারণ পদ্ধতি আছে কি না, সেটি P বনাম NP প্রশ্নেরই আরেক রূপ।
পরীক্ষা ও ইন্টারভিউতে: বিশ্ববিদ্যালয়, চাকরি বা ইন্টারভিউর পরীক্ষায় এই ধরনের প্রশ্ন প্রায়ই আসে:
- ৪টি variable-এর truth table-এ কয়টি সারি? 24 = ১৬; আলাদা truth table 216 = 65,536টি।
- “বৃষ্টি হলে খেলা হবে না”-এর contrapositive? “খেলা হলে বৃষ্টি হয়নি” (¬q → ¬p, যেখানে q = “খেলা হবে না”, তাই ¬q = “খেলা হবে”)।
- “p only if q” কোন সূত্র? p → q; উল্টো নয়।
- 1011 XOR 0110? 1101.
- A বলেন “আমরা দুজনেই ঠগ”। A আর B কে? A সাধু হলে কথাটি সত্য হয়ে A নিজেই ঠগ: বিরোধ। তাই A ঠগ, কথাটি মিথ্যা, তাই দুজনেই ঠগ নন: B সাধু।
৮ · AI-এর যুগে — যুক্তির হিসাবে AI সহকারী
AI সহকারী truth table বানাতে, বাক্য অনুবাদ করতে বা ধাঁধা সমাধান করতে খুব দ্রুত। কিন্তু যুক্তির কাজে তার ভুলগুলো আত্মবিশ্বাসী ভঙ্গিতে আসে, আর একটি সারির ভুলেই পুরো সিদ্ধান্ত উল্টে যায়। এই পর্বের বিষয়ে যে ভুলগুলো বেশি দেখা যায়:
| AI-এর ভুল | কীভাবে ধরবেন |
|---|---|
| “p শুধু যদি q”-কে q → p লেখা | একটি সারি বেছে বাস্তব অর্থ মিলিয়ে দেখুন |
| Converse-কে সমার্থক বলা (“আজ ডেলিভারি পেলে অর্ডার ৬টার আগে ছিল”) | p = F, q = T সারিটি পরীক্ষা করুন |
| ৩ variable-এ ৬ বা ৭টি সারি লেখা, বা একটি সারি দুবার | সারি গুনুন: 2ⁿ হতেই হবে |
| Precedence ভুল (p ∨ q ∧ r-কে (p ∨ q) ∧ r পড়া) | বন্ধনী চেয়ে নিন, Python-এ দুই অর্থ তুলনা করুন |
| “অথবা”-কে বিনা প্রশ্নে exclusive ধরা | দুটোই সত্য এমন সারিতে অর্থ জিজ্ঞেস করুন |
| অস্তিত্বহীন বই বা উৎস উদ্ধৃত করা | লেখক, বছর আর শিরোনাম নিজে খুঁজে দেখুন |
AI-কে যুক্তির কাজ দিলে উত্তরের সঙ্গে যাচাইয়ের উপায়ও চেয়ে নিন। নিচের কাঠামো কাজে দেয়:
AI-এর যুক্তি হাতে পেলে — যাচাইয়ের চেকলিস্ট
Logic-কে AI কীভাবে ব্যবহার করে (knowledge base, inference, resolution), তা AI-এর ভিত্তি আর Python for AI কোর্সের পর্ব ৪৫ আর পর্ব ৪৬-এ আছে; এখানে আমরা তার নিচের গণিতটুকু দেখলাম।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন, তারপর “→ উত্তর” চাপুন।
প্র ০১“শর্ত মিথ্যা হলে p → q সত্য” — এই নিয়ম কি শুধু সুবিধার জন্য বানানো? অন্য কোনো সংজ্ঞা কি সম্ভব ছিল?
প্রশ্নটি দুই হাজার বছরেরও বেশি পুরোনো। প্রাচীন গ্রিসের Megara ঘরানার দার্শনিক Philo-র নামে যে সংজ্ঞা প্রচলিত, তা প্রায় আজকের material implication: “যদি p তবে q” মিথ্যা শুধু তখন, যখন p সত্য আর q মিথ্যা। তাঁর সমসাময়িক Diodorus Cronus আরও কড়া সংজ্ঞা চেয়েছিলেন বলে ইতিহাসবিদরা লেখেন। প্রাচীন এক কবির কথিত উক্তি, “কাকেরাও ছাদে বসে বসে তর্ক করে কোন conditional সত্য”, এই বিতর্কের তীব্রতা বোঝায়।
আমরা অন্য সংজ্ঞা কেন নিই না? চারটি সারির মধ্যে তিনটি প্রায় সবাই মেনে নেন: T T-তে সত্য, T F-এ মিথ্যা। বাকি F T আর F F-এ যদি মিথ্যা বসাই, তবে → হয়ে যায় ∧, যা “যদি” নয়। যদি F T-তে মিথ্যা আর F F-এ সত্য বসাই, তবে → হয় ↔, তখন “যদি বৃষ্টি হয় তবে মাটি ভেজে” বাক্যটি পাইপ ফেটে মাটি ভেজার দিনে মিথ্যা হয়ে যেত। একমাত্র যে টেবিল “যদি”-র প্রতিশ্রুতি-অর্থ রাখে আর সত্য-মিথ্যার ফাংশনও থাকে, সেটিই material implication.
গণিতের প্রয়োজন: “প্রতিটি n-এর জন্য, যদি n জোড় হয় তবে n² জোড়” — এই উপপাদ্য বিজোড় n-এর জন্যও সত্য হতে হবে, নইলে উপপাদ্যই মিথ্যা হয়ে যেত। বিজোড় n-এ শর্ত মিথ্যা, তাই বাক্যটি ফাঁকাভাবে সত্য। ফাঁকা সত্য না থাকলে প্রায় কোনো “সব”-ওয়ালা উপপাদ্য টিকত না। একই কারণে Python-এর all([]) True দেয়।
বিকল্প আছে: বিংশ শতাব্দীতে C. I. Lewis-এর strict implication, পরে relevance logic আর conditional logic তৈরি হয়েছে, যেখানে p আর q-এর মধ্যে কোনো সম্পর্ক বা প্রয়োজনীয়তা দাবি করা হয়। দর্শন আর ভাষাবিজ্ঞানে এগুলো কাজের, কিন্তু গণিত আর প্রোগ্রামিং চলে material implication-এ।
মূল উপলব্ধি: p → q কোনো কারণ-ফলের দাবি নয়, এটি “T F সারি ঘটবে না” এই একটিমাত্র নিশ্চয়তা। এই সংকীর্ণ অর্থের জন্যই গণিতের উপপাদ্য আর প্রোগ্রামের শর্ত একই নিয়মে চলে।
প্র ০২গণিতে “অথবা” সবসময় inclusive কেন? Boole নিজে কোনটি ব্যবহার করতেন?
ইতিহাসটি মজার। George Boole তাঁর ১৮৪৭ আর ১৮৫৪ সালের বইয়ে শ্রেণি (class) যোগ করার চিহ্ন + ব্যবহার করতেন, কিন্তু x + y-কে অর্থপূর্ণ ধরতেন মূলত তখন, যখন x আর y-এর কোনো সাধারণ সদস্য নেই। অর্থাৎ তাঁর “অথবা” অনেকটা exclusive-এর কাছাকাছি ছিল; আর x + x-এর মতো রাশিকে তিনি স্বাভাবিক অর্থ দিতে পারতেন না। ইংরেজ যুক্তিবিদ ও অর্থনীতিবিদ William Stanley Jevons ১৮৬৪ সালের Pure Logic বইয়ে inclusive অর্থের পক্ষে জোরালো যুক্তি দেন, যেখানে x + x = x. পরবর্তী যুক্তিবিদরা মোটামুটি Jevons-এর পথই নেন বলে ইতিহাসে লেখা হয়।
Inclusive কেন জিতল? প্রথমত, এর বীজগণিত সুন্দর: ∨ আর ∧ একে অপরের প্রতিবিম্ব (duality), De Morgan-এর নিয়ম ¬(p ∨ q) = ¬p ∧ ¬q সরাসরি খাটে, আর ∨ ছোট-বড় ক্রমে “সর্বোচ্চ” (max) হিসেবে কাজ করে। দ্বিতীয়ত, exclusive-কে inclusive দিয়ে সহজে লেখা যায়: p ⊕ q = (p ∨ q) ∧ ¬(p ∧ q). তৃতীয়ত, ⊕-এর নিজের সুন্দর বীজগণিত আছে: এটি ২-ভিত্তিক যোগ (mod 2), যা পর্ব ৭১-এর GF(2) আর পর্ব ৭২-এর error-correcting code-এর ভাষা। তাই দুটোই রাখা হয়েছে, আলাদা চিহ্নে।
বাস্তবে বিপদ: আইন, চুক্তি আর সফটওয়্যারের চাহিদাপত্রে “or” নিয়ে বিরোধ বহু পুরোনো। আইনি লেখায় “and/or” জাতীয় শব্দ এসেছে এই অস্পষ্টতা দূর করতে, যদিও অনেক বিচারক আর লেখক নিজেই “and/or” ব্যবহারের সমালোচনা করেছেন। বাজারঘরের “ক্যাশ অন ডেলিভারি অথবা কার্ডে পেমেন্ট” লাইনটি পড়ে কোনো ক্রেতা অর্ধেক ক্যাশ আর অর্ধেক কার্ডে দিতে চাইলে কী হবে, নিয়মে তা স্পষ্ট নেই।
মূল উপলব্ধি: ভাষার “অথবা” প্রসঙ্গনির্ভর, গণিতের ∨ নয়। লেখার সময় দুটোই সত্য এমন একটি উদাহরণ মাথায় রেখে প্রশ্ন করুন, “এই ক্ষেত্রে কী হবে?” উত্তরটিই বলে দেবে ∨ না ⊕।
প্র ০৩Truth table-এর গণিত কীভাবে আজকের কম্পিউটারের সার্কিটে পৌঁছাল?
Boole-এর বীজগণিত প্রায় আশি বছর মূলত দর্শন আর গণিতের বিষয় ছিল। বড় সেতুটি তৈরি হয় ১৯৩৭ সালে, যখন MIT-র তরুণ ছাত্র Claude Shannon তাঁর master's thesis A Symbolic Analysis of Relay and Switching Circuits লেখেন (প্রবন্ধ আকারে ১৯৩৮ সালে প্রকাশিত)। তিনি দেখান, টেলিফোন এক্সচেঞ্জের relay সুইচ সিরিজে বসালে তা ∧-এর মতো আচরণ করে (দুটোই বন্ধ হলে তবেই বিদ্যুৎ যায়), প্যারালালে বসালে ∨-এর মতো। ফলে জটিল সার্কিট নকশাকে Boolean সূত্র হিসেবে লেখা, সরল করা আর যাচাই করা সম্ভব হলো। কাছাকাছি সময়ে জাপানে Akira Nakashima-ও একই ধরনের কাজ করেছিলেন বলে ইতিহাসবিদরা উল্লেখ করেন।
আজ একটি CPU-র ALU যখন দুটি ৬৪-বিট সংখ্যার AND করে, সেটি আসলে ৬৪টি আলাদা ∧-এর truth table একসঙ্গে খাটানো: প্রতিটি বিটের জন্য একটি ছোট gate. যোগ করার সার্কিটও আসলে ⊕ আর ∧-এর সমন্বয়: দুই বিটের যোগফলের বিট হলো a ⊕ b, আর হাতে-থাকা (carry) হলো a ∧ b. এভাবে এই পর্বের টেবিলগুলোই কোটি কোটি transistor-এর নকশার মূল ভাষা।
Hardware-এর দিকটি (gate, transistor, সার্কিট সরল করা) কম্পিউটার ফান্ডামেন্টালস ও ICT কোর্সের পর্ব ১৯ আর কম্পিউটার আর্কিটেকচার ও ডিজিটাল লজিক কোর্সের পর্ব ০৭-এ বিস্তারিত আছে। এই কোর্সে আমরা Boolean algebra-কে বীজগণিত হিসেবে দেখব পর্ব ৬৯-এ: কোন সূত্রগুলো সব Boolean algebra-য় খাটে, আর কেন।
একটি সূক্ষ্ম বিষয়: সার্কিটে সময় আছে, যুক্তিতে নেই। Gate-এর আউটপুট বদলাতে ন্যানোসেকেন্ড লাগে, আর দুই পথের সময়ের পার্থক্যে ক্ষণিকের ভুল সংকেত (glitch) তৈরি হতে পারে। Truth table বলে “শেষে কী হবে”, সার্কিট-ডিজাইনারকে “মাঝপথে কী হবে” সেটাও ভাবতে হয়।
মূল উপলব্ধি: একটি গাণিতিক ভাষা যখন কোনো যন্ত্রের আচরণের সঙ্গে হুবহু মিলে যায়, তখন যন্ত্রের নকশা গণিতের কাজ হয়ে যায়। Shannon-এর thesis তার সবচেয়ে প্রভাবশালী উদাহরণগুলোর একটি।
প্র ০৪“এই বাক্যটি মিথ্যা” proposition নয় কেন? এই ধাঁধা গণিতকে কী শিখিয়েছে?
ধরুন বাক্যটির নাম L: “L মিথ্যা।” L সত্য ধরলে তার দাবি মানতে হয়, অর্থাৎ L মিথ্যা: বিরোধ। L মিথ্যা ধরলে তার দাবি “L মিথ্যা” সত্য হয়ে যায়, অর্থাৎ L সত্য: আবার বিরোধ। কোনো মানই বসানো যায় না, তাই proposition-এর সংজ্ঞা (ঠিক একটি মান) এখানে খাটে না। যুক্তির ভাষায়, L মানে L ↔ ¬L, আর এই সূত্র কোনো সারিতেই সত্য নয়: এটি unsatisfiable.
এর পুরোনো রূপ প্রাচীন গ্রিসে পাওয়া যায়: ক্রিটের Epimenides “সব ক্রিটবাসী মিথ্যাবাদী” বলেছিলেন বলে প্রচলিত, যদিও সূক্ষ্মভাবে দেখলে সেটি পুরোপুরি paradox নয় (অন্তত একজন ক্রিটবাসী কখনো সত্য বললেই বাক্যটি শুধু মিথ্যা হয়)। বিশুদ্ধ রূপটি, “আমি এখন মিথ্যা বলছি”, Eubulides-এর নামে প্রচলিত।
গণিতে প্রভাব: বিংশ শতাব্দীর শুরুতে Bertrand Russell সেট তত্ত্বে একই ধরনের আত্ম-উল্লেখের বিরোধ খুঁজে পান (Russell's paradox, ১৯০১ সালের দিকে), যা সেট তত্ত্বকে নতুন করে সাজাতে বাধ্য করে। ১৯৩১ সালে Kurt Gödel “এই বাক্যটি প্রমাণযোগ্য নয়” ধরনের একটি গাণিতিক বাক্য বানিয়ে তাঁর incompleteness theorem প্রমাণ করেন; “মিথ্যা”-র জায়গায় “প্রমাণযোগ্য নয়” বসানোয় বিরোধের বদলে গভীর একটি সত্য বেরিয়ে আসে। Alfred Tarski ১৯৩০-এর দশকে দেখান, যথেষ্ট শক্তিশালী কোনো ভাষা নিজের ভেতরে নিজের “সত্য” সংজ্ঞায়িত করতে পারে না।
কম্পিউটার বিজ্ঞানে: একই আত্ম-উল্লেখের কৌশল পর্ব ১৮-এর Cantor-এর diagonal argument আর পর্ব ৭৫-এর halting problem-এর প্রমাণে কাজ করে: “নিজের সম্পর্কে উল্টো কথা বলে” এমন একটি বস্তু বানিয়ে দেখানো যে কোনো তালিকা বা কোনো প্রোগ্রাম সব কিছু ধরতে পারে না।
মূল উপলব্ধি: Propositional logic নিরাপদ, কারণ এর বাক্যগুলো নিজের সম্পর্কে কথা বলতে পারে না। ভাষা যত শক্তিশালী হয়, আত্ম-উল্লেখের দরজা তত খোলে, আর সেখানেই গণিতের সবচেয়ে গভীর সীমাগুলো দেখা যায়।
প্র ০৫সব সারি ঘুরে দেখা পদ্ধতি (brute force) কতদূর চলে? বড় নিয়মের তালিকা বা ধাঁধায় কী করা হয়?
n-টি variable-এ সারি 2ⁿ. প্রতি সেকেন্ডে একশো কোটি (10⁹) সারি যাচাই করতে পারে এমন যন্ত্র ধরি। n = 30-এ সারি প্রায় 1.07 × 10⁹, এক সেকেন্ডের মতো। n = 50-এ প্রায় 1.13 × 1015, অর্থাৎ প্রায় ১৩ দিন। n = 100-এ প্রায় 1.27 × 1030, যা মহাবিশ্বের বয়সের চেয়েও বহু গুণ বেশি সময় নেবে। অথচ একটি 9 × 9 সুডোকুকে যুক্তিতে লিখলে সাধারণ encoding-এ ৭২৯টি variable লাগে, আর বাস্তবের chip বা সফটওয়্যার যাচাইয়ে লাখো variable.
তবু কাজ চলে কেন? ১৯৬০-এর দশকে Davis, Putnam, Logemann আর Loveland যে পদ্ধতি দেন (DPLL), তা সব সারি না ঘুরে চালাক অনুমান আর “এক জায়গায় মান বসালে অন্য জায়গায় কী বাধ্য হয়” তা ছড়িয়ে দেয় (unit propagation). ১৯৯০-এর দশকের শেষ থেকে conflict-driven clause learning (CDCL) যোগ হয়ে আধুনিক SAT solver বাস্তবের অনেক বিশাল সমস্যা দ্রুত সমাধান করে। এগুলো পর্ব ০৭ আর পর্ব ৭৭-এ হাতে-কলমে দেখবেন।
কিন্তু সীমা আছে: SAT একটি NP-complete সমস্যা (সাধারণত Cook ১৯৭১ আর Levin-এর কাজের নামে)। সব ক্ষেত্রে 2ⁿ-এর চেয়ে মৌলিকভাবে দ্রুত কোনো পদ্ধতি আছে কি না, কেউ জানে না; এটিই P বনাম NP প্রশ্ন, যার আলগোরিদমিক দিক DSA কোর্সের পর্ব ৬৪-এ আছে। বাস্তবের সমস্যায় গঠন থাকে বলে solver ভালো চলে, কিন্তু খারাপ ক্ষেত্রও বানানো যায়।
Knights-and-knaves-এর শিক্ষা: প্রতিটি মানুষের কথা হলো a ↔ S. এই সূত্রগুলো একসঙ্গে satisfiable কি না, কয়টি সমাধান, সেটিই ধাঁধা। একটিমাত্র সমাধান থাকলে ধাঁধা “ভালো”; শূন্য সমাধান মানে কথাগুলো পরস্পরবিরোধী, ঠিক যেমন বাজারঘরের লগইন নিয়মে দেখলেন। ধাঁধা বানানো, নিয়ম যাচাই আর chip যাচাই একই গাণিতিক প্রশ্ন।
মূল উপলব্ধি: ছোট n-এ brute force সবচেয়ে বিশ্বস্ত যাচাই; বড় n-এ গাণিতিক কাঠামো আর চালাক অনুসন্ধান লাগে। কোথায় সীমা টানতে হয়, তা জানাই এই কোর্সের একটি মূল দক্ষতা।
অনুশীলন
আগে খাতায় করুন, তারপর উত্তর খুলে মেলান।
-
প্রমাণ: প্রমাণ করুন যে p ↔ q-এর মান প্রতিটি মান-বসানোয় (p → q) ∧ (q → p)-এর মানের সমান। Truth table না লিখে “কখন মিথ্যা” পদ্ধতিতে করুন।
- ↔-এর সংজ্ঞায় p ↔ q মিথ্যা ঠিক তখন, যখন p আর q-এর মান আলাদা: (p, q) = (T, F) অথবা (F, T).
- ∧-এর সংজ্ঞায় (p → q) ∧ (q → p) মিথ্যা ঠিক তখন, যখন অন্তত একটি অংশ মিথ্যা।
- →-এর সংজ্ঞায় p → q মিথ্যা শুধু (T, F)-এ, আর q → p মিথ্যা শুধু q = T, p = F-এ, অর্থাৎ (F, T)-এ।
- তাই ডান দিক মিথ্যা ঠিক (T, F) অথবা (F, T)-এ, যা ধাপ ১-এর শর্তের হুবহু এক।
- দুই দিক একই সারিগুলোতে মিথ্যা, বাকি সব সারিতে দুটোই সত্য; তাই প্রতিটি সারিতে মান সমান। ∎
-
হিসাব: (ক) x = 1101 0110 আর y = 0111 1001 হলে x AND y, x OR y, x XOR y বের করুন। (খ) ৫টি variable-এর truth table-এ কয়টি সারি, আর কয়টি আলাদা truth table সম্ভব? (গ) বাজারঘরের কুপন-শর্ত b ∧ (n ∨ a) ∧ ¬f b, n, a, f-এর ১৬টি সারির কয়টিতে সত্য?
(ক) প্রতিটি অবস্থানে আলাদা করে: AND =
0101 0000, OR =1111 1111, XOR =1010 1111. যাচাই: XOR-এ 1 যেখানে দুই বিট আলাদা, আর OR-এ 1 যেখানে অন্তত একটি 1.(খ) সারি 25 = ৩২; আলাদা truth table 232 = 4,294,967,296টি।
(গ) সত্য হতে হলে b = T আর f = F বাধ্যতামূলক; বাকি n, a-এর চারটি জোড়ার মধ্যে n ∨ a সত্য তিনটিতে (শুধু n = F, a = F বাদে)। তাই ৩টি সারি। গুণের নিয়মে: 1 × 3 × 1 = 3.
-
আউটপুট অনুমান: কোড না চালিয়ে বলুন কী ছাপা হবে, তারপর যেকোনো Python-এ চালিয়ে মেলান।
for p in (True, False): for q in (True, False): print(p, q, p <= q, (not p) or q, p != q) print(all([]), any([]))True True True True False True False False False True False True True True True False False True True False True FalsePython-এ bool আসলে 1 আর 0, তাই
p <= qমিথ্যা শুধু p = 1, q = 0-এ: ঠিক p → q-এর truth table, আর তৃতীয় ও চতুর্থ কলাম তাই হুবহু মেলে।p != qহলো XOR. শেষ লাইনেall([])True (ফাঁকা সত্য: ভাঙার মতো কোনো উপাদান নেই) আরany([])False (সত্য এমন কোনো উপাদান নেই)। তবে কোডে → বোঝাতেp <= qনা লিখে(not p) or qলেখাই ভালো; পড়তে স্পষ্ট। -
প্রমাণের ভুল ধরুন: একজন লিখলেন, “দাবি: p → q আর তার converse q → p সবসময় সমান মান দেয়। প্রমাণ: p = T ধরি। তখন p → q-এর মান q-এর মান, আর q → p = q → T = T… না, আবার দেখি: p = T, q = T হলে দুটোই T; p = T, q = F হলে p → q = F, আর q → p = F → T = T… ধুর, এটা বাদ দিই। p = F, q = F হলে দুটোই T. সব পরীক্ষিত ক্ষেত্রে মিলেছে, তাই দাবি সত্য। ∎” ভুলগুলো কোথায়?
- অস্বস্তিকর ক্ষেত্র বাদ দেওয়া: (T, F) সারিতে দুই মান আলাদা (F আর T) দেখেও সেটি বাদ দেওয়া হয়েছে। একটিমাত্র counterexample-ই দাবিটি মিথ্যা প্রমাণ করে।
- সব ক্ষেত্র না দেখা: (F, T) সারি একবারও দেখা হয়নি; সেখানেও p → q = T আর q → p = F. দুই variable-এ ৪টি সারি, তিনটি নয়।
- “পরীক্ষিত ক্ষেত্রে মিলেছে, তাই সত্য”: কিছু উদাহরণ মিলে যাওয়া প্রমাণ নয়; সব ক্ষেত্র ঢাকতে হয়, অথবা একটি সাধারণ যুক্তি দিতে হয়।
সঠিক সিদ্ধান্ত: দাবিটি মিথ্যা। p → q-এর সমার্থক হলো contrapositive ¬q → ¬p, converse নয়। Converse ভুলভাবে ব্যবহার করাকে পর্ব ০৬-এ “affirming the consequent” নামের fallacy হিসেবে দেখবেন।
নিজেকে যাচাই করুন
ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।
ক্রমএকটি নিয়ম-বাক্যকে সূত্রে অনুবাদের ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)
- মৌলিক proposition খুঁজে প্রতিটিকে একটি অক্ষর দেওয়া
- “এবং”, “অথবা”, “না”, “যদি” জাতীয় connective-এর শব্দ চিহ্নিত করা
- “শুধু যদি” দেখে → চিহ্নের দিক ঠিক করা
- অস্পষ্ট জায়গায় বন্ধনী ঠিক করা, দরকারে নিয়মের মালিককে জিজ্ঞেস করা
- একটি বাস্তব সারি বসিয়ে সূত্রের অর্থ পরীক্ষা করা
নিচের কোনটি proposition?
- আপনার পার্সেল কি এসেছে?
- x + 2 = 7
- 9 একটি মৌলিক সংখ্যা।
- অনুগ্রহ করে দরজা বন্ধ করুন।
p → q কোন ক্ষেত্রে মিথ্যা?
- p = F, q = T
- p = T, q = F
- p = F, q = F
- p = T, q = T
“যদি অর্ডার বাতিল হয়, তবে টাকা ফেরত যাবে” — এর সমার্থক বাক্য কোনটি?
- যদি টাকা ফেরত যায়, তবে অর্ডার বাতিল হয়েছে
- যদি অর্ডার বাতিল না হয়, তবে টাকা ফেরত যাবে না
- অর্ডার বাতিল হয়েছে এবং টাকা ফেরত গেছে
- যদি টাকা ফেরত না যায়, তবে অর্ডার বাতিল হয়নি
c = “ক্রেতা ফ্রি ডেলিভারি পান”, m = “ক্রেতা সদস্য”। “ক্রেতা ফ্রি ডেলিভারি পান শুধু যদি তিনি সদস্য হন” — কোন সূত্র?
- c → m
- m → c
- c ↔ m
- c ∧ m
p, q, r, s — চারটি variable-এর একটি সূত্রের truth table-এ কয়টি সারি থাকবে?
- ৮
- ১২
- ১৬
- ৬৫,৫৩৬
একটি দ্বীপে সাধু সবসময় সত্য আর ঠগ সবসময় মিথ্যা বলেন। A বললেন, “আমি ঠগ।” এ থেকে কী বলা যায়?
- A সাধু
- এমন কথা এই দ্বীপের কেউ বলতে পারেন না
- A ঠগ
- A সাধু বা ঠগ দুটোই হতে পারেন
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন, অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:
মনে রাখুন
- Proposition = ঠিক একটি মান (T বা F) আছে এমন ঘোষণা; প্রশ্ন, আদেশ, অজানা x আর liar paradox বাদ।
- n-টি variable-এ 2ⁿ সারি, আর আলাদা truth table 22ⁿটি; ∨ inclusive, ⊕ exclusive.
- p → q মিথ্যা শুধু T F সারিতে; contrapositive ¬q → ¬p সমার্থক, converse আর inverse নয়।
- “p শুধু যদি q” = p → q; precedence ¬, ∧, ∨, →, ↔; সন্দেহ হলেই বন্ধনী।
- Bitwise ক্রিয়া, নিয়মের consistency আর knights-and-knaves — সবই সব সারি ঘুরে দেখা যায়, যতক্ষণ variable কম।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ০৩ · Logical equivalence — De Morgan, normal form আর satisfiabilityপরবর্তী পর্ব≡-এর নিয়ম, CNF/DNF আর SAT-এর প্রথম পরিচয়।
- ডিসক্রিট ম্যাথমেটিক্স · কোর্স হোম৮৩টি পর্বপুরো কোর্সের মানচিত্র আর ১৪টি মডিউল।
- AI-এর ভিত্তি · পর্ব ৪৫ · Propositional logicAI-তে যুক্তিKnowledge base, inference আর resolution কীভাবে AI agent-এ কাজ করে।
- কম্পিউটার ফান্ডামেন্টালস · পর্ব ২০ · লজিক গেটHardwareএকই truth table যখন transistor-এর সার্কিট।
- DSA · পর্ব ০৩ · অ্যালগরিদম ঠিক কি নাপ্রমাণের ব্যবহারLoop invariant আর induction দিয়ে অ্যালগরিদমের সঠিকতা।