এই পর্বে যা শিখবেন
- AND, OR, NOT আর XOR, XNOR, NAND, NOR-এর truth table, সুইচের উপমা আর চিহ্নের নিয়ম (precedence)
- Huntington-এর postulate থেকে প্রধান সূত্রগুলো, আর সেগুলো truth table ও বীজগণিত দুইভাবে প্রমাণ করা
- duality principle, আর প্রতিটি ধাপের কারণ লিখে পরীক্ষার ধাঁচে expression সরল করা
- minterm, maxterm, Σm, ΠM, canonical SOP ও POS — truth table থেকে এক রূপ থেকে আরেক রূপে যাওয়া
- functional completeness, n চলকের মোট function সংখ্যা ২২ⁿ, আর প্রোগ্রামিংয়ে De Morgan ও short-circuit
১ · Boole থেকে Shannon — যুক্তির গণিত কীভাবে সুইচে নামল
আগের পর্বগুলোতে আমরা bit-কে দেখেছি তথ্য রাখার একক হিসেবে — সংখ্যা, অক্ষর, রং। এবার একই বিট দিয়ে সিদ্ধান্ত নেওয়ার পালা। “দরজা বন্ধ এবং চাবি ঘোরানো হলে গাড়ি চলবে”, “বৃষ্টি হলে অথবা রোদ চড়া হলে ছাতা নেব”, “লোডশেডিং না হলে পাখা ঘুরবে” — এই প্রতিটি বাক্যের উত্তর হয় “হ্যাঁ” নয়তো “না”। এমন হ্যাঁ-না প্রশ্নের হিসাব করার গণিতের নাম Boolean algebra.
নামটি এসেছে ইংরেজ গণিতবিদ George Boole-এর নাম থেকে। তিনি ১৮৪৭ সালে একটি ছোট বই আর ১৮৫৪ সালে An Investigation of the Laws of Thought প্রকাশ করেন। Boole-এর লক্ষ্য ছিল মানুষের যুক্তিকে বীজগণিতের মতো সমীকরণে লেখা — “সত্য” আর “মিথ্যা”-কে ১ আর ০ ধরে। প্রায় একই সময়ে Augustus De Morgan যুক্তির কিছু নিয়ম নিয়ে কাজ করছিলেন, যার দুটি আজ তাঁর নামে পরিচিত। পরের কয়েক দশকে অন্য গণিতবিদেরা (যেমন Jevons, Peirce, Schröder) এই ব্যবস্থাকে আরও গুছিয়ে তোলেন, আর ১৯০৪ সালে Edward Huntington এর জন্য একটি পরিচ্ছন্ন postulate-সেট লেখেন, যা আমরা অংশ ৪-এ দেখব।
প্রায় আশি বছর এটি ছিল দর্শন আর বিশুদ্ধ গণিতের বিষয়। মোড় ঘোরে ১৯৩৭ সালে। MIT-র তরুণ ছাত্র Claude Shannon তাঁর master's thesis-এ (পরের বছর A Symbolic Analysis of Relay and Switching Circuits নামে প্রকাশিত) দেখান যে টেলিফোন এক্সচেঞ্জের relay-ভরা জটিল switching circuit-কে Boolean algebra দিয়ে লেখা, সরল করা আর নকশা করা যায়। সাধারণভাবে বলা হয়, এই কাজটি digital circuit নকশাকে “অভিজ্ঞতার কারিগরি” থেকে “হিসাবের বিজ্ঞানে” নিয়ে আসে। ইতিহাসবিদেরা অবশ্য মনে করিয়ে দেন, প্রায় একই সময়ে জাপানে Akira Nakashima আর সোভিয়েত ইউনিয়নে Victor Shestakov-ও স্বাধীনভাবে কাছাকাছি ধারণায় পৌঁছেছিলেন বলে জানা যায়।
একটি সুইচ হয় চালু (1) নয়তো বন্ধ (0). একটি transistor-ও আসলে ভোল্টেজ দিয়ে চালানো একটি সুইচ। তাই সুইচের যেকোনো জাল — relay, transistor বা ভবিষ্যতের অন্য কিছু — দুই মানের একটি গণিত মেনে চলে। সেই গণিতই Boolean algebra, আর CPU-র প্রতিটি logic gate এর একটি সূত্রের বাস্তব রূপ।
এই পর্বে আমরা পুরো মডিউল ২-এর ভাষা তৈরি করব। পরের পর্ব ০৮-এ এই কাজগুলো transistor দিয়ে কীভাবে gate হয় (CMOS), পর্ব ০৯ আর ১০-এ বড় expression কীভাবে যন্ত্রের মতো নিয়মে সরল করা হয় (K-map, Quine-McCluskey), আর পর্ব ১১–১৩-এ এগুলো দিয়ে adder, multiplexer আর ALU বানানো হবে। ভিত্তি যদি এখানে শক্ত হয়, বাকিটা অনেক সহজ লাগবে।
২ · তিনটি মৌলিক কাজ — AND, OR, NOT আর সুইচের উপমা
একটি Boolean variable (চলক) এমন একটি নাম — A, B, C বা X — যার মান কেবল 0 অথবা 1. এর বাইরে কোনো মান নেই: ০.৫ নেই, −১ নেই, ২ নেই। চলকগুলো নিয়ে তিনটি মৌলিক কাজ করা যায়। প্রতিটি কাজ পুরোপুরি বোঝানো যায় একটি truth table দিয়ে — যেখানে ইনপুটের সব সম্ভাব্য মান সারি ধরে লেখা থাকে, আর পাশে ফল।
| A | B | A · B (AND) | A + B (OR) | A′ (NOT A) |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 1 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 0 |
| 1 | 1 | 1 | 1 | 0 |
- AND (·): ফল 1 কেবল তখন, যখন সব ইনপুট 1. একে “Boolean গুণ” বলা হয়, কারণ 0 আর 1-এর সাধারণ গুণফলের সাথে হুবহু মেলে।
- OR (+): ফল 1, যদি অন্তত একটি ইনপুট 1. একে “Boolean যোগ” বলা হয় — তবে সাবধান, 1 + 1 = 1, ২ নয়। এখানে “+” মানে “অথবা”, পাটিগণিতের যোগ নয়।
- NOT (′): একটি মাত্র ইনপুট, আর ফল তার উল্টো। A′-কে বলে A-এর complement.
সুইচবোর্ড আর বাতি। বাড়ির একটি বাতি আর ব্যাটারির মাঝে দুটি সুইচ A আর B ভাবুন। সুইচ দুটি যদি পরপর (series) বসানো থাকে, বিদ্যুৎ যেতে দুটিকেই চালু থাকতে হবে — এটি AND. আর যদি পাশাপাশি (parallel) বসানো থাকে, যেকোনো একটি চালু হলেই বাতি জ্বলে — এটি OR. সিঁড়ির নিচ আর ওপরের দুটি সুইচে একই বাতি জ্বলা-নেভার পরিচিত ব্যবস্থা (two-way switch) আসলে XOR — সেটি একটু পরেই আসছে। আর NOT হলো এমন এক সুইচ, চাপলে বাতি নেভে — যেমন ফ্রিজের দরজার সুইচ, দরজা বন্ধ (চাপা) থাকলে ভেতরের বাতি বন্ধ।
দুইয়ের বেশি ইনপুটেও একই নিয়ম: A · B · C = 1 কেবল তিনটিই 1 হলে; A + B + C = 0 কেবল তিনটিই 0 হলে। n টি ইনপুটের truth table-এ সারি থাকে ২ⁿ টি — ২ ইনপুটে ৪, ৩ ইনপুটে ৮, ৪ ইনপুটে ১৬. সারিগুলো আমরা সবসময় binary গোনার ক্রমে লিখব (000, 001, 010 …), যাতে সারি নম্বর আর ইনপুটের binary মান একই হয় — এই অভ্যাসটি অংশ ৭-এ খুব কাজে লাগবে।
৩ · বাকি চারটি পরিচিত কাজ, আর এই পর্বের চিহ্ন
তিনটি মৌলিক কাজ জুড়ে আরও চারটি কাজ তৈরি হয়, যেগুলো এত বেশি ব্যবহৃত যে প্রতিটির আলাদা নাম আর আলাদা gate আছে:
| A | B | A ⊕ B (XOR) | (A ⊕ B)′ (XNOR) | (A · B)′ (NAND) | (A + B)′ (NOR) |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 1 | 1 | 1 |
| 0 | 1 | 1 | 0 | 1 | 0 |
| 1 | 0 | 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | 1 | 0 | 0 |
- XOR (exclusive OR): ফল 1, যদি ইনপুট দুটি আলাদা হয়। মৌলিক কাজে লিখলে A ⊕ B = A′B + AB′. বহু ইনপুটে XOR = 1 হয়, যদি বিজোড় সংখ্যক ইনপুট 1 হয় — তাই parity হিসাবে (Computer Networks কোর্সের error detection পর্ব) আর binary যোগে (পর্ব ১১) এটিই মূল উপাদান।
- XNOR: XOR-এর উল্টো — ইনপুট দুটি সমান হলে 1. তাই একে “equivalence” gate-ও বলা হয়: (A ⊕ B)′ = AB + A′B′. দুটি সংখ্যা সমান কি না তুলনা করার circuit বিট-বিট XNOR দিয়েই শুরু হয়।
- NAND = NOT-AND: AND-এর ফল উল্টে দেওয়া। কেবল দুটিই 1 হলে 0.
- NOR = NOT-OR: OR-এর ফল উল্টে দেওয়া। কেবল দুটিই 0 হলে 1.
NAND আর NOR-কে কেন আলাদা মর্যাদা দেওয়া হয়, তার দুটি কারণ আছে। প্রথমত, এদের যেকোনো একটি দিয়েই সব Boolean function বানানো যায় (অংশ ৮-এ প্রমাণ)। দ্বিতীয়ত, CMOS প্রযুক্তিতে transistor-এর স্বাভাবিক গঠনই উল্টানো ফল দেয়, তাই NAND আর NOR বানাতে AND বা OR-এর চেয়ে কম transistor লাগে, আর এরা দ্রুতও হয় — বিস্তারিত পর্ব ০৮-এ।
চিহ্নের নিয়ম — এই পর্বের convention
বিভিন্ন বই আর দেশে Boolean চিহ্ন আলাদা, তাই শুরুতেই পরিষ্কার করে রাখি এই পর্বে আমরা কী লিখব:
| কাজ | এই পর্বের লেখা | অন্য বইয়ে যা দেখবেন | C কোডে | নিচের JS tool-এ |
|---|---|---|---|---|
| NOT | A′ (prime) | A-এর ওপর দাগ (Ā), ¬A, ~A | !a (logical), ~a (bitwise) | A' বা !A |
| AND | A · B বা শুধু AB | A ∧ B, A & B | a && b, a & b | AB বা A&B |
| OR | A + B | A ∨ B | a || b, a | b | A + B |
| XOR | A ⊕ B | A ⊻ B | a ^ b | A ^ B |
ওপরে দাগ (overbar) বইয়ে সুন্দর দেখায়, কিন্তু ফোনের পর্দায় আর সাধারণ লেখায় ভাঙে; তাই এই কোর্সে আমরা prime (′) ব্যবহার করব। খেয়াল করুন, (AB)′ আর A′B′ সম্পূর্ণ আলাদা জিনিস — প্রথমটিতে পুরো গুণফলের ওপর NOT, দ্বিতীয়টিতে আলাদা দুটি NOT. ওপর-দাগের লেখায় এই পার্থক্য দাগের দৈর্ঘ্য দিয়ে বোঝানো হয়, আমাদের লেখায় বন্ধনী দিয়ে।
Operator precedence (কোন কাজ আগে হবে) সাধারণ বীজগণিতের মতোই: বন্ধনী → NOT → AND → OR. অর্থাৎ A + B · C′ মানে A + (B · (C′)) — আগে C-এর NOT, তারপর B-এর সাথে AND, শেষে A-এর সাথে OR. XOR-এর precedence নিয়ে বইগুলো একমত নয়; C ভাষায় & আগে, তারপর ^, তারপর |. এই পর্বের JS tool-ও সেই ক্রম মানে, তবে নিরাপদ অভ্যাস হলো XOR-এর চারপাশে সবসময় বন্ধনী দেওয়া।
৪ · Postulate আর সূত্র — Huntington থেকে De Morgan
সাধারণ বীজগণিতের মতো Boolean algebra-ও কয়েকটি মৌলিক “মেনে নেওয়া সত্য” দিয়ে শুরু হয় — এগুলোকে বলে postulate বা axiom. বাকি সব সূত্র এগুলো থেকে প্রমাণ করা হয়। Huntington-এর (১৯০৪) পরিচিত একটি সেট, যা বেশিরভাগ digital logic পাঠ্যবই ব্যবহার করে, সংক্ষেপে এমন — একটি সেট B, যাতে অন্তত দুটি আলাদা উপাদান 0 আর 1, আর দুটি কাজ + আর ·:
- Closure: B-এর যেকোনো দুটি উপাদানের + বা · ফলও B-তেই থাকে।
- Identity: A + 0 = A এবং A · 1 = A.
- Commutative: A + B = B + A এবং A · B = B · A.
- Distributive: A · (B + C) = AB + AC এবং A + BC = (A + B)(A + C).
- Complement: প্রতিটি A-এর জন্য একটি A′ আছে, যাতে A + A′ = 1 এবং A · A′ = 0.
লক্ষ করুন, associative নিয়ম (A + (B + C) = (A + B) + C) এখানে নেই — Huntington দেখিয়েছিলেন, এটি বাকিগুলো থেকে প্রমাণ করা যায়, তাই একে theorem ধরা হয়। আরও লক্ষ করুন, প্রতিটি postulate জোড়ায় আছে: একটির + আর · এবং 0 আর 1 অদলবদল করলে অন্যটি পাওয়া যায়। এই মজার মিলটির নাম duality, অংশ ৫-এর বিষয়।
প্রধান সূত্রের তালিকা
| নাম | OR-রূপ | AND-রূপ (dual) |
|---|---|---|
| Identity | A + 0 = A | A · 1 = A |
| Null / domination | A + 1 = 1 | A · 0 = 0 |
| Idempotent | A + A = A | A · A = A |
| Complement | A + A′ = 1 | A · A′ = 0 |
| Involution | (A′)′ = A | |
| Commutative | A + B = B + A | AB = BA |
| Associative | A + (B + C) = (A + B) + C | A(BC) = (AB)C |
| Distributive | A + BC = (A + B)(A + C) | A(B + C) = AB + AC |
| Absorption | A + AB = A | A(A + B) = A |
| Redundant literal | A + A′B = A + B | A(A′ + B) = AB |
| Consensus | AB + A′C + BC = AB + A′C | (A + B)(A′ + C)(B + C) = (A + B)(A′ + C) |
| De Morgan | (A + B)′ = A′B′ | (AB)′ = A′ + B′ |
কয়েকটি সূত্র সাধারণ বীজগণিতের সাথে মেলে (commutative, associative, A(B + C) = AB + AC), আবার কয়েকটি একেবারেই মেলে না। Idempotent বলে A + A = A — সাধারণ বীজগণিতে x + x = 2x. আর সবচেয়ে চমকপ্রদ হলো দ্বিতীয় distributive নিয়ম A + BC = (A + B)(A + C): সাধারণ সংখ্যায় ২ + ৩ × ৪ = ১৪, কিন্তু (২ + ৩)(২ + ৪) = ৩০. সাধারণ বীজগণিতে এর কোনো প্রতিরূপ নেই; Boolean algebra-য় এটি postulate. এর কারণ — এখানে “যোগ” মানে “অথবা”, আর OR-ও AND-এর ওপর বণ্টিত হয়, ঠিক যেমন AND বণ্টিত হয় OR-এর ওপর। এই দুই দিকের সমতাই Boolean algebra-কে সাধারণ বীজগণিত থেকে আলাদা আর সুন্দর করে।
প্রমাণের দুই পথ
পথ ১ — perfect induction (truth table দিয়ে প্রমাণ): চলকের মান যেহেতু শুধু 0 বা 1, n চলকের একটি সূত্রের দুই পাশ সব ২ⁿ টি সারিতে মিলিয়ে দেখলেই প্রমাণ শেষ। এটি “উদাহরণ দিয়ে প্রমাণ” নয় — সব সম্ভাব্য ক্ষেত্র পরীক্ষা করা, তাই সম্পূর্ণ বৈধ প্রমাণ। নিচে De Morgan-এর প্রথম সূত্রটি সারি ধরে প্রমাণ করা হলো — প্রতিটি ধাপে “পরে” চাপুন:
A B │ A+B │ (A+B)' ║ A' B' │ A'B' -----┼-----┼--------╫-------┼----- 0 0 │ ? │ ? ║ ? ? │ ? 0 1 │ ? │ ? ║ ? ? │ ? 1 0 │ ? │ ? ║ ? ? │ ? 1 1 │ ? │ ? ║ ? ? │ ? left side right side
A B │ A+B │ (A+B)' ║ A' B' │ A'B' -----┼-----┼--------╫-------┼----- 0 0 │ 0 │ 1 ║ 1 1 │ 1 equal 0 1 │ ? │ ? ║ ? ? │ ? 1 0 │ ? │ ? ║ ? ? │ ? 1 1 │ ? │ ? ║ ? ? │ ?
A B │ A+B │ (A+B)' ║ A' B' │ A'B' -----┼-----┼--------╫-------┼----- 0 0 │ 0 │ 1 ║ 1 1 │ 1 equal 0 1 │ 1 │ 0 ║ 1 0 │ 0 equal 1 0 │ ? │ ? ║ ? ? │ ? 1 1 │ ? │ ? ║ ? ? │ ?
A B │ A+B │ (A+B)' ║ A' B' │ A'B' -----┼-----┼--------╫-------┼----- 0 0 │ 0 │ 1 ║ 1 1 │ 1 equal 0 1 │ 1 │ 0 ║ 1 0 │ 0 equal 1 0 │ 1 │ 0 ║ 0 1 │ 0 equal 1 1 │ ? │ ? ║ ? ? │ ?
A B │ A+B │ (A+B)' ║ A' B' │ A'B' -----┼-----┼--------╫-------┼----- 0 0 │ 0 │ 1 ║ 1 1 │ 1 equal 0 1 │ 1 │ 0 ║ 1 0 │ 0 equal 1 0 │ 1 │ 0 ║ 0 1 │ 0 equal 1 1 │ 1 │ 0 ║ 0 0 │ 0 equal
(A+B)' column : 1 0 0 0 A'B' column : 1 0 0 0 -> identical in all 4 rows => (A + B)' = A'B' proved by perfect induction dual (swap + and ·): (AB)' = A' + B'
- কলাম সাজানো। দুই চলক, তাই ২² = ৪টি সারি, binary ক্রমে। বাঁয়ে বাম পাশ (A + B)′ হিসাবের কলাম, ডানে ডান পাশ A′B′-এর কলাম। লক্ষ্য: শেষ দুটি কলাম প্রতিটি সারিতে সমান কি না দেখা।
- A = 0, B = 0. 0 + 0 = 0, তার NOT = 1. অন্য দিকে A′ = 1, B′ = 1, গুণফল 1. দুই পাশই 1 — মিলল।
- A = 0, B = 1. 0 + 1 = 1, NOT করে 0. A′ = 1, B′ = 0, গুণফল 0. দুই পাশই 0 — মিলল।
- A = 1, B = 0. 1 + 0 = 1, NOT করে 0. A′ = 0, B′ = 1, গুণফল 0. আবার মিলল।
- A = 1, B = 1. 1 + 1 = 1 (মনে রাখুন, ২ নয়), NOT করে 0. A′ = 0, B′ = 0, গুণফল 0. চতুর্থ সারিতেও মিলল।
- সিদ্ধান্ত। চারটি সারির প্রতিটিতে দুই কলাম হুবহু এক (1 0 0 0), আর এর বাইরে কোনো সারি সম্ভব নয় — তাই সূত্রটি প্রমাণিত। একই পদ্ধতিতে (AB)′ = A′ + B′ প্রমাণ করা যায়, অথবা duality দিয়ে সরাসরি পাওয়া যায়।
পথ ২ — বীজগাণিতিক প্রমাণ: postulate আর আগে প্রমাণ করা সূত্র ব্যবহার করে এক পাশ থেকে আরেক পাশে যাওয়া। প্রতিটি ধাপে কোন নিয়ম ব্যবহার করলেন, তা লেখা বাধ্যতামূলক — পরীক্ষায় নম্বর থাকে ঠিক সেখানেই। কয়েকটি উদাহরণ:
- Idempotent, A + A = A: A + A = (A + A) · 1 [identity] = (A + A)(A + A′) [complement] = A + AA′ [distributive, দ্বিতীয় রূপ] = A + 0 [complement] = A [identity].
- Null, A + 1 = 1: A + 1 = (A + 1) · 1 = (A + 1)(A + A′) = A + 1 · A′ [distributive] = A + A′ = 1.
- Absorption, A + AB = A: A + AB = A · 1 + A · B [identity] = A(1 + B) [distributive] = A · 1 [null] = A.
- Redundant literal, A + A′B = A + B: A + A′B = (A + A′)(A + B) [distributive, দ্বিতীয় রূপ] = 1 · (A + B) = A + B.
- দ্বিতীয় distributive-এর যাচাই (ডান থেকে বাঁয়ে): (A + B)(A + C) = AA + AC + AB + BC = A + AC + AB + BC [idempotent] = A(1 + C + B) + BC = A · 1 + BC = A + BC.
- Consensus, AB + A′C + BC = AB + A′C: BC = BC · 1 = BC(A + A′) = ABC + A′BC. তাহলে বাম পাশ = AB + A′C + ABC + A′BC = AB(1 + C) + A′C(1 + B) = AB + A′C. অর্থাৎ BC পদটি (“consensus term”) অপ্রয়োজনীয় — AB আর A′C-এর মধ্যেই এটি লুকিয়ে আছে।
Consensus-কে চেনার কৌশল: দুটি পদে একটি চলক একবার সরল (A) আর একবার উল্টো (A′) রূপে থাকলে, বাকি অংশগুলোর গুণফল (এখানে B আর C থেকে BC) হলো consensus. সেটি যদি expression-এ আলাদা পদ হিসেবে থাকে, মুছে ফেলা যায়। মজার কথা, পর্ব ১০-এ দেখবেন hazard (ক্ষণিকের ভুল আউটপুট) দূর করতে ঠিক এই “অপ্রয়োজনীয়” পদটিই ইচ্ছা করে রেখে দেওয়া হয়।
De Morgan — n চলকে সাধারণীকরণ
De Morgan-এর সূত্র যেকোনো সংখ্যক চলকে খাটে:
প্রমাণ (n-এর ওপর induction): n = ২ হলে এটি ওপরে প্রমাণ করা সূত্র। ধরি n − ১ চলকে সত্য। X = A1 + … + An−1 লিখি (associative নিয়মে বন্ধনী যেভাবেই দিই, ফল এক)। তাহলে (X + An)′ = X′ An′ [দুই চলকের De Morgan] = A1′ … An−1′ An′ [ধরে নেওয়া অংশ]। দ্বিতীয় রূপটি duality থেকেই আসে। মুখে মনে রাখার নিয়ম: “দাগ ভাঙুন, চিহ্ন বদলান” — পুরো expression-এর ওপরের NOT ভেঙে প্রতিটি অংশে নামিয়ে দিন, আর + হয়ে যায় ·, · হয়ে যায় +. যেমন (AB + C′D)′ = (AB)′ · (C′D)′ = (A′ + B′)(C + D′).
হাতে প্রমাণ শিখলেন; এবার যন্ত্রকে দিয়ে সব সারি পরীক্ষা করাই। নিচের ছোট “প্রমাণ-যন্ত্র” দুই পাশের function নিয়ে সব ২ⁿ সারি মেলায়, আর না মিললে ঠিক কোন সারিতে ভাঙল — অর্থাৎ counterexample — দেখায়। শেষ দুটি লাইনে ইচ্ছা করে দুটি ভুল “সূত্র” রাখা হয়েছে, যা ছাত্রছাত্রী আর AI দুজনেই প্রায়ই লেখে। Run চাপুন:
// Perfect induction: an identity is true iff both sides agree on ALL 2^n rows.
const N = x => 1 - x; // NOT on 0/1
function prove(name, lhs, rhs) {
const n = lhs.length, bad = []; // n = number of variables
for (let r = 0; r < 1 << n; r++) {
const v = Array.from({ length: n }, (_, j) => (r >> (n - 1 - j)) & 1);
if (lhs(...v) !== rhs(...v)) bad.push(v.join(""));
}
console.log((bad.length ? "FALSE " : "TRUE ") + name.padEnd(34) +
`${1 << n} rows` + (bad.length ? `, counterexample ${"ABC".slice(0, n)} = ${bad.join(", ")}` : ""));
}
prove("De Morgan (A+B)' = A'B'", (A, B) => N(A | B), (A, B) => N(A) & N(B));
prove("De Morgan (AB)' = A'+B'", (A, B) => N(A & B), (A, B) => N(A) | N(B));
prove("De Morgan 3 vars (A+B+C)'", (A, B, C) => N(A | B | C), (A, B, C) => N(A) & N(B) & N(C));
prove("Absorption A + AB = A", (A, B) => A | (A & B), (A, B) => A);
prove("Absorption A(A+B) = A", (A, B) => A & (A | B), (A, B) => A);
prove("A + A'B = A + B", (A, B) => A | (N(A) & B), (A, B) => A | B);
prove("Consensus AB+A'C+BC", (A, B, C) => (A & B) | (N(A) & C) | (B & C),
(A, B, C) => (A & B) | (N(A) & C));
prove("A + BC = (A+B)(A+C)", (A, B, C) => A | (B & C), (A, B, C) => (A | B) & (A | C));
prove("A + BC = AB + C ?", (A, B, C) => A | (B & C), (A, B, C) => (A & B) | C);
prove("(AB)' = A'B' ?", (A, B) => N(A & B), (A, B) => N(A) & N(B));আউটপুট (নির্ধারিত — প্রতিবার একই):
TRUE De Morgan (A+B)' = A'B' 4 rows
TRUE De Morgan (AB)' = A'+B' 4 rows
TRUE De Morgan 3 vars (A+B+C)' 8 rows
TRUE Absorption A + AB = A 4 rows
TRUE Absorption A(A+B) = A 4 rows
TRUE A + A'B = A + B 4 rows
TRUE Consensus AB+A'C+BC 8 rows
TRUE A + BC = (A+B)(A+C) 8 rows
FALSE A + BC = AB + C ? 8 rows, counterexample ABC = 001, 100
FALSE (AB)' = A'B' ? 4 rows, counterexample AB = 01, 10
প্রথম আটটি সূত্র সব সারিতে মিলেছে — De Morgan (দুই আর তিন চলকে), দুই রূপের absorption, redundant literal, consensus আর দ্বিতীয় distributive নিয়ম। শেষ দুটি “সূত্র” মিথ্যা, আর যন্ত্র ঠিক কোথায় ভাঙে তা দেখিয়ে দিয়েছে। A + BC = AB + C-এর ক্ষেত্রে ABC = 001-এ বাম পাশ 0 + 0 = 0 কিন্তু ডান পাশ 0 + 1 = 1; আর 100-এ বাম পাশ 1, ডান পাশ 0. (AB)′ = A′B′ ভাঙে 01 আর 10-এ: সেখানে AB = 0, তাই (AB)′ = 1, কিন্তু A′B′ = 0 — এটি De Morgan-এর সবচেয়ে প্রচলিত ভুল প্রয়োগ। একটি counterexample-ই একটি “সূত্র” বাতিল করার জন্য যথেষ্ট; কিন্তু সত্য প্রমাণ করতে লাগে সব সারি। খেয়াল করুন, কোডে |, & আর 1 - x দিয়েই OR, AND, NOT করা হয়েছে, কারণ মান শুধু 0 বা 1.
৫ · Duality — এক সূত্রের বদলে দুটি
একটি Boolean expression-এর dual পেতে তিনটি কাজ করুন: প্রতিটি + কে · বানান, প্রতিটি · কে + বানান, আর প্রতিটি 0 কে 1 ও 1 কে 0 বানান। চলক আর তাদের prime যেমন আছে তেমনই থাকবে। Duality principle বলে: কোনো সূত্র সত্য হলে তার dual-ও সত্য।
কেন? কারণ Huntington-এর প্রতিটি postulate নিজেই জোড়ায় আছে, আর প্রতিটি জোড়ার একটি আরেকটির dual (অংশ ৪-এর তালিকা দেখুন)। কোনো সূত্রের প্রমাণের প্রতিটি ধাপে যদি আমরা dual postulate ব্যবহার করি, তাহলে একই দৈর্ঘ্যের একটি প্রমাণ পাই, যা dual সূত্রটি প্রমাণ করে। অর্থাৎ প্রতিটি প্রমাণ বিনা খরচে দুটি সূত্র দেয়।
| সূত্র | তার dual |
|---|---|
| A + 0 = A | A · 1 = A |
| A + A′B = A + B | A(A′ + B) = AB |
| AB + A′C + BC = AB + A′C | (A + B)(A′ + C)(B + C) = (A + B)(A′ + C) |
| A + BC = (A + B)(A + C) | A(B + C) = AB + AC |
Dual আর complement এক নয়। F = A + B′C-এর dual হলো FD = A(B′ + C) — চলকের prime অপরিবর্তিত। কিন্তু complement F′ = A′(B + C′) — De Morgan দিয়ে, যেখানে চিহ্ন বদলের সাথে প্রতিটি চলকও উল্টে যায়। অর্থাৎ complement = dual নিয়ে প্রতিটি literal উল্টানো। আর dual নেওয়ার সময় অপারেটরের লুকানো বন্ধনী মনে রাখুন: A + BC-এর dual হলো A(B + C), “A · B + C” নয়।
৬ · বীজগাণিতিক সরলীকরণ — প্রতিটি ধাপের কারণসহ
সূত্র শেখার আসল উদ্দেশ্য circuit ছোট করা। একটি expression-এর প্রতিটি পদ মানে একটি AND gate, প্রতিটি literal (চলক বা তার complement, যেমন A বা B′) মানে সেই gate-এর একটি ইনপুট-তার। কম পদ আর কম literal মানে কম gate, কম transistor, কম জায়গা, কম বিদ্যুৎ, আর প্রায়ই কম delay. কারখানায় একটি chip লক্ষ লক্ষ কপি তৈরি হয় — প্রতিটি কপিতে কয়েকটি gate বাঁচানো মানে বিশাল সাশ্রয়।
নিচের function-টি পরীক্ষায় খুব পরিচিত ধাঁচের — চারটি পদ, প্রতিটিতে তিনটি literal. দেখা যাক এটি আসলে কতটা ছোট:
F = A'B'C + A'BC + AB'C + ABC
4 terms, 12 literals
every term contains C
F = (A'B'C + A'BC) + (AB'C + ABC)
└ both have A'C ┘ └ both have AC ┘
law: commutative + associative
F = A'C(B' + B) + AC(B' + B) law: distributive XY + XZ = X(Y + Z)
F = A'C · 1 + AC · 1 law: complement X + X' = 1 = A'C + AC law: identity X · 1 = X
F = C(A' + A) distributive = C · 1 complement = C identity
original terms = rows 001, 011, 101, 111
= Σm(1, 3, 5, 7)
these are exactly the rows with C = 1
12 literals -> 1 literal, 4 AND + 1 OR gate -> a wire
- শুরু। চারটি পদ, মোট ১২টি literal. চোখ বুলিয়েই একটি মিল দেখা যায় — প্রতিটি পদে C আছে, সরল রূপে। এমন মিল খোঁজাই সরলীকরণের প্রথম কৌশল।
- জোড়া বানানো। commutative আর associative নিয়মে পদগুলোর ক্রম ও বন্ধনী ইচ্ছামতো সাজানো যায়। প্রথম দুটিতে A′ আর C দুটোই আছে, শেষ দুটিতে A আর C — শুধু B-তে পার্থক্য।
- সাধারণ অংশ বাইরে। distributive নিয়মে (XY + XZ = X(Y + Z)) প্রথম জোড়া থেকে A′C, দ্বিতীয় জোড়া থেকে AC বাইরে আনা হলো। বন্ধনীতে বাকি থাকল B′ + B.
- B′ + B = 1. complement নিয়মে একটি চলক আর তার উল্টো OR করলে সবসময় 1 — B যা-ই হোক, দুটির একটি 1. তারপর identity নিয়মে X · 1 = X, ফলে F = A′C + AC.
- আবার একই কৌশল। এবার দুই পদে C সাধারণ, পার্থক্য শুধু A-তে। distributive দিয়ে C(A′ + A), complement দিয়ে C · 1, identity দিয়ে C. পুরো function-টি আসলে শুধু C!
- যাচাই। মূল চারটি পদ truth table-এর 001, 011, 101, 111 সারি — অর্থাৎ ঠিক সেই চারটি সারি যেখানে C = 1. সুতরাং F = C সঠিক। circuit-এ চারটি ৩-ইনপুট AND আর একটি ৪-ইনপুট OR-এর বদলে একটি তার যথেষ্ট — A আর B আসলে অপ্রাসঙ্গিক।
এই “পার্থক্য শুধু একটি চলকে” কৌশলটিকে বলে adjacency বা combining: XY + XY′ = X. পর্ব ০৯-এর K-map আসলে এই কৌশলকে চোখে দেখার মতো ছকে সাজিয়ে দেয় — পাশাপাশি দুটি ঘর মানে ঠিক এমন একটি জোড়া।
পরীক্ষার ধাঁচে আরও কয়েকটি উদাহরণ
উদাহরণ ১. সরল করুন: F = AB + A(B + C) + B(B + C)
- F = AB + AB + AC + BB + BC [distributive]
- = AB + AC + B + BC [idempotent: AB + AB = AB, BB = B]
- = AB + AC + B [absorption: B + BC = B]
- = B + AC [absorption: B + AB = B]
উত্তর: F = B + AC (৫টি পদ থেকে ২টি)।
উদাহরণ ২. সরল করুন: F = (A + B)(A + B′)
দ্বিতীয় distributive নিয়মে F = A + BB′ = A + 0 = A [distributive, complement, identity]. এটি আগের XY + XY′ = X কৌশলের dual: (X + Y)(X + Y′) = X.
উদাহরণ ৩. সরল করুন: F = (A′ + B)′ + (A + B)′
- (A′ + B)′ = A″B′ = AB′ [De Morgan, involution]
- (A + B)′ = A′B′ [De Morgan]
- F = AB′ + A′B′ = B′(A + A′) = B′ [distributive, complement, identity]
উত্তর: F = B′.
উদাহরণ ৪. সরল করুন: F = XY + X′Z + YZ
X আর X′ দুটি পদে আছে, বাকি অংশ Y আর Z — তাদের গুণফল YZ, যা ঠিক তৃতীয় পদ। Consensus theorem অনুযায়ী এটি মুছে যায়: F = XY + X′Z. পরীক্ষায় শুধু “consensus” লিখলেই চলে না — অংশ ৪-এর মতো YZ = YZ(X + X′) দিয়ে খুলে দেখালে পূর্ণ নম্বর নিশ্চিত।
উদাহরণ ৫ (complement বের করা). F = AB + C′D হলে F′ কত?
F′ = (AB + C′D)′ = (AB)′ · (C′D)′ = (A′ + B′)(C + D′) [De Morgan দুবার, involution]. চাইলে গুণ করে SOP-এ লেখা যায়: A′C + A′D′ + B′C + B′D′.
বীজগাণিতিক সরলীকরণের সীমা: কোন সূত্র কখন লাগাবেন তার কোনো বাঁধা নিয়ম নেই, আর শেষ উত্তরটি সবচেয়ে ছোট কি না তা বীজগণিত নিজে বলে দেয় না। এজন্যই পর্ব ০৯ (K-map) আর পর্ব ১০ (Quine-McCluskey) — নিয়মমাফিক পদ্ধতি, যা নিশ্চিতভাবে ন্যূনতম SOP দেয়। তবু বীজগণিত জানা অপরিহার্য: প্রমাণ লিখতে, ছোট expression দ্রুত সরল করতে, আর multi-level circuit-এ (যেখানে K-map চলে না) সাধারণ অংশ বাইরে আনতে।
৭ · Canonical form — minterm, maxterm, SOP আর POS
একই function অসংখ্য রূপে লেখা যায় — A′C + AB, A′B′C + A′BC + ABC′ + ABC, (A + C)(A′ + B) সবই একই truth table দেয়। দুটি expression একই function কি না দ্রুত বোঝার জন্য এমন একটি “প্রমিত” রূপ দরকার, যা প্রতিটি function-এর জন্য অনন্য। এমন রূপকে বলে canonical form, আর তার দুটি ধরন আছে।
Minterm আর maxterm
n চলকের একটি minterm হলো এমন একটি AND-পদ, যাতে প্রতিটি চলক ঠিক একবার আছে (সরল বা উল্টো রূপে), আর যা truth table-এর ঠিক একটি সারিতে 1 হয়। নিয়ম: সারিতে যে চলক 0, তাকে উল্টো (prime) লিখুন; যে চলক 1, তাকে সরল লিখুন। সারি নম্বর i হলে তাকে লেখা হয় mi.
Maxterm ঠিক উল্টো: এমন একটি OR-পদ, যাতে প্রতিটি চলক একবার আছে, আর যা ঠিক একটি সারিতে 0 হয়। নিয়মও উল্টো: সারিতে যে চলক 0, তাকে সরল লিখুন; যে চলক 1, তাকে উল্টো লিখুন। লেখা হয় Mi. লক্ষ করুন, Mi = (mi)′ — De Morgan দিয়ে সরাসরি দেখা যায়।
| সারি | A B C | minterm mi | maxterm Mi |
|---|---|---|---|
| ০ | 0 0 0 | A′B′C′ | A + B + C |
| ১ | 0 0 1 | A′B′C | A + B + C′ |
| ২ | 0 1 0 | A′BC′ | A + B′ + C |
| ৩ | 0 1 1 | A′BC | A + B′ + C′ |
| ৪ | 1 0 0 | AB′C′ | A′ + B + C |
| ৫ | 1 0 1 | AB′C | A′ + B + C′ |
| ৬ | 1 1 0 | ABC′ | A′ + B′ + C |
| ৭ | 1 1 1 | ABC | A′ + B′ + C′ |
SOP আর POS
- Sum of products (SOP): কয়েকটি AND-পদের OR — যেমন A′C + AB. যদি প্রতিটি পদ একটি পূর্ণ minterm হয়, তাকে বলে canonical SOP (বা sum of minterms), আর সংক্ষেপে লেখা হয় F = Σm(1, 3, 6, 7).
- Product of sums (POS): কয়েকটি OR-পদের AND — যেমন (A + C)(A′ + B). প্রতিটি পদ পূর্ণ maxterm হলে canonical POS (product of maxterms), সংক্ষেপে F = ΠM(0, 2, 4, 5).
- Standard বনাম canonical: standard SOP বা POS-এ পদগুলোতে সব চলক থাকা জরুরি নয় (A′C + AB); canonical-এ প্রতিটি পদে প্রতিটি চলক থাকতেই হবে। canonical রূপ অনন্য কিন্তু বড়; ন্যূনতম standard রূপ ছোট, কিন্তু সবসময় অনন্য নয়।
কেন এটি কাজ করে (প্রমাণের রূপরেখা): F-এর যে সারিগুলোতে F = 1, তাদের minterm-গুলো OR করি। যেকোনো সারি r নিন। যদি F(r) = 1, তাহলে mr পদটি এই OR-এ আছে আর r-এ 1 দেয়, তাই পুরো OR = 1. যদি F(r) = 0, তাহলে OR-এর প্রতিটি minterm অন্য কোনো সারির, আর r-এ প্রতিটি 0 দেয়, তাই OR = 0. অর্থাৎ OR-টি প্রতিটি সারিতে F-এর সমান — perfect induction. POS-এর যুক্তি হুবহু dual: প্রতিটি maxterm ঠিক নিজের সারিতে 0 দেয়, তাই 0-সারিগুলোর maxterm-এর AND ঠিক সেখানেই 0. এখান থেকে একটি মূল্যবান সিদ্ধান্তও আসে: যেকোনো truth table-কে AND, OR আর NOT দিয়ে লেখা যায় — অংশ ৮-এ এটিই functional completeness.
SOP আর POS-এর সম্পর্কও সরল: যে সারি Σm-তে নেই, সেটি ΠM-এ আছে। n চলকে মোট সারি ২ⁿ, তাই Σm-এর তালিকা জানলে ΠM-এর তালিকা হলো “বাকি সব সংখ্যা”। আর F′-এর Σm হলো F-এর ΠM-এর একই সংখ্যাগুলো। এবার পুরো পথটি একটি তিন চলকের function দিয়ে দেখি:
row │ A B C │ F ----┼-------┼--- 0 │ 0 0 0 │ 0 1 │ 0 0 1 │ 1 2 │ 0 1 0 │ 0 3 │ 0 1 1 │ 1 4 │ 1 0 0 │ 0 5 │ 1 0 1 │ 0 6 │ 1 1 0 │ 1 7 │ 1 1 1 │ 1
row │ A B C │ F 1 │ 0 0 1 │ 1 3 │ 0 1 1 │ 1 6 │ 1 1 0 │ 1 7 │ 1 1 1 │ 1 => F = Σm(1, 3, 6, 7)
rule: 0 -> X' , 1 -> X 0 0 1 -> A'B'C (m1) 0 1 1 -> A'BC (m3) 1 1 0 -> ABC' (m6) 1 1 1 -> ABC (m7)
F = m1 + m3 + m6 + m7
= A'B'C + A'BC + ABC' + ABC
rule: 0 -> X , 1 -> X' 0 0 0 -> (A + B + C) (M0) 0 1 0 -> (A + B' + C) (M2) 1 0 0 -> (A' + B + C) (M4) 1 0 1 -> (A' + B + C') (M5)
F = ΠM(0, 2, 4, 5)
= (A+B+C)(A+B'+C)(A'+B+C)(A'+B+C')
{1,3,6,7} and {0,2,4,5} together = all 8 rows
SOP: A'B'C + A'BC = A'C , ABC' + ABC = AB
F = A'C + AB
POS: (A+B+C)(A+B'+C) = A + C
(A'+B+C)(A'+B+C') = A' + B
F = (A + C)(A' + B)
"if A then B else C" -> a 2-to-1 mux
- Truth table. তিন চলক, ৮টি সারি, binary ক্রমে; প্রতিটি সারির নম্বর = ABC-কে binary সংখ্যা হিসেবে পড়লে যা হয়। F কলামটি আমাদের দেওয়া function.
- 1-সারি। F = 1 সারি ১, ৩, ৬ আর ৭-এ। সংক্ষিপ্ত লেখা F = Σm(1, 3, 6, 7) — পুরো function এই চারটি সংখ্যাতেই বলা হয়ে গেল।
- Minterm লেখা। প্রতিটি 1-সারিতে 0-চলক উল্টো, 1-চলক সরল। যেমন সারি ৬ = 110: A = 1, B = 1, C = 0, তাই ABC′. এই পদটি কেবল A = 1, B = 1, C = 0 হলেই 1.
- Canonical SOP. চারটি minterm OR করলেই F: A′B′C + A′BC + ABC′ + ABC. চারটি ৩-ইনপুট AND আর একটি ৪-ইনপুট OR দিয়ে সরাসরি circuit বানানো যায়।
- Maxterm লেখা। এবার বাকি 0-সারিগুলো (০, ২, ৪, ৫) নিই, আর নিয়ম উল্টো: 0-চলক সরল, 1-চলক উল্টো। যেমন সারি ৫ = 101, তাই (A′ + B + C′) — এটি কেবল A = 1, B = 0, C = 1 হলেই 0.
- Canonical POS. চারটি maxterm AND করলে F = ΠM(0, 2, 4, 5). Σm-এর তালিকা {১, ৩, ৬, ৭} আর ΠM-এর তালিকা {০, ২, ৪, ৫} মিলে ঠিক ০ থেকে ৭ — কোনো সংখ্যা বাদ নেই, কোনোটি দুবার নেই।
- সরল করা। SOP-এর জোড়াগুলো একটি চলকে আলাদা, তাই A′C + AB. POS-এ (X + B)(X + B′) = X কৌশলে (X = A + C) প্রথম জোড়া A + C, আর দ্বিতীয় জোড়া A′ + B. দুটি রূপই এক function: “A = 1 হলে B-এর মান, নইলে C-এর মান” — পর্ব ১২-এর 2-to-1 multiplexer.
এবার এই কাজ যন্ত্রকে দিয়ে করাই। নিচের simulator একটি ছোট parser — লেখা expression পড়ে গাছের মতো কাঠামো বানায়, প্রতিটি সারিতে মান হিসাব করে truth table ছাপে, আর Σm ও ΠM তালিকা দেয়। নিয়ম: NOT = ' বা !, AND = পাশাপাশি লেখা বা &, XOR = ^, OR = +; বন্ধনী চলবে, চলক বড় হাতের এক অক্ষর (২–৪টি)। শেষ লাইনে নিজের expression বসিয়েও চালাতে পারেন:
// Truth-table generator: ! or ' = NOT, & or juxtaposition = AND, ^ = XOR, + = OR
function parse(src) {
const t = src.replace(/\s+/g, "").split(""); let i = 0;
const eat = c => (t[i] === c ? (i++, true) : false);
function atom() { // highest precedence
let n; if (eat("!")) n = { op: "!", a: atom() };
else if (eat("(")) { n = expr(); if (!eat(")")) throw Error("missing )"); }
else if (/[A-Z01]/.test(t[i] || "")) n = /[01]/.test(t[i]) ? { k: +t[i++] } : { v: t[i++] };
else throw Error("unexpected '" + (t[i] || "end") + "' at " + i);
while (eat("'")) n = { op: "!", a: n }; // postfix prime: A'
return n;
}
const chain = (op, sub, implicit) => () => { let n = sub(); // left-assoc chain
while (eat(op) || (implicit && /[A-Z01(!]/.test(t[i] || ""))) n = { op, a: n, b: sub() };
return n; };
const and = chain("&", atom, true), xor = chain("^", and), expr = chain("+", xor);
const tree = expr(); if (i < t.length) throw Error("extra '" + t[i] + "'");
return { tree, vars: [...new Set(src.match(/[A-Z]/g))].sort() };
}
function ev(n, e) { if ("v" in n) return e[n.v]; if ("k" in n) return n.k;
const a = ev(n.a, e); if (n.op === "!") return 1 - a;
const b = ev(n.b, e); return n.op === "&" ? a & b : n.op === "^" ? a ^ b : a | b;
}
function table(src, show) {
const { tree, vars } = parse(src), k = vars.length, on = [], off = [];
if (show) console.log(vars.join(" ") + " | F F = " + src);
for (let r = 0; r < 1 << k; r++) {
const e = {}; vars.forEach((v, j) => (e[v] = (r >> (k - 1 - j)) & 1));
const f = ev(tree, e); (f ? on : off).push(r);
if (show) console.log(vars.map(v => e[v]).join(" ") + " | " + f + " row " + r);
}
console.log(`${src} = Σm(${on}) = ΠM(${off})`);
}
table("A'C + AB", true);
["A'B + AB'", "AB + BC + AC", "(A + B)' ^ C", "!(A&B) + C'D"].forEach(s => table(s));আউটপুট (নির্ধারিত):
A B C | F F = A'C + AB
0 0 0 | 0 row 0
0 0 1 | 1 row 1
0 1 0 | 0 row 2
0 1 1 | 1 row 3
1 0 0 | 0 row 4
1 0 1 | 0 row 5
1 1 0 | 1 row 6
1 1 1 | 1 row 7
A'C + AB = Σm(1,3,6,7) = ΠM(0,2,4,5)
A'B + AB' = Σm(1,2) = ΠM(0,3)
AB + BC + AC = Σm(3,5,6,7) = ΠM(0,1,2,4)
(A + B)' ^ C = Σm(0,3,5,7) = ΠM(1,2,4,6)
!(A&B) + C'D = Σm(0,1,2,3,4,5,6,7,8,9,10,11,13) = ΠM(12,14,15)
প্রথম টেবিলটি stepper-এর function: A′C + AB-এর 1-সারি ১, ৩, ৬, ৭ — হাতের হিসাবের সাথে হুবহু মিলেছে। A'B + AB' হলো XOR (সারি ১ আর ২, অর্থাৎ 01 আর 10). AB + BC + AC হলো তিন ইনপুটের majority — অন্তত দুটি 1 হলে 1, তাই Σm(3,5,6,7); পর্ব ১১-এ দেখবেন full adder-এর carry ঠিক এই function. (A + B)' ^ C-এ precedence দেখুন: আগে NOR, তারপর XOR. শেষেরটি চার চলকের: (AB)′ + C′D শুধু তিনটি সারিতে 0 (১২, ১৪, ১৫), তাই এর POS রূপ SOP-এর চেয়ে অনেক ছোট — যেদিকে কম সারি, সেদিকের canonical রূপ ছোট। parse()-এর গঠন খেয়াল করুন: expr (OR) ডাকে xor-কে, সে ডাকে and-কে, সে ডাকে atom-কে — যে স্তর যত ভেতরে, তার precedence তত বেশি। Compiler-ও ঠিক এভাবে expression পড়ে।
শেষ simulator-টি উল্টো দিকে যায়: একটি minterm তালিকা থেকে canonical SOP আর POS-এর লেখা তৈরি করে, তারপর সেই লেখা দুটিকেই আবার পড়ে প্রতিটি সারিতে মান হিসাব করে — দেখায় যে দুটি রূপ আর মূল তালিকা সব সারিতে এক:
// Minterm list -> canonical SOP and POS strings, then evaluate the STRINGS back.
const VARS = "ABCD";
function forms(n, ms) {
const vs = VARS.slice(0, n).split(""), bit = (r, j) => (r >> (n - 1 - j)) & 1;
const lit = (v, keep) => (keep ? v : v + "'");
const sop = ms.map(r => vs.map((v, j) => lit(v, bit(r, j))).join("")).join(" + ");
const Ms = [...Array(1 << n).keys()].filter(r => !ms.includes(r));
const pos = Ms.map(r => "(" + vs.map((v, j) => lit(v, !bit(r, j))).join("+") + ")").join("");
return { vs, sop, pos, Ms, bit };
}
function evalSop(s, env) { // "A'BC + AB'C" -> OR of ANDs
return s.split(" + ").some(term => (term.match(/[A-Z]'?/g)).every(l =>
l.length === 2 ? !env[l[0]] : !!env[l[0]])) ? 1 : 0;
}
function evalPos(s, env) { // "(A+B+C)(A'+B+C)" -> AND of ORs
return s.slice(1, -1).split(")(").every(sum => sum.split("+").some(l =>
l.length === 2 ? !env[l[0]] : !!env[l[0]])) ? 1 : 0;
}
for (const [n, ms] of [[3, [1, 3, 6, 7]], [3, [0, 2, 5, 7]], [2, [1, 2]]]) {
const { vs, sop, pos, Ms, bit } = forms(n, ms);
let col = "", ok = true;
for (let r = 0; r < 1 << n; r++) {
const env = {}; vs.forEach((v, j) => (env[v] = bit(r, j)));
const a = evalSop(sop, env), b = evalPos(pos, env);
col += a; ok = ok && a === b && a === (ms.includes(r) ? 1 : 0);
}
console.log(`F = Σm(${ms}) = ΠM(${Ms})`);
console.log(` SOP: ${sop}`);
console.log(` POS: ${pos}`);
console.log(` F column (row 0..${(1 << n) - 1}) = ${col} SOP == POS == list: ${ok}`);
}আউটপুট (নির্ধারিত):
F = Σm(1,3,6,7) = ΠM(0,2,4,5)
SOP: A'B'C + A'BC + ABC' + ABC
POS: (A+B+C)(A+B'+C)(A'+B+C)(A'+B+C')
F column (row 0..7) = 01010011 SOP == POS == list: true
F = Σm(0,2,5,7) = ΠM(1,3,4,6)
SOP: A'B'C' + A'BC' + AB'C + ABC
POS: (A+B+C')(A+B'+C')(A'+B+C)(A'+B'+C)
F column (row 0..7) = 10100101 SOP == POS == list: true
F = Σm(1,2) = ΠM(0,3)
SOP: A'B + AB'
POS: (A+B)(A'+B')
F column (row 0..3) = 0110 SOP == POS == list: true
প্রথম ব্লকটি stepper-এর ধাপ ৪ আর ৬-এর হুবহু লেখা। lit(v, !bit(r, j)) লাইনেই maxterm-এর “উল্টো নিয়ম” লুকিয়ে আছে — minterm-এ বিট 1 হলে চলক সরল, maxterm-এ বিট 0 হলে সরল। দ্বিতীয় function Σm(0,2,5,7)-এর কলাম 10100101: খেয়াল করলে দেখবেন F = 1 ঠিক যখন A = C, B যা-ই হোক — অর্থাৎ F = A′C′ + AC = (A ⊕ C)′ (অনুশীলন ২-এ এটি হাতে করবেন)। তৃতীয়টি দুই চলকের XOR: SOP A′B + AB′, আর POS (A + B)(A′ + B′). তিন ক্ষেত্রেই true মানে, লেখা SOP, লেখা POS আর মূল minterm তালিকা — তিনটিই প্রতিটি সারিতে একই মান দিয়েছে।
৮ · কয়টি function সম্ভব, আর কোন gate-সেট দিয়ে সব বানানো যায়
n চলকের মোট Boolean function: ২২ⁿ
একটি Boolean function পুরোপুরি ঠিক হয় তার truth table-এর আউটপুট কলাম দিয়ে। n চলকের টেবিলে সারি ২ⁿ টি, আর প্রতিটি সারির আউটপুট স্বাধীনভাবে 0 বা 1 হতে পারে। তাই সম্ভাব্য আউটপুট কলাম — অর্থাৎ আলাদা function — মোট ২২ⁿ টি। n = ১-এ ৪টি (0, 1, A, A′), n = ২-এ ১৬টি, n = ৩-এ ২৫৬টি, n = ৪-এ ৬৫,৫৩৬টি, আর n = ৫-এ ৪২৯ কোটিরও বেশি (২৩২)। দুই চলকের ১৬টি function-এর পুরো তালিকা:
| নাম | আউটপুট (AB = 00, 01, 10, 11) | expression | প্রচলিত নাম |
|---|---|---|---|
| F0 | 0 0 0 0 | 0 | সবসময় 0 (constant) |
| F1 | 0 0 0 1 | AB | AND |
| F2 | 0 0 1 0 | AB′ | inhibition (A, কিন্তু B নয়) |
| F3 | 0 0 1 1 | A | শুধু A (transfer) |
| F4 | 0 1 0 0 | A′B | inhibition (B, কিন্তু A নয়) |
| F5 | 0 1 0 1 | B | শুধু B (transfer) |
| F6 | 0 1 1 0 | A ⊕ B | XOR |
| F7 | 0 1 1 1 | A + B | OR |
| F8 | 1 0 0 0 | (A + B)′ | NOR |
| F9 | 1 0 0 1 | (A ⊕ B)′ | XNOR (equivalence) |
| F10 | 1 0 1 0 | B′ | NOT B |
| F11 | 1 0 1 1 | A + B′ | implication (B হলে A) |
| F12 | 1 1 0 0 | A′ | NOT A |
| F13 | 1 1 0 1 | A′ + B | implication (A হলে B) |
| F14 | 1 1 1 0 | (AB)′ | NAND |
| F15 | 1 1 1 1 | 1 | সবসময় 1 (constant) |
এখানে Fk-এর k হলো আউটপুট কলামটিকে ওপর থেকে নিচে binary সংখ্যা হিসেবে পড়লে যা হয় (Mano-র পাঠ্যবইয়ের ধারা)। ১৬টির মধ্যে ২টি constant, ৪টি একটি চলকেরই (A, A′, B, B′), আর বাকি ১০টি সত্যিকারের দুই-চলকের function — যার মধ্যে ৬টি (AND, OR, XOR, NAND, NOR, XNOR) আলাদা gate হিসেবে বাজারে পাওয়া যায়।
Functional completeness — কোন সেট যথেষ্ট
একটি gate-সেটকে functionally complete বলা হয়, যদি শুধু সেই gate-গুলো (যতবার খুশি) জুড়ে যেকোনো Boolean function বানানো যায়।
- {AND, OR, NOT} complete: অংশ ৭-এর প্রমাণ বলে, যেকোনো truth table-কে canonical SOP-এ লেখা যায় — যা শুধু AND, OR আর NOT ব্যবহার করে। (কোনো 1-সারি না থাকলে F = 0 = A · A′.) আসলে De Morgan বলে A + B = (A′B′)′, তাই শুধু {AND, NOT}-ও যথেষ্ট; একইভাবে {OR, NOT}.
- {NAND} একাই complete: NOT A = (A · A)′ = A NAND A. AND = NAND-এর ফল উল্টানো = (A NAND B) NAND (A NAND B). OR = (A′ · B′)′ = (A NAND A) NAND (B NAND B) [De Morgan]. NOT, AND আর OR পেলে বাকি সব আগের যুক্তিতেই পাওয়া যায়।
- {NOR} একাই complete: হুবহু dual যুক্তি — NOT A = A NOR A, OR = NOR-এর ফল উল্টানো, AND = (A′ + B′)′ = (A NOR A) NOR (B NOR B).
- {AND, OR} complete নয়: AND আর OR দুটিই monotone — কোনো ইনপুট 0 থেকে 1 করলে আউটপুট কখনো 1 থেকে 0 হয় না। তাই এদের যেকোনো জোড়াও monotone, আর NOT (যা 0-কে 1 আর 1-কে 0 করে) কখনো বানানো যায় না। শুধু {XOR}-ও complete নয়, তবে কারণটি আলাদা: সব ইনপুট 0 হলে XOR gate-এর যেকোনো জোড়ার আউটপুটও 0, তাই NOT বানানো যায় না।
এজন্যই NAND আর NOR-কে বলে universal gate. বাস্তব chip-এ এর গুরুত্ব বিশাল: নীতিগতভাবে একটি কারখানা কেবল একটি নিখুঁত NAND cell নকশা আর যাচাই করেই পুরো CPU বানাতে পারে। CMOS-এ কেন NAND আর NOR স্বাভাবিকভাবে সবচেয়ে সস্তা, আর NAND-NAND বা NOR-NOR রূপে কীভাবে SOP-POS বসে — পুরো আলোচনা পর্ব ০৮-এ।
৪টি চলকের truth table একটি ১৬-বিটের সংখ্যায়
একটি চমৎকার কৌশল দিয়ে Boolean algebra আর C-র bitwise operator এক হয়ে যায়। চার চলকের truth table-এ ১৬টি সারি, আর একটি ১৬-বিটের সংখ্যায় ১৬টি বিট। ধরি বিট r = সারি r-এ মান। তাহলে চলক A নিজেই একটি ১৬-বিটের “truth table”: যেসব সারিতে A = 1 (সারি ৮–১৫), সেখানে 1 — অর্থাৎ 0xFF00. তেমনি B = 0xF0F0, C = 0xCCCC, D = 0xAAAA. এখন একটি bitwise & একসাথে ১৬টি সারির AND করে! পর্ব ০৬-এ আপনি bit manipulation আর bitmask দেখেছেন; এখানে সেই bitmask-ই truth table:
#include <stdio.h>
#include <stdint.h>
/* Bit r of a mask = value of the function on row r (row r = ABCD in binary).
One bitwise operation evaluates all 16 rows at once. */
#define A 0xFF00u
#define B 0xF0F0u
#define C 0xCCCCu
#define D 0xAAAAu
#define NOT(x) (~(x) & 0xFFFFu)
static void show(const char *name, uint16_t f) {
printf("%-22s mask 0x%04X minterms:", name, (unsigned)f);
for (int r = 0; r < 16; r++)
if ((f >> r) & 1u) printf(" %d", r);
printf(" (%d ones)\n", __builtin_popcount(f));
}
int main(void) {
show("F = A'C + AB", (uint16_t)((NOT(A) & C) | (A & B)));
show("majority AB+BC+CA", (uint16_t)((A & B) | (B & C) | (C & A)));
show("parity A^B^C^D", (uint16_t)(A ^ B ^ C ^ D));
printf("De Morgan (A+B+C)' == A'B'C' : %s\n",
NOT(A | B | C) == (NOT(A) & NOT(B) & NOT(C)) ? "yes" : "no");
printf("Consensus AB+A'C+BC == AB+A'C : %s\n",
((A & B) | (NOT(A) & C) | (B & C)) == ((A & B) | (NOT(A) & C)) ? "yes" : "no");
printf("A + BC == AB + C : %s\n", (A | (B & C)) == ((A & B) | C) ? "yes" : "no");
for (int n = 1; n <= 5; n++)
printf("n = %d variables: 2^(2^n) = %llu functions\n", n, 1ULL << (1u << n));
return 0;
}Wandbox-এর gcc (Linux x86-64) আউটপুট:
F = A'C + AB mask 0xF0CC minterms: 2 3 6 7 12 13 14 15 (8 ones)
majority AB+BC+CA mask 0xFCC0 minterms: 6 7 10 11 12 13 14 15 (8 ones)
parity A^B^C^D mask 0x6996 minterms: 1 2 4 7 8 11 13 14 (8 ones)
De Morgan (A+B+C)' == A'B'C' : yes
Consensus AB+A'C+BC == AB+A'C : yes
A + BC == AB + C : no
n = 1 variables: 2^(2^n) = 4 functions
n = 2 variables: 2^(2^n) = 16 functions
n = 3 variables: 2^(2^n) = 256 functions
n = 4 variables: 2^(2^n) = 65536 functions
n = 5 variables: 2^(2^n) = 4294967296 functions
প্রথম লাইনটি মনোযোগ দিয়ে দেখুন। A′C + AB তিন চলকের function, কিন্তু এখানে চার চলকের জগতে D-ও আছে, যার ওপর F নির্ভর করে না। তাই তিন চলকের প্রতিটি minterm i এখানে দুটি সারি হয়ে যায় — ২i (D = 0) আর ২i + ১ (D = 1): ১ → ২, ৩; ৩ → ৬, ৭; ৬ → ১২, ১৩; ৭ → ১৪, ১৫. Majority-র mask 0xFCC0, আর চার বিটের parity 0x6996 — এটি একটি বিখ্যাত সংখ্যা, যা parity হিসাবের দ্রুত কৌশলে ব্যবহার হয়। De Morgan আর consensus-এর যাচাই এখানে একটিমাত্র == তুলনা, কারণ দুই পাশের ১৬টি সারিই একসাথে তুলনা হচ্ছে — perfect induction এক instruction-এ। আর ভুল “সূত্র” A + BC = AB + C আবার ধরা পড়েছে। NOT macro-তে & 0xFFFF জরুরি: ~ পুরো ৩২-বিটের unsigned-কে উল্টায়, ওপরের ১৬টি বাড়তি বিট মুছে না ফেললে তুলনা ভুল হতো। শেষ লাইনগুলো ২২ⁿ-এর হিসাব; n = ৬-এ ফল ২৬৪, যা unsigned long long-এও আঁটে না।
৯ · প্রোগ্রামিংয়ে Boolean algebra — short-circuit, bitwise আর De Morgan
প্রতিটি if, while আর ফিল্টার-শর্ত একটি Boolean expression. তাই এই পর্বের সূত্রগুলো প্রোগ্রামারের প্রতিদিনের হাতিয়ার — তবে কয়েকটি বাড়তি নিয়ম মাথায় রাখতে হয়।
Logical বনাম bitwise operator (C)
- Logical
&&,||,!: পুরো সংখ্যাটিকে একটি সত্য-মিথ্যা হিসেবে দেখে (০ = মিথ্যা, বাকি সব = সত্য), আর ফল দেয় 0 বা 1. - Bitwise
&,|,^,~: প্রতিটি বিটে আলাদাভাবে Boolean কাজ করে — ৩২টি বিট মানে একসাথে ৩২টি স্বাধীন Boolean algebra. বিস্তারিত অনুশীলন আছে C কোর্সের বিটওয়াইজ অপারেশন পর্বে।
একটি ফাঁদ: a = 2, b = 4 হলে a && b = 1 (দুটিই অশূন্য), কিন্তু a & b = 0 (010 & 100-এ কোনো বিট মেলে না)। আরেকটি: !a = 0, কিন্তু ~a = −৩ — যা C-তে “সত্য”! আর C-র precedence-এ == আগে, & পরে, তাই x & 1 == 0 আসলে x & (1 == 0) = সবসময় 0 — এখানে বন্ধনী বাধ্যতামূলক।
Short-circuit evaluation
C, Java, JavaScript, Python — সব প্রচলিত ভাষায় && আর || হলো short-circuit: বাম পাশ দেখেই ফল নিশ্চিত হলে ডান পাশ আর হিসাবই হয় না। এটি সরাসরি null সূত্রের দুই রূপ: 0 · X = 0 আর 1 + X = 1, X যা-ই হোক। তাই if (p != NULL && p->count > 0) নিরাপদ — p শূন্য হলে p->count কখনো পড়া হয় না। কিন্তু এই কারণে প্রোগ্রামে commutative নিয়ম পুরোপুরি খাটে না: p->count > 0 && p != NULL লিখলে গাণিতিক অর্থ এক, কিন্তু প্রোগ্রাম crash করতে পারে। ডান পাশে side effect (ফাংশন ডাকা, i++) থাকলেও ক্রম বদলালে আচরণ বদলায়। Boolean algebra বলে “মান” কী হবে; প্রোগ্রামিং ভাষা বাড়তি বলে “কোনটি আগে হিসাব হবে”।
De Morgan দিয়ে শর্ত পরিষ্কার করা
| আগে (বোঝা কঠিন) | De Morgan-এর পরে | মন্তব্য |
|---|---|---|
!(a && b) | !a || !b | চিহ্ন বদলাল, প্রতিটি অংশে NOT |
!(x >= 10 && x <= 20) | x < 10 || x > 20 | “১০ থেকে ২০-এর বাইরে” — সরাসরি পড়া যায় |
!(done || failed) | !done && !failed | লুপ চলবে যতক্ষণ দুটোই মিথ্যা |
while (!(ch == ' ' || ch == '\n')) | while (ch != ' ' && ch != '\n') | প্রচলিত ভুল: ch != ' ' || ch != '\n' — সবসময় সত্য! |
শেষ সারির ভুলটি এত পরিচিত যে প্রায় প্রতিটি প্রোগ্রামার একবার করেছেন। ch != ' ' || ch != '\n': ch একসাথে space আর newline দুটি হতে পারে না, তাই দুটি শর্তের অন্তত একটি সবসময় সত্য — লুপ কখনো থামে না। De Morgan সঠিকভাবে প্রয়োগ করলে OR-এর জায়গায় AND আসে। একটি সুখবর: De Morgan শর্তের হিসাবের ক্রম বদলায় না (a আগে, b পরে), তাই short-circuit আচরণও অক্ষত থাকে।
SQL-এর NULL আর তিন-মানের যুক্তি
ডেটাবেসে Boolean algebra-র একটি গুরুত্বপূর্ণ ব্যতিক্রম আছে। SQL-এ কোনো মান NULL (অজানা) হলে x = 5-এর ফল TRUE বা FALSE নয়, UNKNOWN. এই তিন-মানের যুক্তিতে FALSE AND UNKNOWN = FALSE, TRUE OR UNKNOWN = TRUE, কিন্তু TRUE AND UNKNOWN = UNKNOWN, আর NOT UNKNOWN = UNKNOWN. De Morgan আর বেশিরভাগ সূত্র তবু খাটে, কিন্তু complement নিয়ম ভাঙে: x = 5 OR NOT (x = 5) NULL সারিতে UNKNOWN, আর WHERE কেবল TRUE সারি রাখে — ফলে “সব সারি” আসার কথা থাকলেও NULL সারিগুলো হারিয়ে যায়। বিস্তারিত আছে DBMS কোর্সের NULL পর্বে। একই রকম ফাঁদ আছে floating point-এ: NaN-এর সাথে প্রতিটি তুলনা মিথ্যা, তাই !(a < b) আর a >= b সবসময় এক নয় (পর্ব ২৩)।
আরও গভীরে: আজকের chip-নকশার software (logic synthesis) Boolean function-কে ভেতরে রাখে And-Inverter Graph (AIG) হিসেবে — শুধু ২-ইনপুট AND আর NOT, অর্থাৎ {AND, NOT}-এর functional completeness সরাসরি কাজে লাগে; Berkeley-র মুক্ত টুল ABC এর পরিচিত উদাহরণ। দুটি circuit সমান কি না যাচাই (equivalence checking) করতে ২ⁿ সারি গোনা অসম্ভব, তাই শিল্পে ব্যবহার হয় Binary Decision Diagram (BDD, Randal Bryant-এর ১৯৮৬ সালের গবেষণা) আর SAT solver — প্রশ্নটিকে “F ⊕ G = 1 হয় এমন কোনো ইনপুট আছে কি?” হিসেবে লিখে। এই SAT সমস্যাই ১৯৭১ সালে Stephen Cook-এর প্রমাণ করা প্রথম NP-complete সমস্যা, তবু আধুনিক solver লক্ষ লক্ষ চলকের বাস্তব circuit প্রায়ই সামলাতে পারে।
পরীক্ষা ও ইন্টারভিউতে এই বিষয়ে প্রায়ই যা জিজ্ঞেস করা হয়:
- De Morgan-এর সূত্র লিখে truth table দিয়ে প্রমাণ করুন। — (A + B)′ = A′B′ আর (AB)′ = A′ + B′; চারটি সারিতে দুই পাশ মেলান।
- A + BC = (A + B)(A + C) প্রমাণ করুন। — ডান পাশ গুণ করে AA + AC + AB + BC = A(1 + C + B) + BC = A + BC.
- F = Σm(1, 3, 6, 7) হলে F-এর ΠM কত? — বাকি সারি: ΠM(0, 2, 4, 5).
- NAND কেন universal gate? — NAND দিয়েই NOT (A NAND A), AND আর OR বানানো যায়, আর {AND, OR, NOT} complete.
- তিন চলকের কয়টি Boolean function সম্ভব? — ২২³ = ২৮ = ২৫৬.
১০ · AI-এর যুগে — Boolean উত্তর যাচাই করার অভ্যাস
Boolean algebra-র প্রশ্নে AI দ্রুত, সুন্দর করে সাজানো উত্তর দেয় — কিন্তু “দেখতে ঠিক” আর “সত্যিই ঠিক” এক নয়। সরলীকরণের মাঝের একটি ধাপে একটি prime চিহ্ন (′) হারালে পুরো উত্তর ভুল হয়ে যায়, আর ভাষা-মডেল এমন ভুল প্রায়ই করে। সুখবর হলো, এই বিষয়ের প্রতিটি দাবি যন্ত্রে শতভাগ যাচাইযোগ্য: ৪ চলক পর্যন্ত মাত্র ১৬টি সারি।
| AI প্রায়ই যা করে | সত্যিটা | যাচাইয়ের উপায় |
|---|---|---|
| (AB)′ = A′B′ লিখে ফেলা | (AB)′ = A′ + B′ — চিহ্ন বদলাতে হয় | অংশ ৪-এর প্রমাণ-যন্ত্রে চালান |
| maxterm-এ minterm-এর নিয়ম (সারি 101 → A + B′ + C) | maxterm-এ 0 → সরল, 1 → উল্টো: A′ + B + C′ | সেই সারিতে পদটি 0 হয় কি না দেখুন |
| dual আর complement গুলিয়ে ফেলা | dual-এ literal অপরিবর্তিত, complement-এ উল্টানো | দুটির truth table মেলান |
| “সরল রূপ” দিয়ে একটি পদ বাদ দেওয়া, যা আসলে দরকারি | consensus ছাড়া অন্য পদ বাদ দিলে function বদলায় | truth table বা K-map (পর্ব ০৯) |
| XOR-এর precedence ধরে নেওয়া | বই আর ভাষাভেদে আলাদা | বন্ধনী দিন, ভাষার নিয়ম দেখুন |
| প্রোগ্রামের শর্ত বদলে short-circuit-এর ক্রম ভাঙা | p && p->x-এর ক্রম বদলানো যায় না | NULL আর side-effect-ওয়ালা test case |
AI-কে Boolean প্রশ্ন করার সময় শুধু উত্তর নয়, যাচাইযোগ্য ধাপ আর যাচাইয়ের উপকরণও চেয়ে নিন। নিচের কাঠামোটি কাজে লাগবে:
AI-এর উত্তর হাতে পেলে — যাচাইয়ের চেকলিস্ট
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন — তারপর “→ উত্তর” চাপুন।
প্র ০১Boole-এর বীজগণিত ১৮৫৪ সালের, অথচ circuit-এ এর ব্যবহার এল ১৯৩০-এর দশকে — মাঝের প্রায় আশি বছরে কী ঘটেছিল, আর Shannon-এর কাজ আসলে কী বদলাল?
Boole নিজে তাঁর বীজগণিতকে দেখেছিলেন “চিন্তার নিয়ম” হিসেবে — দর্শন আর যুক্তিবিদ্যার একটি গাণিতিক রূপ। তাঁর ব্যবস্থাও আজকের মতো পরিচ্ছন্ন ছিল না; যেমন তিনি “যোগ”-কে কেবল পরস্পর-বর্জিত শ্রেণির জন্য ব্যবহার করতেন। পরের দশকগুলোতে William Stanley Jevons, Charles Sanders Peirce আর Ernst Schröder ব্যবস্থাটিকে আজকের রূপে আনেন — OR-কে “অন্তর্ভুক্তিমূলক” করা, দুই দিকের distributive নিয়ম, ইত্যাদি। Jevons ১৮৬০-এর দশকের শেষ দিকে একটি যান্ত্রিক “logic piano” বানিয়েছিলেন, যা ছোট যুক্তির সমস্যা যন্ত্রে সমাধান করত। Peirce ১৮৮০-এর দশকে একটি চিঠিতে বিদ্যুতের সুইচ দিয়ে যুক্তির কাজ করার সম্ভাবনার কথা লিখেছিলেন বলে জানা যায়, আর তিনি এটিও লক্ষ করেছিলেন যে একটি মাত্র কাজ (আজকের NOR) দিয়েই সব যুক্তি প্রকাশ করা যায় — যদিও সেই লেখা তখন প্রকাশিত হয়নি।
অন্যদিকে প্রকৌশলের জগতে বিংশ শতাব্দীর শুরুতে টেলিফোন এক্সচেঞ্জ আর রেলের সিগন্যাল-ব্যবস্থা হাজার হাজার relay দিয়ে বানানো হচ্ছিল। প্রকৌশলীরা এগুলো নকশা করতেন অভিজ্ঞতা, নকশার খাতা আর পরীক্ষা-নিরীক্ষা দিয়ে। একটি circuit ঠিক কাজ করবে কি না, বা একই কাজ কম relay-তে হবে কি না — তা বলার কোনো পদ্ধতিগত উপায় ছিল না। দুই জগৎ — যুক্তির গণিত আর relay-র কারিগরি — পাশাপাশি থাকলেও একে অপরকে চিনত না।
Shannon দুই জগতের মানুষ ছিলেন: স্নাতক পর্যায়ে গণিত আর তড়িৎ প্রকৌশল দুটোই পড়েছিলেন, আর MIT-তে Vannevar Bush-এর differential analyzer (একটি বিশাল যান্ত্রিক কম্পিউটার)-এর relay-নিয়ন্ত্রণ নিয়ে কাজ করছিলেন। তাঁর thesis দেখায়, series সংযোগ = AND, parallel সংযোগ = OR, আর Boolean সূত্র দিয়ে relay-এর জাল সরল করা যায় — এমনকি কাঙ্ক্ষিত আচরণ থেকে শুরু করে circuit তৈরি করা যায়। এই উল্টো দিকের কাজটিই — specification থেকে circuit — আধুনিক logic synthesis-এর বীজ।
মজার কথা, জাপানে NEC-এর প্রকৌশলী Akira Nakashima ১৯৩০-এর দশকের মাঝামাঝি একই রকম switching তত্ত্ব নিয়ে লিখছিলেন, আর সোভিয়েত ইউনিয়নে Victor Shestakov-ও প্রায় একই সময়ে কাছাকাছি ধারণা দেন বলে ইতিহাসবিদেরা উল্লেখ করেন। অর্থাৎ ধারণাটির “সময় এসে গিয়েছিল” — relay-র জটিলতা এমন পর্যায়ে পৌঁছেছিল যে একটি তত্ত্ব অপরিহার্য হয়ে উঠেছিল।
মূল উপলব্ধি: একটি বিমূর্ত গণিত বহু দশক “অপ্রয়োজনীয়” থাকতে পারে, যতক্ষণ না কোনো প্রযুক্তি তার ভাষায় কথা বলতে শুরু করে। দুই ক্ষেত্র জানা একজন মানুষই প্রায়ই সেই সেতু বানান।
প্র ০২A + BC = (A + B)(A + C) Boolean algebra-য় সত্য, সাধারণ বীজগণিতে মিথ্যা — দুই ব্যবস্থার মৌলিক পার্থক্যটা কোথায়?
সাধারণ সংখ্যার যোগ আর গুণ সমান মর্যাদার নয়। গুণ যোগের ওপর বণ্টিত হয় (a(b + c) = ab + ac), কিন্তু যোগ গুণের ওপর হয় না। এর মূল কারণ যোগের “বৃদ্ধি”: a + a = 2a, যা a-এর চেয়ে বড়। (a + b)(a + c) গুণ করলে a² + ab + ac + bc আসে — a² আর a আলাদা, ab আর ac অতিরিক্ত পদ, কোনোটি একে অপরকে শুষে নেয় না।
Boolean algebra-য় তিনটি জিনিস একসাথে এই বাধা সরিয়ে দেয়। এক, idempotent নিয়ম: A · A = A আর A + A = A — কোনো কিছু নিজের সাথে মিশে বড় হয় না। দুই, null নিয়ম: 1 + X = 1, অর্থাৎ “যোগ” একটি সীমায় গিয়ে থেমে যায়। তিন, absorption: A + AB = A. ফলে (A + B)(A + C) = A + AC + AB + BC, আর প্রথম তিনটি পদ মিলে শুধু A. বাকি থাকে A + BC. গণিতের ভাষায়, Boolean algebra একটি lattice — যেখানে + আর · হলো “সবচেয়ে ছোট ওপরের সীমা” আর “সবচেয়ে বড় নিচের সীমা”, সেটের ভাষায় union আর intersection. সেটে A ∪ (B ∩ C) = (A ∪ B) ∩ (A ∪ C) — Venn diagram এঁকে সহজেই দেখা যায়। সংখ্যার যোগ-গুণ lattice নয়, তাই সেখানে এই সমতা নেই।
আরেকটি পার্থক্য: সাধারণ বীজগণিতে প্রতিটি সংখ্যার “যোগের বিপরীত” (−a) আছে, Boolean algebra-য় নেই। X + Y = 0 হলে X = Y = 0 — কোনো কিছু যোগ করে 1-কে 0-তে ফেরানো যায় না। তাই এখানে “দুই পাশ থেকে বাদ দেওয়া” চলে না: A + B = A + C থেকে B = C সিদ্ধান্ত নেওয়া যায় না (A = 1 হলে B আর C যা-ই হোক)। ছাত্রছাত্রীরা সাধারণ বীজগণিতের অভ্যাসে এই ভুল প্রায়ই করেন।
এই প্রতিসাম্যের প্রকৌশল-মূল্যও আছে। দুই দিকের distributive নিয়ম আছে বলেই যেকোনো function-কে SOP (OR-এর ভেতরে AND) আর POS (AND-এর ভেতরে OR) — দুই রূপেই লেখা যায়, আর duality principle সম্ভব হয়। বাস্তবে কোনো function-এর SOP ছোট, কারো POS; নকশাকার যেটি সস্তা সেটি বেছে নেন।
মূল উপলব্ধি: একই চিহ্ন (+, ·) দেখে পুরোনো অভ্যাস চালানো বিপজ্জনক। Boolean algebra-র নিয়ম আসে তার নিজের postulate থেকে — যেখানে OR আর AND সমান মর্যাদার, আর কোনো কিছু নিজের সাথে মিশে বড় হয় না।
প্র ০৩যদি শুধু NAND দিয়েই সব বানানো যায়, তবে chip-এ AND, OR, XOR — এত রকম gate কেন রাখা হয়? Apollo-র কম্পিউটার কেন প্রায় পুরোটা একটি gate দিয়ে বানানো হয়েছিল?
Functional completeness একটি অস্তিত্বের প্রমাণ — “বানানো সম্ভব” — কিন্তু খরচের কথা বলে না। NAND দিয়ে XOR বানাতে চারটি NAND লাগে: t = (AB)′, তারপর ((At)′(Bt)′)′. প্রতিটি NAND-এ CMOS-এ ৪টি transistor, তাই ১৬টি; অথচ বিশেষভাবে নকশা করা একটি XOR cell সাধারণত এর চেয়ে কম transistor আর কম delay-তে হয়। তেমনি AND বানাতে NAND-এর পরে একটি NOT লাগে — দুই স্তর। তাই আধুনিক chip-নকশায় একটি standard cell library থাকে — শত শত cell: নানা ইনপুট-সংখ্যার NAND, NOR, AND-OR-INVERT (AOI), XOR, multiplexer, flip-flop, প্রতিটির কয়েক রকম চালানোর শক্তি। synthesis টুল বেছে নেয় কোন কাজে কোন cell সবচেয়ে ছোট, দ্রুত বা কম বিদ্যুতের।
তাহলে একটি মাত্র gate কখন ভালো? যখন উৎপাদন আর নির্ভরযোগ্যতাই বড় সমস্যা। NASA-র Apollo Guidance Computer (১৯৬০-এর দশক) ছিল integrated circuit-এর প্রথম দিকের বড় ব্যবহারকারীদের একটি। সাধারণভাবে বর্ণিত তথ্য অনুযায়ী এর logic প্রায় পুরোটাই বানানো হয়েছিল একই ধরনের NOR gate-ওয়ালা chip দিয়ে — হাজার কয়েক chip, সবই এক নকশার। কারণ: তখনকার IC নতুন আর অনিশ্চিত প্রযুক্তি; একটি মাত্র নকশা ব্যাপকভাবে পরীক্ষা করে নির্ভরযোগ্য করা, বড় পরিমাণে কেনা আর মান-নিয়ন্ত্রণ করা অনেক সহজ ছিল। Functional completeness এখানে সরাসরি প্রকৌশল-কৌশল।
আরেকটি দিক: CMOS-এ একটি gate স্বাভাবিকভাবে “উল্টানো” ফল দেয় — pull-up আর pull-down জালের গঠনের কারণে (পর্ব ০৮)। তাই NAND আর NOR একটি স্তরে হয়, আর AND আর OR লাগে NAND/NOR + inverter, দুই স্তর। এজন্য দুই স্তরের SOP বাস্তবে প্রায়ই NAND-NAND হিসেবে বসানো হয়: De Morgan বলে AB + CD = ((AB)′(CD)′)′ — দুই স্তরের NAND, কোনো inverter ছাড়া। একইভাবে POS বসে NOR-NOR রূপে।
তাত্ত্বিক দিক থেকে এই প্রশ্নের পূর্ণ উত্তর দেন Emil Post (১৯৪১): কোন gate-সেট complete, তা পাঁচটি বৈশিষ্ট্য দিয়ে নির্ধারণ করা যায় (monotone, linear, self-dual, 0-রক্ষাকারী, 1-রক্ষাকারী — সেটের প্রতিটি বৈশিষ্ট্য অন্তত একটি gate ভাঙলেই complete). NAND একাই পাঁচটিই ভাঙে।
মূল উপলব্ধি: “সম্ভব” আর “সাশ্রয়ী” আলাদা প্রশ্ন। একটি universal gate নকশাকে সরল আর নির্ভরযোগ্য করে, কিন্তু বৈচিত্র্যময় cell library গতি আর জায়গা বাঁচায় — প্রকৌশলীরা প্রয়োজন অনুযায়ী বেছে নেন।
প্র ০৪Truth table দিয়ে প্রমাণ নিশ্চিত, কিন্তু ১০০ ইনপুটের circuit-এ ২১০০ সারি — শিল্পে দুটি circuit সমান কি না কীভাবে প্রমাণ করা হয়?
Perfect induction ছোট সূত্রের জন্য নিখুঁত, কিন্তু সারির সংখ্যা চলকের সংখ্যার সাথে সূচকীয় হারে বাড়ে। ৩০ চলকে প্রায় একশো কোটি সারি — একটি কম্পিউটার কয়েক সেকেন্ডে পারে। ৬৪ চলকে ২৬৪ — প্রতি সেকেন্ডে একশো কোটি সারি পরীক্ষা করলেও কয়েকশো বছর লাগবে। একটি ৬৪-বিটের adder-এর ইনপুটই ১২৮ বিট। তাই বাস্তব chip-এ “সব সারি পরীক্ষা” অসম্ভব।
অথচ chip কোম্পানির প্রতিদিনের প্রশ্ন ঠিক এটাই: নকশাকারের লেখা RTL আর synthesis টুলের বানানো gate-স্তরের circuit কি একই function? নাকি optimization-এর সময় কোথাও কিছু বদলে গেছে? এর উত্তর দেয় formal equivalence checking. দুটি প্রধান কৌশল: প্রথমত, Binary Decision Diagram (BDD) — Randal Bryant ১৯৮৬ সালে দেখান, একটি নির্দিষ্ট চলক-ক্রম ঠিক করলে প্রতিটি function-এর একটি অনন্য, প্রায়ই ছোট গ্রাফ-রূপ পাওয়া যায় (canonical form-এর ধারণা, তবে truth table-এর চেয়ে অনেক ঘন)। দুটি circuit-এর BDD এক হলেই তারা সমান। দুর্বলতা: গুণ (multiplier)-এর মতো কিছু function-এর BDD যেকোনো ক্রমেই বিশাল।
দ্বিতীয় কৌশল SAT solver: দুটি circuit F আর G থেকে একটি নতুন circuit বানানো হয় F ⊕ G (যাকে “miter” বলা হয়)। প্রশ্ন: এমন কোনো ইনপুট আছে কি, যাতে এটি 1? না থাকলে F = G প্রমাণিত; থাকলে solver সেই ইনপুটটি — counterexample — দিয়ে দেয়, ঠিক এই পর্বের প্রমাণ-যন্ত্রের মতো, কিন্তু সব সারি না গুনে। SAT সমস্যা NP-complete (Cook, ১৯৭১), অর্থাৎ সব ক্ষেত্রে দ্রুত সমাধানের কোনো জানা পদ্ধতি নেই; তবু ১৯৯০-এর দশকের শেষ থেকে conflict-driven clause learning-এর মতো কৌশলে বাস্তব circuit-এ solver-গুলো বিস্ময়কর ভালো কাজ করে।
এই যাচাইয়ের গুরুত্ব বোঝাতে প্রায়ই ১৯৯৪ সালের Intel Pentium-এর FDIV বাগের কথা বলা হয় — floating-point ভাগের একটি lookup table-এ কয়েকটি ভুল মানের কারণে বিরল কিছু ভাগফল ভুল আসত, আর chip বদলাতে কোম্পানির বড় অঙ্কের খরচ হয়েছিল। সাধারণভাবে বলা হয়, এরপর শিল্পে formal verification-এর ব্যবহার অনেক বেড়ে যায়।
মূল উপলব্ধি: truth table প্রমাণের ধারণা — “সব ক্ষেত্রে দুই পাশ সমান” — শিল্পেও একই, শুধু সারি না গুনে বুদ্ধিমান গাণিতিক কৌশলে। এই পর্বের ছোট প্রমাণ-যন্ত্র সেই বিশাল শিল্পের একটি ক্ষুদ্র রূপ।
প্র ০৫প্রোগ্রামের শর্তে Boolean algebra-র সূত্র কখন নিরাপদে খাটে, আর কখন খাটে না?
Boolean algebra একটি নিখুঁত জগতের কথা বলে: প্রতিটি চলকের মান ঠিক 0 বা 1, হিসাব করতে কোনো সময় লাগে না, আর হিসাবের কোনো পার্শ্বপ্রতিক্রিয়া নেই। প্রোগ্রামের জগৎ তিন দিকেই আলাদা হতে পারে, আর প্রতিটি দিক থেকে একটি সূত্র ভাঙে।
এক, হিসাবের ক্রম আর পার্শ্বপ্রতিক্রিয়া। && আর || short-circuit বলে ডান পাশ হয়তো হিসাবই হয় না। তাই p != NULL && p->x-এ commutative নিয়ম খাটানো যায় না। check() || retry()-এ retry হয়তো কখনো ডাকা হবে না। idempotent নিয়মও (A && A = A) বিপজ্জনক হতে পারে, যদি A হলো read_byte() — দুবার ডাকলে দুটি আলাদা byte. তাই compiler এমন রূপান্তর কেবল তখনই করে, যখন প্রমাণ করতে পারে যে অংশগুলো “বিশুদ্ধ” (কোনো side effect নেই)।
দুই, দুইয়ের বেশি মান। SQL-এর NULL তিন-মানের যুক্তি আনে, যেখানে X OR NOT X সবসময় TRUE নয়। Floating point-এর NaN-এর সাথে প্রতিটি তুলনা মিথ্যা — IEEE 754-এর নিয়ম — তাই !(a < b) থেকে a >= b বানানো, যা পূর্ণসংখ্যায় একদম সঠিক, NaN থাকলে ভুল। sorting বা নিরাপত্তা-যাচাইয়ের কোডে এমন রূপান্তর গুরুতর বাগ তৈরি করতে পারে। JavaScript-এর “truthy/falsy” মান (০, "", null, undefined, NaN) আর &&-এর “শেষ মানটি ফেরত দেওয়া” আচরণও খাঁটি Boolean নয়।
তিন, সময়। hardware-এ gate-এর delay আছে, তাই গাণিতিকভাবে সমান দুটি circuit ক্ষণিকের জন্য আলাদা আউটপুট দিতে পারে — পর্ব ১০-এর hazard. আর নিরাপত্তা-কোডে (যেমন পাসওয়ার্ড বা cryptographic চাবি তুলনা) short-circuit নিজেই বিপদ: প্রথম অমিলেই থেমে গেলে উত্তর দেওয়ার সময় থেকে বোঝা যায় কতটা মিলেছিল। তাই সেখানে ইচ্ছা করে bitwise | দিয়ে সব byte-এর পার্থক্য জমিয়ে শেষে একবার পরীক্ষা করা হয় (constant-time তুলনা)।
তবু বেশিরভাগ ক্ষেত্রে সূত্রগুলো নিরাপদ ও খুব উপকারী: De Morgan দিয়ে জটিল নেতিবাচক শর্ত সরল করা, absorption দিয়ে অপ্রয়োজনীয় পরীক্ষা বাদ দেওয়া, আর code review-তে “এই শর্ত কি সবসময় সত্য?” ধরতে পারা।
মূল উপলব্ধি: সূত্র খাটানোর আগে তিনটি প্রশ্ন করুন — মান কি সত্যিই দুটিই? অংশগুলোর হিসাবের কোনো পার্শ্বপ্রতিক্রিয়া আছে কি? সময় কি গুরুত্বপূর্ণ? তিনটির উত্তর “না” হলে Boolean algebra নিশ্চিন্তে চলে।
অনুশীলন
কাগজ-কলম নিন — প্রথম দুটি হাতে হিসাবের, তৃতীয়টি আউটপুট অনুমানের, শেষটি circuit লেখার।
-
বীজগাণিতিক সরলীকরণ: F = ABC + ABC′ + AB′C + A′BC — প্রতিটি ধাপে সূত্রের নাম লিখে সরল করুন। ফলটি কোন পরিচিত function?
কৌশল: ABC পদটি তিনটি পদের সাথে জোড়া বাঁধতে পারে, তাই idempotent নিয়মে (X = X + X + X) একে তিনবার লিখি।
- F = (ABC + ABC′) + (ABC + AB′C) + (ABC + A′BC) [idempotent, commutative]
- = AB(C + C′) + AC(B + B′) + BC(A + A′) [distributive]
- = AB · 1 + AC · 1 + BC · 1 [complement]
- = AB + AC + BC [identity]
এটি তিন ইনপুটের majority function — অন্তত দুটি 1 হলে 1, Σm(3, 5, 6, 7). পর্ব ১১-এ full adder-এর carry-out ঠিক এটাই। ১২টি literal থেকে ৬টি।
-
Canonical form: F(A, B, C) = Σm(0, 2, 5, 7). (ক) canonical SOP লিখুন। (খ) ΠM আর canonical POS লিখুন। (গ) দুটিকেই সরল করুন। (ঘ) F-কে একটি gate দিয়ে প্রকাশ করুন।
(ক) 000 → A′B′C′, 010 → A′BC′, 101 → AB′C, 111 → ABC. F = A′B′C′ + A′BC′ + AB′C + ABC.
(খ) বাকি সারি ১, ৩, ৪, ৬: F = ΠM(1, 3, 4, 6) = (A + B + C′)(A + B′ + C′)(A′ + B + C)(A′ + B′ + C).
(গ) SOP: A′B′C′ + A′BC′ = A′C′(B′ + B) = A′C′; AB′C + ABC = AC. তাই F = A′C′ + AC. POS: (A + B + C′)(A + B′ + C′) = A + C′ [(X + B)(X + B′) = X]; (A′ + B + C)(A′ + B′ + C) = A′ + C. তাই F = (A + C′)(A′ + C). গুণ করে মিলিয়ে নিন: AA′ + AC + A′C′ + C′C = A′C′ + AC.
(ঘ) A′C′ + AC = 1 ঠিক যখন A = C — এটি XNOR: F = (A ⊕ C)′. B-এর ওপর F একেবারেই নির্ভর করে না। অংশ ৭-এর canonical_forms.js-এর দ্বিতীয় আউটপুট (কলাম 10100101) এর সাথে মিলিয়ে দেখুন।
-
আউটপুট অনুমান (C): নিচের কোড কী ছাপবে? তারপর
if (!(x > 0 && y != 0))শর্তটি De Morgan দিয়ে NOT ছাড়া লিখুন।int a = 2, b = 4; printf("%d %d %d %d\n", a & b, a && b, !a, ~a); printf("%d\n", (a | b) == 6 && (a ^ b) == (a | b));প্রথম লাইন:
0 1 0 -3. a =010, b =100— কোনো বিট একসাথে 1 নয়, তাইa & b= 0; কিন্তু দুটিই অশূন্য, তাইa && b= 1.!a= 0 (a সত্য), আর~aসব ৩২টি বিট উল্টায়: two's complement-এ ~x = −x − 1, তাই −৩ (পর্ব ০৫)।দ্বিতীয় লাইন:
1. a | b =110= ৬, আর যেহেতু a আর b-তে কোনো সাধারণ 1-বিট নেই, XOR আর OR একই (XOR কেবল দুটি 1 মিললে OR থেকে আলাদা হয়)।==-এর precedence&&-এর চেয়ে বেশি, তাই দুটি তুলনা আগে, তারপর AND.De Morgan:
!(x > 0 && y != 0)=!(x > 0) || !(y != 0)=x <= 0 || y == 0. (x, y পূর্ণসংখ্যা ধরে; float হলে NaN-এর কারণে!(x > 0)আরx <= 0আলাদা হতে পারে।) -
Circuit লিখুন: শুধু ২-ইনপুট NAND gate দিয়ে (ক) NOT, (খ) AND, (গ) OR আর (ঘ) XOR বানান। প্রতিটিতে কয়টি NAND লাগল, আর XOR-এর নকশাটি সঠিক কেন — বীজগাণিতিকভাবে দেখান।
NAND(X, Y) = (XY)′ লিখি।
- (ক) NOT — ১টি: NAND(A, A) = (AA)′ = A′ [idempotent].
- (খ) AND — ২টি: t = NAND(A, B), তারপর NAND(t, t) = t′ = AB [involution].
- (গ) OR — ৩টি: NAND(NAND(A, A), NAND(B, B)) = (A′B′)′ = A + B [De Morgan].
- (ঘ) XOR — ৪টি: t = NAND(A, B) = (AB)′; u = NAND(A, t); v = NAND(B, t); F = NAND(u, v).
XOR-এর প্রমাণ: u = (A · (AB)′)′ = (A(A′ + B′))′ = (AB′)′ [De Morgan, distributive, A · A′ = 0]. তেমনি v = (A′B)′. তাহলে F = (u · v)′ = u′ + v′ [De Morgan] = AB′ + A′B = A ⊕ B. চারটি সারিতে perfect induction দিয়েও মিলিয়ে নিন: 00 → t = 1, u = 1, v = 1, F = 0; 01 → t = 1, u = 1, v = 0, F = 1; 10 → u = 0, v = 1, F = 1; 11 → t = 0, u = 1, v = 1, F = 0. ঠিক XOR. মজার কথা, সরল হিসাবে (A′B + AB′ সরাসরি) NAND-এ বানালে বেশি gate লাগে; t-কে দুবার ব্যবহার করাই কৌশল।
নিজেকে যাচাই করুন
ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।
ক্রমএকটি truth table থেকে canonical SOP লেখার ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)
- n চলকের ২ⁿ টি সারি binary ক্রমে লেখা
- প্রতিটি সারিতে function-এর মান বসানো
- যে সারিগুলোতে F = 1, সেগুলো চিহ্নিত করা
- প্রতিটি চিহ্নিত সারির minterm লেখা (0 → উল্টো, 1 → সরল)
- সব minterm OR করে F = Σm(…) আকারে লেখা
Boolean algebra-য় A + BC-এর সমান কোনটি?
- AB + AC
- (A + B)(A + C)
- AB + C
- A + B + C
De Morgan-এর সূত্র অনুযায়ী (A + B + C)′ কত?
- A′ + B′ + C′
- ABC
- A′B′C′
- A + B + C
তিনটি চলকের (A, B, C) মোট কয়টি আলাদা Boolean function সম্ভব?
- ৮
- ১৬
- ৬৪
- ২৫৬
তিন চলক A, B, C (A হলো সবচেয়ে বাঁয়ের বিট) হলে maxterm M5 কোনটি?
- A′ + B + C′
- AB′C
- A + B′ + C
- A′BC′
XY + X′Z + YZ-এর সবচেয়ে সরল রূপ কোনটি?
- XY + YZ
- Y + Z
- XY + X′Z
- X + Z
C ভাষায় !(a && b)-এর সমান কোনটি (a, b পূর্ণসংখ্যা, কোনো side effect নেই)?
- !a && !b
- ~a || ~b
- !(a || b)
- !a || !b
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:
মনে রাখুন
- তিন মৌলিক কাজ: AND (series সুইচ), OR (parallel সুইচ), NOT; বাকি XOR, XNOR, NAND, NOR এদের থেকে তৈরি। precedence: বন্ধনী → NOT → AND → OR.
- সূত্র জোড়ায় জোড়ায়: identity, null, idempotent, complement, distributive (A + BC = (A + B)(A + C)-ও), absorption, consensus, De Morgan — duality দিয়ে প্রতিটির জোড়া পাওয়া যায়।
- প্রমাণের দুই পথ: সব ২ⁿ সারি মিলিয়ে perfect induction, অথবা প্রতিটি ধাপে সূত্রের নাম লিখে বীজগাণিতিক প্রমাণ; একটি counterexample-ই ভুল সূত্র বাতিল করে।
- Canonical form: minterm-এ 0 → prime, maxterm-এ 1 → prime; F = Σm(1-সারি) = ΠM(0-সারি), আর দুই তালিকা মিলে সব সারি।
- Completeness আর কোড: {AND, OR, NOT}, {NAND}, {NOR} প্রতিটি complete; n চলকের function ২২ⁿটি; কোডে De Morgan চলে, কিন্তু short-circuit, NULL আর NaN-এ সাবধান।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ০৮ · Logic gate আর transistor — CMOS, NAND-NOR universal gate আর delayপরবর্তী পর্বBoolean কাজ থেকে বাস্তব transistor circuit.
- কম্পিউটার আর্কিটেকচার ও ডিজিটাল লজিক · কোর্স হোম৬২টি পর্বtransistor থেকে multicore পর্যন্ত পুরো রোডম্যাপ।
- Computer Fundamentals · Boolean algebra-র প্রাথমিক পরিচয়ভিত্তিএকেবারে শুরু থেকে সহজ ভাষায় AND-OR-NOT.
- C · বিটওয়াইজ অপারেশনপাশের ট্র্যাক&, |, ^, ~ আর mask — কোডে Boolean algebra.
- DBMS ও SQL · operator আর NULLপ্রয়োগSQL-এর তিন-মানের যুক্তি বাস্তব query-তে।