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

সেটের অপারেশন — union, intersection, Venn diagram আর identity

Set Operations — Union, Intersection, Complement, Set Identities, Membership Tables and Bit Strings

Taught in Bangla, this lesson defines union, intersection, complement, difference and symmetric difference as the set versions of logical connectives, proves |A ∪ B| = |A| + |B| − |A ∩ B|, and proves set identities by element chasing, membership tables and chains of identities. In-page Python checks identities over all 8 regions, catches the false claim (A ∪ B) − B = A with random sets, and represents a shop's product sets as bit strings. It also introduces multisets and fuzzy sets.

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

  • Union, intersection, difference, complement আর symmetric difference-এর নিখুঁত সংজ্ঞা, Venn diagram-এ ছবি আর logic-এর সঙ্গে সম্পর্ক
  • |A ∪ B| = |A| + |B| − |A ∩ B|-এর প্রমাণ আর পরীক্ষার ধাঁচের হিসাব
  • Set identity-র তালিকা, আর element chasing, membership table ও logical equivalence দিয়ে প্রমাণ
  • অনেক সেটের (indexed family) union আর intersection, সাধারণ De Morgan
  • Bit string দিয়ে কম্পিউটারে সেট রাখা; multiset আর fuzzy set-এর ধারণা

১ · সেট থেকে নতুন সেট — union আর intersection

বাজারঘর প্রতি সপ্তাহে একটি ছোট প্রতিবেদন বানায়। এই সপ্তাহে দশজন নিয়মিত ক্রেতার ক্রমিক নম্বর 1 থেকে 10. তাঁদের মধ্যে যাঁরা চাল কিনেছেন তাঁদের সেট A = {1, 2, 3, 5, 8}, আর যাঁরা তেল কিনেছেন তাঁদের সেট B = {2, 3, 4, 8, 9}. ম্যানেজার চারটি প্রশ্ন করেন: কারা অন্তত একটি কিনেছেন? কারা দুটোই? কারা শুধু চাল? কারা কিছুই কেনেননি? প্রতিটি প্রশ্নের উত্তর একটি নতুন সেট, যা A আর B থেকে একটি নির্দিষ্ট নিয়মে তৈরি। এই নিয়মগুলোকেই বলে সেটের অপারেশন।

পর্ব ১৪ “সেট — সংজ্ঞা, subset, power set আর Cartesian product”-এ সেট, উপাদান, subset আর set-builder সংকেত {x : P(x)} দেখেছেন। এই পর্বে সেগুলো ব্যবহার করব। সবচেয়ে জরুরি একটি তথ্য মনে রাখুন: দুটি সেট সমান, যদি আর কেবল যদি তাদের উপাদান হুবহু একই। তাই A = B প্রমাণ মানে দুটি কাজ: A ⊆ B আর B ⊆ A. এই পর্বের প্রায় প্রতিটি প্রমাণ এই কাঠামোয় দাঁড়াবে।

সংজ্ঞা ১.১ (union আর intersection)

A আর B দুটি সেট। তাদের union (মিলন) হলো A ∪ B = {x : x ∈ A ∨ x ∈ B}, অর্থাৎ যেসব উপাদান অন্তত একটি সেটে আছে। তাদের intersection (ছেদ) হলো A ∩ B = {x : x ∈ A ∧ x ∈ B}, অর্থাৎ যেসব উপাদান দুটোতেই আছে।

বাজারঘরের উদাহরণে A ∪ B = {1, 2, 3, 4, 5, 8, 9}: সাতজন অন্তত একটি পণ্য কিনেছেন। A ∩ B = {2, 3, 8}: তিনজন দুটোই কিনেছেন। খেয়াল করুন, 2, 3 আর 8 দুই সেটেই আছে, কিন্তু union-এ একবারই লেখা হয়েছে; সেটে একই উপাদান দুবার থাকে না। এখানে “অথবা” মানে সবসময় অন্তর্ভুক্তিমূলক অথবা (inclusive or): দুটোতে থাকলেও x ∈ A ∪ B. পর্ব ০২-এর ∨ ঠিক এমনই।

সংজ্ঞা দুটি পড়লেই একটি গভীর মিল চোখে পড়ে: সেটের ∪ আসলে logic-এর ∨, আর ∩ আসলে ∧, শুধু প্রতিটি বাক্যের শুরুতে “x ∈” বসানো। পর্ব ০৪-এর ভাষায়, যদি A হয় predicate P(x)-এর truth set {x : P(x)} আর B হয় Q(x)-এর truth set, তবে A ∪ B হলো P(x) ∨ Q(x)-এর truth set আর A ∩ B হলো P(x) ∧ Q(x)-এর। এই একটি পর্যবেক্ষণই এই পর্বের মূল সুর: পর্ব ০৩-এর প্রতিটি logical equivalence একটি set identity হয়ে ফিরে আসবে।

ক্রিকেট দলের নির্বাচনের কথা ভাবুন। A = যারা ভালো ব্যাট করে, B = যারা ভালো বল করে। নির্বাচক যদি বলেন “ব্যাট অথবা বলে ভালো যে কেউ ক্যাম্পে আসবে”, ক্যাম্পের তালিকা A ∪ B; অলরাউন্ডাররাও আছে, কিন্তু তালিকায় একবার। যদি বলেন “শুধু অলরাউন্ডার”, তালিকা A ∩ B. তালিকা ছোট হলো, কারণ শর্ত কড়া হলো। ∪ তালিকা বড় করে, ∩ ছোট।

শেষ কথাটি একটি ছোট উপপাদ্য, আর এই পর্বের প্রথম element chasing প্রমাণ।

উপপাদ্য ১.২

যেকোনো সেট A, B-এর জন্য A ∩ B ⊆ A ⊆ A ∪ B.

প্রমাণ:

  1. ধরি x ∈ A ∩ B যেকোনো একটি উপাদান। সংজ্ঞা অনুযায়ী x ∈ A ∧ x ∈ B, তাই বিশেষভাবে x ∈ A. অতএব A ∩ B ⊆ A. — ∩-এর সংজ্ঞা, simplification (পর্ব ০৬)
  2. ধরি x ∈ A. তাহলে “x ∈ A ∨ x ∈ B” সত্য, কারণ একটি অংশ সত্য হলেই ∨ সত্য। অতএব x ∈ A ∪ B, আর A ⊆ A ∪ B. ∎ — addition (পর্ব ০৬), ∪-এর সংজ্ঞা

লক্ষ করুন প্রমাণের ভঙ্গি: “যেকোনো একটি উপাদান x নিই, সংজ্ঞা খুলি, logic-এর একটি নিয়ম খাটাই, আবার সংজ্ঞায় ফিরি।” এই ভঙ্গির নাম element chasing: উপাদানটিকে এক সেট থেকে আরেক সেটে “তাড়া করে” নিয়ে যাওয়া। x যেকোনো, তাই ফলটি প্রতিটি উপাদানের জন্য সত্য; পর্ব ০৬-এর universal generalization.

২ · Difference, complement আর symmetric difference

ম্যানেজারের তৃতীয় আর চতুর্থ প্রশ্ন ছিল “শুধু চাল” আর “কিছুই না”। এদের জন্য আরও তিনটি অপারেশন লাগে।

সংজ্ঞা ২.১

Difference (বিয়োগ): A − B = {x : x ∈ A ∧ x ∉ B}; অনেক বইয়ে A \ B লেখা হয়। এটি A-র সেই অংশ, যা B-তে নেই।

Universal set U: আলোচনার সব উপাদানের একটি নির্দিষ্ট সেট, যার প্রতিটি সেট subset. A-র complement (পূরক): A′ = U − A = {x ∈ U : x ∉ A}; অন্য বইয়ে Ā বা Ac.

Symmetric difference: A ⊕ B = (A − B) ∪ (B − A), অর্থাৎ যেসব উপাদান ঠিক একটি সেটে আছে, দুটোতে নয়। অনেক বইয়ে A △ B.

বাজারঘরে U = {1, 2, …, 10}. তাহলে A − B = {1, 5} (শুধু চাল), B − A = {4, 9} (শুধু তেল), A′ = {4, 6, 7, 9, 10} (চাল কেনেননি), আর A ⊕ B = {1, 4, 5, 9} (ঠিক একটি কিনেছেন)। “কিছুই কেনেননি” হলো (A ∪ B)′ = {6, 7, 10}. লক্ষ করুন, A − B ≠ B − A: difference-এ ক্রম জরুরি, ঠিক সংখ্যার বিয়োগের মতো।

Complement সবসময় একটি U-এর সাপেক্ষে। “জোড় সংখ্যার complement” প্রশ্নটির উত্তর U-এর ওপর নির্ভর করে: U = ℤ হলে উত্তর সব বিজোড় পূর্ণসংখ্যা, U = {1, …, 10} হলে {1, 3, 5, 7, 9}, আর U = ℝ হলে সব বিজোড় পূর্ণসংখ্যার সঙ্গে সব অপূর্ণ বাস্তব সংখ্যাও। U না বলে complement লেখা একটি অসম্পূর্ণ বাক্য।

দুটি সেট disjoint (বিচ্ছিন্ন), যদি A ∩ B = ∅, অর্থাৎ কোনো সাধারণ উপাদান নেই। যেমন A − B আর B − A সবসময় disjoint. অনেকগুলো সেট A1, A2, …, An pairwise disjoint (জোড়ায় জোড়ায় বিচ্ছিন্ন), যদি i ≠ j হলেই Ai ∩ Aj = ∅. বাজারঘরের ক্রেতাদের জেলা অনুযায়ী ভাগ করলে প্রতিটি জেলার সেট pairwise disjoint, কারণ একজন ক্রেতার ঠিকানা একটি জেলায়। এমন ভাগের নাম partition, যা পর্ব ৫৫ “Equivalence relation আর partition”-এ পুরো আলোচনা হবে।

লেমা ২.২ (difference মানে complement-এর সঙ্গে ছেদ)

U-এর যেকোনো subset A, B-এর জন্য A − B = A ∩ B′.

প্রমাণ: x ∈ U যেকোনো। x ∈ A − B ⇔ x ∈ A ∧ x ∉ B (difference-এর সংজ্ঞা) ⇔ x ∈ A ∧ x ∈ B′ (complement-এর সংজ্ঞা, কারণ x ∈ U) ⇔ x ∈ A ∩ B′ (∩-এর সংজ্ঞা)। প্রতিটি ধাপ “যদি আর কেবল যদি”, তাই দুই দিকের ⊆ একসঙ্গে প্রমাণ হলো। ∎

এই লেমা কাজের: difference-কে ∩ আর ′-এ বদলে নিলে অনেক প্রমাণ ছোট হয়, কারণ ∩ আর ′-এর সূত্র বেশি জানা। একইভাবে A ⊕ B = (A ∪ B) − (A ∩ B): “অন্তত একটিতে, কিন্তু দুটোতে নয়”। এর প্রমাণ §৫-এর membership table-এ এক নজরে দেখা যাবে। আর logic-এ, x ∈ A ⊕ B ⇔ (x ∈ A) ⊕ (x ∈ B), পর্ব ০২-এর exclusive or.

ছয়টি অপারেশন, ছয়টি Venn diagram

আয়তক্ষেত্র = universal set U, বাঁ বৃত্ত A, ডান বৃত্ত B; রং করা অংশই ফল

Venn diagrams of six set operations ABA ∪ Bunion ABA ∩ Bintersection ABA − Bdifference ABB − Adifference ABA ⊕ Bsymmetric diff. ABUA′complement
ছবি ২.১ — Venn diagram ছবি দিয়ে ভাবতে সাহায্য করে, কিন্তু প্রমাণ নয়: ছবিতে প্রতিটি অঞ্চল ফাঁকা নয় বলে মনে হয়, অথচ আসল সেটে কোনো অঞ্চল ফাঁকা থাকতে পারে। প্রমাণ আসবে সংজ্ঞা থেকে (§৪–§৬)।
অপারেশনx সদস্য হওয়ার শর্তconnectivePython
A ∪ Bx ∈ A ∨ x ∈ B∨ (OR)A | B
A ∩ Bx ∈ A ∧ x ∈ B∧ (AND)A & B
A − Bx ∈ A ∧ ¬(x ∈ B)∧ ¬A - B
A′x ∈ U ∧ ¬(x ∈ A)¬ (NOT)U - A
A ⊕ B(x ∈ A) ⊕ (x ∈ B)⊕ (XOR)A ^ B

শেষ কলামটি Python-এর set-এর অপারেটর; এগুলোর ব্যবহার, frozenset আর কেন সেটের উপাদান hashable হতে হয়, Python কোর্সের পর্ব ১৭-এ আছে। SQL-এ একই কাজ করে UNION, INTERSECT আর EXCEPT (ডেটাবেস কোর্সের পর্ব ২২), আর relational algebra-র ভিত্তিও এই অপারেশনগুলো (পর্ব ৩২)।

৩ · মিলনের আকার — |A ∪ B| = |A| + |B| − |A ∩ B|

সসীম সেট A-র cardinality |A| মানে তার উপাদানের সংখ্যা। বাজারঘরে এক সপ্তাহে ১৮০ জন চাল আর ১৫০ জন তেল কিনেছেন। মোট কতজন ক্রেতা? ১৮০ + ১৫০ = ৩৩০ বললে ভুল হতে পারে: যাঁরা দুটোই কিনেছেন, তাঁদের দুবার গোনা হয়েছে। হিসাব বলছে ৭০ জন দুটোই কিনেছেন; তাহলে উত্তর ৩৩০ − ৭০ = ২৬০. এই সংশোধনের পেছনের উপপাদ্যটি সরল, কিন্তু counting-এর অন্যতম গুরুত্বপূর্ণ হাতিয়ার।

উপপাদ্য ৩.১ (দুই সেটের inclusion–exclusion)

A আর B সসীম সেট হলে |A ∪ B| = |A| + |B| − |A ∩ B|.

প্রমাণে একটি মৌলিক গণনার তথ্য লাগবে, যা পর্ব ৩১ “গণনার মূল নিয়ম — যোগ, গুণ, বিয়োগ আর ভাগ”-এ sum rule নামে আসবে: X আর Y সসীম আর disjoint হলে |X ∪ Y| = |X| + |Y|. এটি গোনার অর্থ থেকেই আসে: কোনো উপাদান দুই দলে নেই, তাই আলাদা আলাদা গুনে যোগ করলে প্রতিটি ঠিক একবার গোনা হয়।

প্রমাণ:

  1. A ∪ B-কে তিনটি টুকরোয় ভাগ করি: X = A − B, Y = A ∩ B, Z = B − A. A ∪ B-এর প্রতিটি উপাদান x ঠিক একটি টুকরোয় পড়ে: x ∈ A আর x ∈ B হলে Y-তে; x ∈ A কিন্তু x ∉ B হলে X-এ; x ∉ A হলে (তবু x ∈ A ∪ B, তাই x ∈ B) Z-তে। তাই X, Y, Z pairwise disjoint আর X ∪ Y ∪ Z = A ∪ B. — proof by cases (পর্ব ০৯)
  2. Sum rule দুবার খাটিয়ে: |A ∪ B| = |X| + |Y| + |Z|. — sum rule
  3. একই যুক্তিতে A হলো disjoint X আর Y-এর মিলন, তাই |A| = |X| + |Y|, অর্থাৎ |X| = |A| − |A ∩ B|. — sum rule
  4. তেমনি |B| = |Z| + |Y|, অর্থাৎ |Z| = |B| − |A ∩ B|. — sum rule
  5. ধাপ ২-এ বসিয়ে: |A ∪ B| = (|A| − |A ∩ B|) + |A ∩ B| + (|B| − |A ∩ B|) = |A| + |B| − |A ∩ B|. ∎ — বীজগণিত

প্রমাণের ভেতরে আরও তিনটি দরকারি সূত্র লুকিয়ে আছে। ধাপ ৩ থেকে |A − B| = |A| − |A ∩ B|. X আর Z যোগ করলে |A ⊕ B| = |A| + |B| − 2|A ∩ B|. আর U সসীম হলে A আর A′ disjoint, মিলন U, তাই |A′| = |U| − |A|. সঙ্গে একটি সীমা: |A ∩ B| ≥ 0 আর A ⊆ A ∪ B থেকে max(|A|, |B|) ≤ |A ∪ B| ≤ |A| + |B|, আর ডান দিকে সমতা ঠিক তখন, যখন A, B disjoint.

পরীক্ষার ধাঁচের হিসাব

প্রশ্ন: 1 থেকে 1000-এর মধ্যে কতগুলো পূর্ণসংখ্যা 3 অথবা 5 দিয়ে বিভাজ্য?

  1. A = 3-এর গুণিতক, B = 5-এর গুণিতক। |A| = ⌊1000/3⌋ = 333, |B| = ⌊1000/5⌋ = 200. (⌊x⌋ মানে x-এর চেয়ে বড় নয় এমন বৃহত্তম পূর্ণসংখ্যা; পর্ব ১৬-এ বিস্তারিত।)
  2. A ∩ B = যারা 3 আর 5 দুটো দিয়েই বিভাজ্য = 15-এর গুণিতক (3 আর 5 মৌলিক, তাই দুটো দিয়ে বিভাজ্য মানে 15 দিয়ে বিভাজ্য)। |A ∩ B| = ⌊1000/15⌋ = 66.
  3. |A ∪ B| = 333 + 200 − 66 = 467. আর কোনোটি দিয়েই বিভাজ্য নয়: |(A ∪ B)′| = 1000 − 467 = 533.

এই উত্তর scratch-এ 1 থেকে 1000 পর্যন্ত গুনে মেলানো হয়েছে। তিনটি সেট হলে সূত্রটি হয় |A ∪ B ∪ C| = |A| + |B| + |C| − |A ∩ B| − |A ∩ C| − |B ∩ C| + |A ∩ B ∩ C|: শেষ পদটি যোগ করতে হয়, কারণ মাঝের অঞ্চল তিনবার যোগ আর তিনবার বিয়োগ হয়ে শূন্য হয়ে গিয়েছিল। যেকোনো n সেটের সাধারণ সূত্র আর তার প্রমাণ পর্ব ৪৯ “Inclusion–exclusion আর derangement”-এ; এর এক লাইনের সম্ভাবনা-রূপ P(A ∪ B) = P(A) + P(B) − P(A ∩ B) পর্ব ৩৮-এ।

উপপাদ্য ৩.১ শুধু সসীম সেটের জন্য। ℕ আর জোড় সংখ্যার সেট দুটোই অসীম; সেখানে “|A| − |A ∩ B|” লিখলে ∞ − ∞-এর মতো অর্থহীন রাশি আসে। অসীম সেটের আকার তুলনা সম্পূর্ণ আলাদা একটি গল্প, পর্ব ১৮ “Cardinality — countable, uncountable আর Cantor-এর diagonal”-এ।

৪ · Set identity আর element chasing প্রমাণ

একটি set identity হলো এমন একটি সমীকরণ, যা সেটের প্রতিটি পছন্দে সত্য, যেমন A ∪ B = B ∪ A. বীজগণিতে a(b + c) = ab + ac যেমন প্রতিটি সংখ্যায় সত্য। নিচের তালিকাটি এই পর্বের মূল সম্পদ। প্রতিটি সারির ডান কলামে পর্ব ০৩-এর logical equivalence-টি দেওয়া হলো, যা থেকে identity-টি আসে।

নামSet identityLogic-এ সমতুল্য
IdentityA ∪ ∅ = A, A ∩ U = Ap ∨ F ≡ p, p ∧ T ≡ p
DominationA ∪ U = U, A ∩ ∅ = ∅p ∨ T ≡ T, p ∧ F ≡ F
IdempotentA ∪ A = A, A ∩ A = Ap ∨ p ≡ p, p ∧ p ≡ p
Complementation(A′)′ = A¬¬p ≡ p
CommutativeA ∪ B = B ∪ A, A ∩ B = B ∩ Ap ∨ q ≡ q ∨ p
AssociativeA ∪ (B ∪ C) = (A ∪ B) ∪ C, ∩-এওp ∨ (q ∨ r) ≡ (p ∨ q) ∨ r
DistributiveA ∩ (B ∪ C) = (A ∩ B) ∪ (A ∩ C)
A ∪ (B ∩ C) = (A ∪ B) ∩ (A ∪ C)
p ∧ (q ∨ r) ≡ (p ∧ q) ∨ (p ∧ r)
De Morgan(A ∪ B)′ = A′ ∩ B′
(A ∩ B)′ = A′ ∪ B′
¬(p ∨ q) ≡ ¬p ∧ ¬q
AbsorptionA ∪ (A ∩ B) = A, A ∩ (A ∪ B) = Ap ∨ (p ∧ q) ≡ p
ComplementA ∪ A′ = U, A ∩ A′ = ∅p ∨ ¬p ≡ T, p ∧ ¬p ≡ F

তালিকায় একটি সুন্দর প্রতিসাম্য আছে: প্রায় প্রতিটি সারিতে দুটি identity, আর একটিতে ∪ ↔ ∩ আর ∅ ↔ U অদলবদল করলে অন্যটি পাওয়া যায়। একে বলে duality: একটি identity সত্য হলে তার dual-ও সত্য। পর্ব ০৩-এ logic-এ একই জিনিস দেখেছেন, আর পর্ব ৬৯ “Boolean algebra-র গণিত”-এ এটি সাধারণ উপপাদ্য হবে। তাই তালিকার অর্ধেক মুখস্থ রাখলেই চলে।

Element chasing: পূর্ণ প্রমাণ

এবার তালিকার সবচেয়ে বেশি ব্যবহৃত সারিটি প্রমাণ করি। দুই দিকের ⊆ আলাদা করে দেখাব, আর একটি দিকে পর্ব ০৯-এর proof by cases লাগবে।

উপপাদ্য ৪.১ (distributive)

যেকোনো সেট A, B, C-এর জন্য A ∩ (B ∪ C) = (A ∩ B) ∪ (A ∩ C).

1লক্ষ্য: L ⊆ R এবং R ⊆ L2x ∈ L = A∩(B∪C)3⇒ x∈A, এবং x∈B বা x∈C4ক্ষেত্র ১: x∈B ⇒ x∈A∩B5ক্ষেত্র ২: x∈C ⇒ x∈A∩C6y∈R ⇒ y∈A∩B বা y∈A∩C7⇒ y∈A এবং y∈B∪C ⇒ y∈L8L = R ∎
নমুনা: A={1,2,3,4}, B={3,4,5}, C={2,4,6}
যা জানি
যা পেলাম
নমুনা উপাদান
নিয়ম
  1. লক্ষ্য ঠিক করা। বাঁ দিক L = A ∩ (B ∪ C), ডান দিক R = (A ∩ B) ∪ (A ∩ C). সমতা মানে দুটি উপসেট-সম্পর্ক। নমুনায় দুই দিকই {2, 3, 4}; নমুনা মিলেছে, কিন্তু প্রমাণ লাগবে যেকোনো সেটের জন্য।
  2. বাঁ থেকে ডানে, শুরু। যেকোনো x ∈ L নিই। ∩-এর সংজ্ঞায় x ∈ A এবং x ∈ B ∪ C; ∪-এর সংজ্ঞায় শেষ অংশ মানে x ∈ B অথবা x ∈ C. নমুনায় x = 3: 3 ∈ A, আর 3 ∈ B.
  3. ক্ষেত্র ১: x ∈ B. তাহলে x ∈ A আর x ∈ B, অর্থাৎ x ∈ A ∩ B. উপপাদ্য ১.২ বলে A ∩ B ⊆ R, তাই x ∈ R. নমুনায় 3 ∈ A ∩ B = {3, 4}.
  4. ক্ষেত্র ২: x ∈ C. একইভাবে x ∈ A ∩ C ⊆ R. দুই ক্ষেত্রই x ∈ R দিল, আর “x ∈ B বা x ∈ C”-এর বাইরে কোনো ক্ষেত্র নেই। তাই L ⊆ R. নমুনায় x = 2: 2 ∈ C, তাই 2 ∈ A ∩ C = {2, 4}.
  5. ডান থেকে বাঁয়ে। যেকোনো y ∈ R নিই: y ∈ A ∩ B অথবা y ∈ A ∩ C. দুই ক্ষেত্রেই y ∈ A; আর প্রথমটিতে y ∈ B, দ্বিতীয়টিতে y ∈ C, তাই y ∈ B ∪ C. অতএব y ∈ A ∩ (B ∪ C) = L, আর R ⊆ L. নমুনায় y = 4 দুই টুকরোতেই আছে, তাতে কোনো সমস্যা নেই।
  6. উপসংহার। L ⊆ R আর R ⊆ L, তাই সেটের সমতার সংজ্ঞায় L = R. x আর y যেকোনো ছিল, তাই ফলটি প্রতিটি A, B, C-এর জন্য সত্য। ∎

এই প্রমাণটি আসলে পর্ব ০৩-এর logical equivalence p ∧ (q ∨ r) ≡ (p ∧ q) ∨ (p ∧ r)-এর একটি ছদ্মবেশ: p = “x ∈ A”, q = “x ∈ B”, r = “x ∈ C”. §৬-এ এই সংযোগকে সরাসরি প্রমাণের পদ্ধতি বানাব। তার আগে একটি দ্বিতীয় উদাহরণ, যেখানে case লাগে না।

উপপাদ্য ৪.২ (absorption)

যেকোনো সেট A, B-এর জন্য A ∪ (A ∩ B) = A.

প্রমাণ:

  1. (⊇) A ⊆ A ∪ (A ∩ B), কারণ যেকোনো সেট X-এর জন্য A ⊆ A ∪ X. — উপপাদ্য ১.২
  2. (⊆) ধরি x ∈ A ∪ (A ∩ B). তাহলে x ∈ A, অথবা x ∈ A ∩ B. প্রথম ক্ষেত্রে সরাসরি x ∈ A; দ্বিতীয় ক্ষেত্রে A ∩ B ⊆ A, তাই আবারও x ∈ A. — proof by cases, উপপাদ্য ১.২
  3. দুই দিকের ⊆ থেকে সমতা। ∎

Absorption-এর একটি দৈনন্দিন অর্থ আছে: “যাঁরা চাল কিনেছেন, অথবা যাঁরা চাল আর তেল দুটোই কিনেছেন” আসলে শুধু “যাঁরা চাল কিনেছেন”। দ্বিতীয় দলটি প্রথম দলের ভেতরেই। কোডের if-এ এমন বাড়তি শর্ত absorption দিয়ে নিরাপদে মোছা যায়।

ইতিহাস সংক্ষেপে, যতটা নিশ্চিতভাবে বলা যায়: Augustus De Morgan ১৮৪৭ সালের বই “Formal Logic”-এ তাঁর নামের সূত্রগুলো যুক্তির ভাষায় লেখেন, যদিও এর রূপ মধ্যযুগের কিছু যুক্তিবিদের লেখাতেও পাওয়া যায় বলে ইতিহাসবিদরা উল্লেখ করেন। একই বছরে George Boole-এর “The Mathematical Analysis of Logic” আর ১৮৫৪ সালে “The Laws of Thought” প্রকাশিত হয়, যেখানে “class” (আজকের ভাষায় সেট)-এর ওপর গুণ আর যোগের মতো অপারেশন দিয়ে যুক্তিকে বীজগণিত বানানো হয়। John Venn ১৮৮০ সালে Philosophical Magazine-এ একটি প্রবন্ধে তাঁর diagram প্রস্তাব করেন; বৃত্ত দিয়ে যুক্তি দেখানো তার আগেও ছিল, যেমন Leonhard Euler-এর ১৭৬০-এর দশকে লেখা “একজন জার্মান রাজকুমারীকে চিঠি”-তে। আর Georg Cantor ১৮৭০-এর দশক থেকে সেটকে নিজেই গণিতের বস্তু হিসেবে গড়ে তোলেন।

৫ · Membership table — 2nটি অঞ্চলে যান্ত্রিক যাচাই

Element chasing-এ প্রতিটি identity-র জন্য নতুন যুক্তি সাজাতে হয়। একটি যান্ত্রিক বিকল্প আছে, ঠিক পর্ব ০২-এর truth table-এর মতো। মূল ভাবনা: একটি উপাদান x-এর জন্য শুধু তিনটি প্রশ্ন জরুরি, x ∈ A? x ∈ B? x ∈ C? এর উত্তর ১ (আছে) বা ০ (নেই), তাই তিনটি সেটে মোট 23 = 8 ধরনের উপাদান হতে পারে। Venn diagram-এর আটটি অঞ্চল ঠিক এই আট ধরন।

তিন সেটের আটটি অঞ্চল

প্রতিটি অঞ্চলের নাম তিনটি অঙ্ক: A-তে আছে কি না, B-তে, C-তে

Eight regions of a three-set Venn diagram ABCU 111 110 101 011 100 010 001 000
ছবি ৫.১ — যেকোনো সেট-রাশি (যেমন A ∩ (B ∪ C)) কয়েকটি অঞ্চলের মিলন: এখানে 111, 110 আর 101. দুটি রাশি সমান হয় ঠিক তখন, যখন তারা একই অঞ্চলগুলো নেয়।

একটি membership table এই আট অঞ্চলকে সারি বানায়: প্রতিটি মূল সেটের একটি কলাম (১ বা ০), তারপর প্রতিটি উপ-রাশির একটি কলাম, যা সংজ্ঞা থেকে পূরণ হয়: ∪-এর কলামে ১ যদি অন্তত একটি ১ থাকে, ∩-এ ১ যদি দুটোই ১, ′-এ উল্টো, − মানে প্রথমটি ১ আর দ্বিতীয়টি ০. দুটি রাশির শেষ কলাম প্রতিটি সারিতে মিললে identity প্রমাণিত। কিন্তু কেন? এটি শুধু একটি সুবিধাজনক কৌশল, নাকি পূর্ণ প্রমাণ? উত্তর হলো পূর্ণ প্রমাণ, আর তার কারণটি পর্ব ১২-এর structural induction.

উপপাদ্য ৫.১ (membership table পদ্ধতি সঠিক)

A1, …, An থেকে ∪, ∩, ′ আর − দিয়ে গড়া দুটি রাশি E আর F. তাহলে প্রতিটি U আর প্রতিটি A1, …, An ⊆ U-এর জন্য E = F, যদি আর কেবল যদি E আর F-এর membership table-এর শেষ কলাম 2nটি সারির প্রতিটিতে সমান।

প্রমাণ: x ∈ U-এর “ধরন” বলি n-অঙ্কের bit string b(x), যার i-তম অঙ্ক ১ যদি x ∈ Ai.

  1. লেমা: প্রতিটি রাশি E-এর জন্য একটি নির্দিষ্ট ফাংশন fE আছে (membership table-এর কলাম), যাতে x ∈ E ⇔ fE(b(x)) = 1. প্রমাণ রাশির গঠনের ওপর structural induction: E = Ai হলে fE হলো i-তম অঙ্ক। E = G ∪ H হলে x ∈ E ⇔ x ∈ G ∨ x ∈ H ⇔ fG(b(x)) = 1 ∨ fH(b(x)) = 1, তাই fE = fG OR fH; ∩, ′, − একইভাবে। — structural induction (পর্ব ১২)
  2. (⇐) সব সারিতে fE = fF হলে প্রতিটি x-এর জন্য x ∈ E ⇔ fE(b(x)) = 1 ⇔ fF(b(x)) = 1 ⇔ x ∈ F. তাই E = F. — লেমা
  3. (⇒) কন্ট্রাপজিটিভ (পর্ব ০৮): ধরি কোনো সারি r-এ fE(r) ≠ fF(r). একটি উপাদানের U = {x} নিই, আর Ai = {x} যদি r-এর i-তম অঙ্ক ১, নাহলে ∅. তাহলে b(x) = r, তাই x ঠিক একটি রাশিতে আছে, আর E ≠ F. — contrapositive, নির্মাণ
  4. দুই দিক মিলে উপপাদ্য। ∎

ধাপ ৩ একটি সূক্ষ্ম কথা বলে: একটি “ভাঙা সারি” মানেই একটি counterexample, আর সেটি বানাতে একটিমাত্র উপাদান যথেষ্ট। উল্টো দিকে সাবধান: কিছু অঞ্চল ফাঁকা এমন নির্দিষ্ট সেটে একটি মিথ্যা identity-ও সত্য দেখাতে পারে; যেমন A ⊆ B হলে A ∪ B = B সত্য, কিন্তু তা identity নয়।

চারটি সারি = চারটি অঞ্চল: (A, B) = 11, 10, 01, 00
A
B
A ∪ B
(A ∪ B)′
A′
B′
A′ ∩ B′
  1. সারি সাজানো। দুটি সেট, তাই 22 = 4টি সারি: 11 (দুটোতেই), 10 (শুধু A), 01 (শুধু B), 00 (কোনোটিতে নয়)। প্রতিটি সারি Venn diagram-এর একটি অঞ্চল। জায়গা বাঁচাতে টেবিলটি এখানে আড়াআড়ি: প্রতিটি রাশির পাশে এই চার অঞ্চলের মান, একই ক্রমে। বাকি রাশির মান এখনো ফাঁকা।
  2. A ∪ B. ∪-এর সংজ্ঞা: অন্তত একটি ১ থাকলে ১. তাই প্রথম তিন অঞ্চলে ১, শেষটিতে ০. এটি পর্ব ০২-এর ∨-এর truth table, T-এর জায়গায় ১.
  3. (A ∪ B)′. Complement মানে প্রতিটি অঙ্ক উল্টানো: ০, ০, ০, ১. অর্থাৎ বাঁ দিকের রাশিতে শুধু 00 অঞ্চলের উপাদান, যারা কোনো সেটেই নেই।
  4. A′ আর B′. এবার ডান দিকের জন্য দুটি সহায়ক কলাম: A-এর মান উল্টে ০, ০, ১, ১; B-এর মান উল্টে ০, ১, ০, ১.
  5. A′ ∩ B′. ∩-এর সংজ্ঞা: দুটোই ১ হলে ১. শুধু শেষ অঞ্চলে (00) A′ = 1 আর B′ = 1, তাই মান ০, ০, ০, ১.
  6. তুলনা। (A ∪ B)′ আর A′ ∩ B′-এর মান চারটি অঞ্চলেই সমান: ০, ০, ০, ১. উপপাদ্য ৫.১ অনুযায়ী এটি প্রতিটি U, A, B-এর জন্য De Morgan-এর পূর্ণ প্রমাণ। ∎

হাতে চার সারি সহজ; তিন সেটে আট সারি আর অনেক কলাম হলে ভুলের সম্ভাবনা বাড়ে। নিচের ব্লকটি membership table যান্ত্রিকভাবে পূরণ করে: প্রতিটি রাশিকে তিনটি bit (a, b, c)-এর একটি ফাংশন হিসেবে লেখা হয়েছে (উপপাদ্য ৫.১-এর fE), আর প্রোগ্রাম আটটি সারির প্রতিটিতে দুই দিক মেলায়। চারটি সত্যিকারের identity আর দুটি মিথ্যা দাবি আছে; প্রথমবার চালালে ব্রাউজারে Python (Pyodide) নামতে কয়েক সেকেন্ড লাগে।

from itertools import product

NOT = lambda x: 1 - x                  # membership bit: 1 = in, 0 = not in
MINUS = lambda x, y: x & (1 - y)       # x − y

print("A B | A∪B (A∪B)' | A' B' A'∩B'")
for a, b in product([1, 0], repeat=2):
    u = a | b
    print(f"{a} {b} |  {u}     {NOT(u)}    |  {NOT(a)}  {NOT(b)}    {NOT(a) & NOT(b)}")

identities = [
    ("A∩(B∪C) = (A∩B)∪(A∩C)", lambda a, b, c: a & (b | c),
                               lambda a, b, c: (a & b) | (a & c)),
    ("A∪(B∩C) = (A∪B)∩(A∪C)", lambda a, b, c: a | (b & c),
                               lambda a, b, c: (a | b) & (a | c)),
    ("A−(B∪C) = (A−B)∩(A−C)", lambda a, b, c: MINUS(a, b | c),
                               lambda a, b, c: MINUS(a, b) & MINUS(a, c)),
    ("(A⊕B)⊕C = A⊕(B⊕C)",     lambda a, b, c: (a ^ b) ^ c,
                               lambda a, b, c: a ^ (b ^ c)),
    ("A∪(B∩C) = (A∪B)∩C",     lambda a, b, c: a | (b & c),
                               lambda a, b, c: (a | b) & c),
    ("(A−B)−C = A−(B−C)",     lambda a, b, c: MINUS(MINUS(a, b), c),
                               lambda a, b, c: MINUS(a, MINUS(b, c))),
]

print()
for name, left, right in identities:
    bad = [abc for abc in product([1, 0], repeat=3)
           if left(*abc) != right(*abc)]
    verdict = "all 8 regions agree" if not bad else f"fails in regions {bad}"
    print(f"{name:24} {verdict}")

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

A B | A∪B (A∪B)' | A' B' A'∩B'
1 1 |  1     0    |  0  0    0
1 0 |  1     0    |  0  1    0
0 1 |  1     0    |  1  0    0
0 0 |  0     1    |  1  1    1

A∩(B∪C) = (A∩B)∪(A∩C)    all 8 regions agree
A∪(B∩C) = (A∪B)∩(A∪C)    all 8 regions agree
A−(B∪C) = (A−B)∩(A−C)    all 8 regions agree
(A⊕B)⊕C = A⊕(B⊕C)        all 8 regions agree
A∪(B∩C) = (A∪B)∩C        fails in regions [(1, 1, 0), (1, 0, 0)]
(A−B)−C = A−(B−C)        fails in regions [(1, 1, 1), (1, 0, 1)]

প্রথম চার লাইন stepper-এর টেবিলটিই। তারপর চারটি সত্যিকারের identity আটটি অঞ্চলেই মিলেছে; উপপাদ্য ৫.১ অনুযায়ী এটি তাদের পূর্ণ প্রমাণ, শুধু “অনেক উদাহরণে দেখা” নয়। তৃতীয়টি De Morgan-এর একটি আত্মীয়: “B বা C কোনোটিতে নেই এমন A-র উপাদান” মানে “B-তে নেই এবং C-তে নেই”। চতুর্থটি বলে ⊕ associative, তাই A ⊕ B ⊕ C বন্ধনী ছাড়া লেখা যায়: এটি সেই উপাদানগুলো, যারা বিজোড় সংখ্যক সেটে আছে। শেষ দুটি দাবি মিথ্যা, আর প্রোগ্রাম অঞ্চলের নামও দিয়েছে। A ∪ (B ∩ C) = (A ∪ B) ∩ C ভাঙে (1, 1, 0) আর (1, 0, 0)-এ, অর্থাৎ A-তে আছে কিন্তু C-তে নেই এমন উপাদানে: বাঁ দিক তাকে রাখে, ডান দিক ফেলে দেয়। উপপাদ্য ৫.১-এর ধাপ ৩ অনুযায়ী counterexample সঙ্গে সঙ্গে পাওয়া যায়: A = {1}, B = C = ∅. তেমনি difference associative নয়; পার্থক্য A আর C দুটোতে থাকা উপাদানে।

৬ · Logic আর বীজগণিত দিয়ে প্রমাণ — আর একটি ভুল দাবি ধরা

তৃতীয় পথটি সবচেয়ে সংক্ষিপ্ত। Set-builder সংকেতে সেটটিকে একটি বাক্য হিসেবে লিখুন, তারপর পর্ব ০৩-এর logical equivalence দিয়ে বাক্যটি বদলান। প্রতিটি ধাপে বাক্য বদলায়, কিন্তু কোন x সেটে আছে তা বদলায় না, তাই সেটও বদলায় না।

উপপাদ্য ৬.১ (De Morgan, দ্বিতীয় রূপ)

U-এর যেকোনো subset A, B-এর জন্য (A ∩ B)′ = A′ ∪ B′.

প্রমাণ:

  1. (A ∩ B)′ = {x ∈ U : ¬(x ∈ A ∩ B)} — complement-এর সংজ্ঞা
  2. = {x ∈ U : ¬(x ∈ A ∧ x ∈ B)} — ∩-এর সংজ্ঞা
  3. = {x ∈ U : ¬(x ∈ A) ∨ ¬(x ∈ B)} — logic-এর De Morgan, ¬(p ∧ q) ≡ ¬p ∨ ¬q (পর্ব ০৩)
  4. = {x ∈ U : x ∈ A′ ∨ x ∈ B′} — complement-এর সংজ্ঞা
  5. = A′ ∪ B′ ∎ — ∪-এর সংজ্ঞা

একবার তালিকার identity-গুলো প্রমাণিত হলে চতুর্থ একটি পথ খোলে: শুধু identity দিয়ে শিকল, পর্ব ০৩-এর “সূত্রের শিকল”-এর মতো। এখানে আর উপাদানের কথাই আসে না; সেটগুলো বীজগণিতের চলকের মতো আচরণ করে।

উপপাদ্য ৬.২

(A ∪ (B ∩ C))′ = (C′ ∪ B′) ∩ A′.

প্রমাণ (identity-র শিকল):

  1. (A ∪ (B ∩ C))′ = A′ ∩ (B ∩ C)′ — De Morgan, প্রথম রূপ (X = A, Y = B ∩ C)
  2. = A′ ∩ (B′ ∪ C′) — De Morgan, দ্বিতীয় রূপ
  3. = (B′ ∪ C′) ∩ A′ — ∩-এর commutative
  4. = (C′ ∪ B′) ∩ A′ ∎ — ∪-এর commutative

বাজারঘরের ভাষায়: “চাল কেনেননি, এবং তেল আর ডাল দুটো একসঙ্গে কেনেননি” এমন ক্রেতাদের তালিকা।

পদ্ধতিশক্তিদুর্বলতা
Element chasingঅসীম পরিবার, subset-এর দাবি (⊆), যেকোনো সংজ্ঞায় চলেপ্রতিবার নতুন যুক্তি; case বাদ পড়ার ঝুঁকি
Membership tableসম্পূর্ণ যান্ত্রিক; ভুল দাবিতে সরাসরি counterexamplen সেটে 2n সারি; শুধু ∪ ∩ ′ − দিয়ে গড়া সমতায়
Logic বা identity-র শিকলছোট আর পরিষ্কার; logic-এর সঙ্গে সংযোগ দেখায়প্রতিটি ধাপের নিয়মের নাম লাগে; ধাপ লাফালে ভুল লুকায়

প্রমাণের ভুল ধরুন: “(A ∪ B) − B = A”

একজন শিক্ষার্থী নিচের “প্রমাণ” লিখলেন। পড়ে নিজে ভুলটি খুঁজুন, তারপর নিচের ব্যাখ্যা দেখুন।

  1. ধরি x ∈ (A ∪ B) − B. তাহলে x ∈ A ∪ B আর x ∉ B. x ∈ A অথবা x ∈ B, কিন্তু x ∉ B, তাই x ∈ A. অতএব (A ∪ B) − B ⊆ A.
  2. উল্টো দিক: ধরি x ∈ A. তাহলে x ∈ A ∪ B, আর B-কে বিয়োগ করলে x বাদ যায় না, কারণ x তো A থেকে এসেছে। অতএব x ∈ (A ∪ B) − B. ∎

ভুল কোথায়: ধাপ ১ সঠিক (এটি disjunctive syllogism, পর্ব ০৬)। ধাপ ২-এ “x তো A থেকে এসেছে” কোনো যুক্তি নয়: x ∈ (A ∪ B) − B দেখাতে x ∉ B লাগবে, আর x ∈ A থেকে সেটি আসে না। A = B = {1} নিলে (A ∪ B) − B = ∅ ≠ A. সঠিক identity হলো (A ∪ B) − B = A − B, আর মূল দাবিটি সত্য ঠিক তখন, যখন A ∩ B = ∅. শিক্ষা: element chasing-এর প্রতিটি “তাই” একটি সংজ্ঞা বা নিয়মের নাম চায়; যেখানে নাম দেওয়া যায় না, সেখানেই ভুল লুকিয়ে থাকে।

প্রমাণ লেখার আগেই এমন ভুল ধরার একটি সস্তা উপায় আছে: এলোমেলো সেটে দাবিটি পরীক্ষা করা। নিচের ব্লক U = {0, …, 9}-এর এলোমেলো subset নিয়ে তিনটি দাবি পরীক্ষা করে, তারপর {1, 2}-এর সব subset দিয়ে (43 = 64টি ত্রয়ী) সবচেয়ে ছোট counterexample খোঁজে।

import random
from itertools import product
random.seed(15)

def rand_set():                        # random subset of U = {0, 1, ..., 9}
    return {x for x in range(10) if random.random() < 0.5}

claims = {
    "(A∪B)−B = A":           lambda A, B, C: (A | B) - B == A,
    "A−(B∩C) = (A−B)∩(A−C)": lambda A, B, C: A - (B & C) == (A - B) & (A - C),
    "A−(B∩C) = (A−B)∪(A−C)": lambda A, B, C: A - (B & C) == (A - B) | (A - C),
}

for name, holds in claims.items():
    for t in range(1, 1001):
        A, B, C = rand_set(), rand_set(), rand_set()
        if not holds(A, B, C):
            print(f"{name}: fails at test {t}")
            print(f"   A={sorted(A)} B={sorted(B)} C={sorted(C)}")
            break
    else:
        print(f"{name}: passed 1000 random tests (not a proof)")

small = [set(), {1}, {2}, {1, 2}]      # every subset of {1, 2}
print("smallest counterexamples (fewest elements in total):")
for name, holds in claims.items():
    bad = [(len(A) + len(B) + len(C), A, B, C)
           for A, B, C in product(small, repeat=3) if not holds(A, B, C)]
    if bad:
        size, A, B, C = min(bad, key=lambda t: t[0])
        print(f"   {name}: A={A or '∅'} B={B or '∅'} C={C or '∅'}")
    else:
        print(f"   {name}: none among all {len(small) ** 3} triples")

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

(A∪B)−B = A: fails at test 1
   A=[1, 3, 5] B=[0, 1, 3, 4, 5, 9] C=[2, 3, 4, 5, 7]
A−(B∩C) = (A−B)∩(A−C): fails at test 1
   A=[1, 4, 6, 7, 8] B=[2, 3, 5, 6, 7, 8] C=[1, 3, 5, 6, 7, 9]
A−(B∩C) = (A−B)∪(A−C): passed 1000 random tests (not a proof)
smallest counterexamples (fewest elements in total):
   (A∪B)−B = A: A={1} B={1} C=∅
   A−(B∩C) = (A−B)∩(A−C): A={1} B=∅ C={1}
   A−(B∩C) = (A−B)∪(A−C): none among all 64 triples

দুটি মিথ্যা দাবি প্রথম পরীক্ষাতেই ভাঙল। প্রথমটিতে A = {1, 3, 5}-এর সবগুলো B-তেও আছে, তাই (A ∪ B) − B ফাঁকা, অথচ A নয়। দ্বিতীয় দাবিটি De Morgan-এর একটি সাধারণ ভুল রূপ (∪-এর জায়গায় ∩): ছোটতম counterexample A = C = {1}, B = ∅-এ বাঁ দিক A − ∅ = {1}, কিন্তু ডান দিক A ∩ ∅ = ∅. তৃতীয়, সঠিক রূপটি হাজার পরীক্ষায় পাস করল, আর ৬৪টি ছোট ত্রয়ীর কোনোটিতে ভাঙেনি। সাবধান: এই দুটির কোনোটিই প্রমাণ নয়; প্রমাণ হলো লেমা ২.২ আর De Morgan দিয়ে A − (B ∩ C) = A ∩ (B ∩ C)′ = A ∩ (B′ ∪ C′) = (A ∩ B′) ∪ (A ∩ C′) = (A − B) ∪ (A − C), অথবা আটটি অঞ্চলের membership table. এলোমেলো পরীক্ষার কাজ সন্দেহ জাগানো আর counterexample খোঁজা; সত্য প্রমাণের দায় আলাদা।

৭ · অনেক সেটের union আর intersection — indexed family

বাজারঘরে সপ্তাহের সাত দিনের জন্য সাতটি সেট: D1 = শনিবার যাঁরা অর্ডার করেছেন, D2 = রবিবার, …, D7 = শুক্রবার। “সপ্তাহে অন্তত একবার অর্ডার করেছেন” হলো D1 ∪ D2 ∪ ⋯ ∪ D7, আর “প্রতিদিন অর্ডার করেছেন” হলো D1 ∩ ⋯ ∩ D7. Associative নিয়মের কারণে বন্ধনী লাগে না। সংক্ষেপে লেখা হয় ⋃i=17 Di আর ⋂i=17 Di, ঠিক ∑ দিয়ে যোগফল লেখার মতো (পর্ব ১৭)।

সংজ্ঞা ৭.১ (indexed family)

I একটি সেট (index set), আর প্রতিটি i ∈ I-এর জন্য একটি সেট Ai; এদের একসঙ্গে বলে indexed family {Ai : i ∈ I}. তাহলে

⋃i∈I Ai = {x : ∃i ∈ I, x ∈ Ai},   ⋂i∈I Ai = {x : ∀i ∈ I, x ∈ Ai}.

প্রথমটি generalized union, দ্বিতীয়টি generalized intersection. I = ℤ+ হলে লেখা হয় ⋃i=1∞ Ai. (I ফাঁকা হলে ⋂-এর জন্য একটি universal set লাগে; এই পর্বে I কখনো ফাঁকা নয়।)

দেখুন, দুই সেটের ∨ আর ∧ এখানে পর্ব ০৪-এর ∃ আর ∀ হয়ে গেল। এটিই স্বাভাবিক: ∃ হলো “অনেকগুলোর মধ্যে অন্তত একটি”, অর্থাৎ বড় একটি ∨, আর ∀ হলো বড় একটি ∧. দুটি উদাহরণ নিই, যেখানে I = ℤ+:

  • Ai = {1, 2, …, i}. এরা ক্রমশ বড় হয়: A1 ⊆ A2 ⊆ ⋯. তাই ⋃i=1n Ai = An আর ⋂i=1n Ai = A1 = {1}. অসীম পরিবারে ⋃i=1∞ Ai = ℤ+ (প্রতিটি ধনাত্মক পূর্ণসংখ্যা m আছে Am-এ), আর ⋂ = {1}.
  • Bi = {i, i + 1, i + 2, …}. এরা ক্রমশ ছোট হয়: B1 ⊇ B2 ⊇ ⋯, আর প্রত্যেকটি অসীম। সসীম পরিবারে ⋂i=1n Bi = Bn, যা ফাঁকা নয়। কিন্তু অসীম পরিবারে?
উপপাদ্য ৭.২

Bi = {i, i + 1, i + 2, …} (i ∈ ℤ+) হলে ⋂i=1∞ Bi = ∅, যদিও প্রতিটি সসীম ছেদ B1 ∩ ⋯ ∩ Bn = Bn অসীম সেট।

প্রমাণ (contradiction):

  1. ধরি ছেদে একটি উপাদান m আছে। সব Bi ⊆ ℤ+, তাই m একটি ধনাত্মক পূর্ণসংখ্যা। — অনুমান
  2. ⋂-এর সংজ্ঞায় প্রতিটি i-এর জন্য m ∈ Bi; বিশেষভাবে i = m + 1 নিলে m ∈ Bm+1, অর্থাৎ m ≥ m + 1. — universal instantiation (পর্ব ০৬)
  3. এটি অসম্ভব, বিরোধ। তাই ছেদ ফাঁকা। আর সসীম অংশ: Bn ⊆ Bi যখন i ≤ n, তাই প্রথম n-টির ছেদ Bn. ∎ — proof by contradiction (পর্ব ০৮)

এই উদাহরণ একটি গুরুত্বপূর্ণ সতর্কবার্তা: সসীম সংখ্যক ধাপে যা সত্য, “অসীম পর্যন্ত” তা আপনা-আপনি সত্য নয়। প্রতিটি n-এ ছেদ অসীম, অথচ সবগুলোর ছেদ ফাঁকা। Induction দিয়ে প্রতিটি n-এর জন্য একটি দাবি প্রমাণ করলে সেটি “প্রতিটি সসীম n”-এর দাবি, অসীম পরিবারের নয় (ভাবনার প্রশ্ন ৪)।

উপপাদ্য ৭.৩ (সাধারণ De Morgan)

U-এর subset-এর যেকোনো indexed family {Ai : i ∈ I}-এর জন্য (⋃i∈I Ai)′ = ⋂i∈I Ai′ আর (⋂i∈I Ai)′ = ⋃i∈I Ai′.

প্রমাণ (প্রথমটি): x ∈ U যেকোনো। x ∈ (⋃ Ai)′ ⇔ ¬(∃i ∈ I, x ∈ Ai) (সংজ্ঞা) ⇔ ∀i ∈ I, ¬(x ∈ Ai) (quantifier-এর অস্বীকার, পর্ব ০৪) ⇔ ∀i ∈ I, x ∈ Ai′ ⇔ x ∈ ⋂ Ai′. দ্বিতীয়টি dual, একইভাবে ¬∀ ≡ ∃¬ দিয়ে। ∎

লক্ষ করুন, এই প্রমাণে induction লাগেনি, আর I অসীম, এমনকি অগণনীয় (পর্ব ১৮) হলেও এটি খাটে। দুই সেটের De Morgan থেকে n সেটের রূপ পর্ব ১০-এর induction দিয়েও প্রমাণ করা যায় (অনুশীলনের মতো করে চেষ্টা করুন), কিন্তু সেই প্রমাণ শুধু সসীম n দেয়; quantifier-এর পথ সরাসরি সব ক্ষেত্র দেয়। বাজারঘরের ভাষায়: “সপ্তাহে একবারও অর্ডার করেননি” = “প্রতিদিন অর্ডার করেননি”, অর্থাৎ (⋃ Di)′ = ⋂ Di′.

৮ · কম্পিউটারে সেট — bit string আর bitwise অপারেশন

সেট কম্পিউটারে রাখার অনেক উপায় আছে: উপাদানের তালিকা, সাজানো তালিকা, hash table (Python-এর set এভাবেই কাজ করে; DSA কোর্সের পর্ব ৩২)। কিন্তু universal set যদি ছোট আর স্থির হয়, সবচেয়ে দ্রুত আর সাশ্রয়ী উপায় হলো bit string. বাজারঘরের দশটি পণ্যকে একটি নির্দিষ্ট ক্রমে সাজাই: U = (চাল, ডাল, তেল, চিনি, লবণ, আটা, ডিম, দুধ, চা, সাবান). তাহলে যেকোনো পণ্যের সেট A একটি ১০-অঙ্কের bit string: i-তম অঙ্ক ১ যদি i-তম পণ্য A-তে আছে, নাহলে ০.

উপপাদ্য ৮.১ (bit string-এ অপারেশন)

U = {u1, …, un} একটি নির্দিষ্ট ক্রমে, আর A, B ⊆ U-এর bit string a, b. তাহলে A ∪ B-এর bit string a OR b, A ∩ B-এর a AND b, A′-এর NOT a, A − B-এর a AND (NOT b), A ⊕ B-এর a XOR b; প্রতিটি অপারেশন bitwise, অর্থাৎ অবস্থান ধরে ধরে। আর |A| = a-তে ১-এর সংখ্যা।

প্রমাণ: i-তম অবস্থানে ai = 1 ⇔ ui ∈ A. তাই ui ∈ A ∪ B ⇔ ai = 1 ∨ bi = 1 ⇔ (a OR b)i = 1; বাকিগুলো একইভাবে সংজ্ঞা থেকে। এটি আসলে উপপাদ্য ৫.১-এর লেমা, শুধু এক উপাদানের জন্য নয়, n-টি উপাদানের জন্য পাশাপাশি। ∎

এখানে পর্ব ০২-এর §৬ পুরোপুরি ফিরে এসেছে: bitwise operation মানে একসঙ্গে অনেকগুলো truth table-এর সারি, আর এখানে প্রতিটি সারি একটি পণ্য। Binary সংখ্যা আর bit-এর মৌলিক কথা কম্পিউটার ফান্ডামেন্টালস কোর্সের পর্ব ১৬-এ।

ক্রম: চাল ডাল তেল চিনি লবণ আটা ডিম দুধ চা সাবান
A (ঢাকা)
B (চট্টগ্রাম)
অপারেশন
ফল
সেটের ভাষায়
  1. সেট থেকে bit string. ঢাকার ক্রেতারা কিনেছেন চাল, ডাল, তেল, ডিম, চা: প্রথম, দ্বিতীয়, তৃতীয়, সপ্তম আর নবম অবস্থানে ১, তাই A = 1110001010. চট্টগ্রামের B = {তেল, চিনি, ডিম, দুধ, চা, সাবান} = 0011001111. ১-এর সংখ্যা ৫ আর ৬, অর্থাৎ |A| = 5, |B| = 6.
  2. Union = OR. প্রতিটি অবস্থানে অন্তত একটি ১ থাকলে ১: 1111001111. শুধু পঞ্চম (লবণ) আর ষষ্ঠ (আটা) অবস্থানে দুটোই ০. মোট ৮টি ১, অর্থাৎ দুই শহর মিলে ৮টি আলাদা পণ্য।
  3. Intersection = AND. দুটোই ১ হলে ১: 0010001010, অর্থাৎ তৃতীয় (তেল), সপ্তম (ডিম) আর নবম (চা)। তিনটি ১, তাই |A ∩ B| = 3, আর উপপাদ্য ৩.১ মিলছে: 5 + 6 − 3 = 8.
  4. Complement = NOT. B-এর প্রতিটি অঙ্ক উল্টে 1100110000: চাল, ডাল, লবণ, আটা, যেগুলো চট্টগ্রামে কেউ কেনেননি। ১০টির মধ্যে ৪টি, অর্থাৎ |B′| = 10 − 6.
  5. Difference = AND NOT. লেমা ২.২-এর A − B = A ∩ B′: 1110001010 AND 1100110000 = 1100000000. শুধু চাল আর ডাল ঢাকায় বিক্রি হয়েছে, চট্টগ্রামে নয়।
  6. Symmetric difference = XOR. অঙ্ক দুটি আলাদা হলে ১: 1101000101, অর্থাৎ চাল, ডাল, চিনি, দুধ, সাবান. পাঁচটি ১, আর §৩-এর সূত্র মিলছে: |A ⊕ B| = 5 + 6 − 2 · 3 = 5.

বাস্তব কোডে bit string রাখা হয় একটি পূর্ণসংখ্যার bit হিসেবে: ১০টি পণ্যের পুরো সেট একটি সংখ্যা, আর ∪, ∩ একটিমাত্র CPU নির্দেশ। নিচের ব্লক stepper-এর প্রতিটি ফল Python-এর পূর্ণসংখ্যা দিয়ে হিসাব করে, তারপর Python-এর set অপারেটরের সঙ্গে মিলিয়ে দেখে। Python-এ ~B একটি ঋণাত্মক সংখ্যা (সব bit উল্টানো, অসীম পর্যন্ত), তাই complement-এর জন্য FULL ^ A ব্যবহার করা হয়েছে; A & ~B অবশ্য নিরাপদ, কারণ A-এর বাইরের bit আগে থেকেই ০.

items = ["চাল", "ডাল", "তেল", "চিনি", "লবণ", "আটা", "ডিম", "দুধ", "চা", "সাবান"]
N = len(items)
FULL = (1 << N) - 1                    # 1111111111 = the universal set U

def to_bits(names):                    # item i -> bit N-1-i (read left to right)
    m = 0
    for x in names:
        m |= 1 << (N - 1 - items.index(x))
    return m

def to_set(m):
    return {items[i] for i in range(N) if (m >> (N - 1 - i)) & 1}

A = to_bits(["চাল", "ডাল", "তেল", "ডিম", "চা"])           # Dhaka orders
B = to_bits(["তেল", "চিনি", "ডিম", "দুধ", "চা", "সাবান"])  # Chattogram orders

results = {"A": A, "B": B, "A∪B": A | B, "A∩B": A & B,
           "A−B": A & ~B, "A'": FULL ^ A, "A⊕B": A ^ B}
for name, m in results.items():
    names = [x for x in items if x in to_set(m)]
    print(f"{name:4} {m:0{N}b}  |{bin(m).count('1')}|  {', '.join(names)}")

SA, SB = to_set(A), to_set(B)
same = (to_set(A | B) == SA | SB and to_set(A & B) == SA & SB
        and to_set(A & ~B) == SA - SB and to_set(A ^ B) == SA ^ SB)
print("same as Python set operators:", same)
print("|A|+|B|-|A∩B| =", len(SA) + len(SB) - len(SA & SB), "= |A∪B| =", len(SA | SB))

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

A    1110001010  |5|  চাল, ডাল, তেল, ডিম, চা
B    0011001111  |6|  তেল, চিনি, ডিম, দুধ, চা, সাবান
A∪B  1111001111  |8|  চাল, ডাল, তেল, চিনি, ডিম, দুধ, চা, সাবান
A∩B  0010001010  |3|  তেল, ডিম, চা
A−B  1100000000  |2|  চাল, ডাল
A'   0001110101  |5|  চিনি, লবণ, আটা, দুধ, সাবান
A⊕B  1101000101  |5|  চাল, ডাল, চিনি, দুধ, সাবান
same as Python set operators: True
|A|+|B|-|A∩B| = 8 = |A∪B| = 8

প্রতিটি লাইনে নাম, ১০-অঙ্কের bit string, ১-এর সংখ্যা (cardinality) আর পণ্যের নাম। bit string-গুলো stepper-এর সঙ্গে হুবহু মিলেছে, আর A′ = 0001110101: ঢাকায় যে পাঁচটি পণ্য কেউ কেনেননি। same as Python set operators: True লাইনটি বলে দুই পদ্ধতি (পূর্ণসংখ্যার bit আর hash-ভিত্তিক set) একই উত্তর দেয়। শেষ লাইনে উপপাদ্য ৩.১ আবার মিলল। একটি খুঁটিনাটি: এখানে প্রথম পণ্য সবচেয়ে বাঁয়ের bit, যাতে স্ট্রিং বাঁ থেকে ডানে পড়া যায়; অনেক কোডে উল্টো রীতি (প্রথম উপাদান = সবচেয়ে ডানের bit, অর্থাৎ 1 << i) চলে। কোন রীতি, সেটি সবসময় স্পষ্ট লিখে রাখুন।

Bit string-এ সেটের আকার সবসময় n bit, যত উপাদানই থাকুক; তাই U বড় আর সেট ছোট হলে hash set ভালো (ভাবনার প্রশ্ন ৩)। এই ধারণাই ডেটাবেসের bitmap index-এর ভিত্তি (ডেটাবেস কোর্সের পর্ব ৪০), আর competitive programming-এর bitmask DP-তে প্রতিটি subset একটি পূর্ণসংখ্যা (DSA কোর্সের পর্ব ৫৫)। আর পর্ব ১৪-এর power set-এর 2nটি subset ঠিক 0 থেকে 2n − 1 পর্যন্ত পূর্ণসংখ্যা।

৯ · সেটের বাইরে এক পা — multiset আর fuzzy set

সেটে একটি উপাদান হয় আছে, নয় নেই, আর থাকলে একবারই। দুটি জনপ্রিয় সম্প্রসারণ এই নিয়ম শিথিল করে; এখানে শুধু ধারণাটুকু।

Multiset: কয়বার আছে

একটি অর্ডারের ঝুড়িতে ৩ প্যাকেট চাল আর ১ বোতল তেল। সেট হিসেবে লিখলে {চাল, তেল}, সংখ্যার তথ্য হারায়। একটি multiset (বা bag) প্রতিটি উপাদানের সঙ্গে তার বহুলতা (multiplicity) রাখে: {চাল, চাল, চাল, তেল}. দুটি multiset-এর ওপর সাধারণ সংজ্ঞাগুলো এমন: union-এ প্রতিটি উপাদানের বহুলতা দুটির max, intersection-এ min, আর যোগফলে (sum) দুটির যোগ। সাধারণ সেট হলো বহুলতা ০ বা ১-এর multiset.

Python-এর collections.Counter ঠিক এই নিয়ম মানে: | দেয় max, & দেয় min, + দেয় যোগ। SQL-এর টেবিল আসলে multiset: UNION ডুপ্লিকেট সরায় (সেটের মতো), কিন্তু UNION ALL সব সারি রাখে (multiset-এর যোগের মতো)। পর্ব ৩৫ “পুনরাবৃত্তিসহ বাছাই”-এ multiset গোনার প্রশ্ন আসবে।

Fuzzy set: কতটা আছে

“দ্রুত ডেলিভারি পাওয়া অর্ডার”-এর সেট কোনটি? ২ ঘণ্টায় পৌঁছানো অর্ডার নিশ্চয় দ্রুত, ৩ দিনে পৌঁছানো নিশ্চয় নয়; ১০ ঘণ্টা? সীমা টানা কঠিন। ১৯৬৫ সালে Lotfi Zadeh “Fuzzy Sets” নামে একটি প্রবন্ধে প্রস্তাব করেন: প্রতিটি উপাদানের সদস্যতা ০ বা ১ না হয়ে [0, 1]-এর একটি সংখ্যা μA(x) হতে পারে। এমন সেটকে বলে fuzzy set. যেমন μ(২ ঘণ্টা) = 1, μ(১০ ঘণ্টা) = 0.6, μ(৩ দিন) = 0. Zadeh-এর প্রবন্ধে প্রস্তাবিত মান-অপারেশন: μA∪B = max(μA, μB), μA∩B = min(μA, μB), μA′ = 1 − μA; পরে আরও অনেক বিকল্প সংজ্ঞা এসেছে।

মজার ব্যাপার হলো কোন identity টেকে আর কোনটি টেকে না। De Morgan টেকে: 1 − max(a, b) = min(1 − a, 1 − b), যেকোনো a, b ∈ [0, 1]-এ। কিন্তু complement law ভাঙে: μ = 0.5 হলে A ∩ A′-এ সদস্যতা min(0.5, 0.5) = 0.5, শূন্য নয়। অর্থাৎ fuzzy জগতে “একটি জিনিস একই সঙ্গে আংশিক দ্রুত আর আংশিক ধীর” হতে পারে।

আরও গভীরে: U-এর সব subset-এর সেট P(U), সঙ্গে ∪, ∩, ′, ∅ আর U, একটি Boolean algebra; §৪-এর তালিকা আসলে সেই algebra-র axiom আর উপপাদ্য। উল্টো দিকটি আরও বিস্ময়কর: Marshall Stone ১৯৩০-এর দশকে প্রমাণ করেন (Stone-এর representation theorem), প্রতিটি Boolean algebra কোনো না কোনো সেট-পরিবারের ∪, ∩, ′-এর সঙ্গে isomorphic. অর্থাৎ Boolean algebra-র যেকোনো সত্য আসলে কোনো সেটের ছবিতে দেখা যায়। পর্ব ৬৯ “Boolean algebra-র গণিত”-এ এই কাঠামো আসবে, আর সার্কিটের দিকটি কম্পিউটার আর্কিটেকচার কোর্সের পর্ব ০৭-এ।

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

  • |A| = 40, |B| = 25, |A ∪ B| = 55 হলে |A ∩ B| কত? 40 + 25 − 55 = 10.
  • (A ∩ B)′ = A′ ∪ B′ membership table দিয়ে প্রমাণ করুন। চার সারি; দুই শেষ কলাম ০, ১, ১, ১-এ মেলে।
  • A − (B ∪ C) = (A − B) ∩ (A − C) element chasing দিয়ে প্রমাণ করুন। x ∈ A, x ∉ B, x ∉ C; দুই দিকের ⊆.
  • U = {1, …, 8}-এ A = 10110010, B = 01100011 হলে A ∩ B আর A ⊕ B? 00100010 আর 11010001.
  • (A ∪ B) − B = A কি সবসময় সত্য? না; A = B = {1}. সঠিক: (A ∪ B) − B = A − B.

১০ · AI-এর যুগে — সেটের হিসাবে AI সহকারী যাচাই

AI সহকারী set identity-র প্রমাণ, Venn diagram-এর ব্যাখ্যা আর inclusion–exclusion-এর হিসাব মুহূর্তে লিখে দেয়। লেখাগুলো আত্মবিশ্বাসী আর গোছানো, কিন্তু এই পর্বের ঠিক সেই ভুলগুলো নিয়মিত পাওয়া যায়:

AI-এর ভুলকীভাবে ধরবেন
|A ∪ B| = |A| + |B| লেখা, বা তিন সেটে শেষ পদ +|A ∩ B ∩ C| বাদ দেওয়া (দুবার গোনা)ছোট সেটে হাতে বা Python-এ গুনে মেলান; A = B = C = {1}-এর মতো চরম উদাহরণ নিন
De Morgan-এ ∪ আর ∩ অদলবদল না করা, যেমন A − (B ∩ C) = (A − B) ∩ (A − C)Membership table চালান; ভাঙা সারি থেকে counterexample বানান
A − B আর B − A গুলিয়ে ফেলা; difference-কে associative ধরাদুই দিক আলাদা করে ছোট সেটে হিসাব করুন
Element chasing-এ শুধু এক দিকের ⊆ দেখিয়ে সমতা দাবি করা, বা একটি case বাদদুই দিকের ⊆ আলাদা শিরোনামে চান; প্রতিটি “তাই”-এর নিয়ম জিজ্ঞেস করুন
Complement-এর U না বলা; অসীম সেটে |A| − |A ∩ B| লেখাU আর সসীমতার শর্ত স্পষ্ট লিখতে বলুন
Bit-এর ক্রম (বাঁয়ের bit প্রথম উপাদান, না শেষ) গুলিয়ে ভুল পণ্যের নামএকটি উপাদান দিয়ে রীতিটি পরীক্ষা করুন; Python set-এর সঙ্গে মেলান
কয়েকটি উদাহরণে মিলেছে বলে “প্রমাণিত” বলা; বানানো বই বা বছরের উল্লেখপ্রমাণ আর যাচাই আলাদা চান; ইতিহাস বিশ্বস্ত পাঠ্যবইয়ে মেলান

AI-কে set identity-র প্রমাণ বা হিসাব করতে দিলে এই কাঠামোয় প্রশ্ন করুন, যাতে উত্তর যাচাইযোগ্য হয়:

নিচের set identity-টি প্রমাণ করো, অথবা মিথ্যা হলে counterexample দাও: দাবি: [এখানে দাবি, যেমন A − (B ∩ C) = (A − B) ∪ (A − C)] ১. প্রথমে universal set U আর সেটগুলো সম্পর্কে কোন শর্ত ধরছ, লেখো। ২. Element chasing দিয়ে দুই দিকের ⊆ আলাদা আলাদা প্রমাণ করো; প্রতিটি ধাপের পাশে সংজ্ঞা বা নিয়মের নাম লেখো। ৩. একই দাবির membership table দাও (সব 2^n সারি)। ৪. দাবি মিথ্যা হলে যে সারিতে ভাঙে সেটি দেখাও, আর সেখান থেকে সবচেয়ে ছোট counterexample বানাও। ৫. যাচাইয়ের জন্য একটি ছোট Python কোড দাও, যা এলোমেলো সেটে দাবিটি পরীক্ষা করে। ৬. কোনো ধাপে নিশ্চিত না হলে তা স্পষ্ট বলো; উদাহরণে মিলেছে বলে প্রমাণিত বোলো না।

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

সবচেয়ে সস্তা প্রথম পরীক্ষা membership table: AI-এর দাবি সেখানে ভাঙলে আর কিছু পড়ার দরকার নেই; না ভাঙলে দাবিটি সত্য, তবু AI-এর লেখা প্রমাণের প্রতিটি ধাপ নিজে পড়ুন।

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

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

প্র ০১চারটি সেটের Venn diagram চারটি বৃত্ত দিয়ে আঁকা যায় না কেন? আর তাহলে n সেটের membership table-এর 2n সারি ছবিতে আসে কীভাবে?

একটি সত্যিকারের Venn diagram-এ n সেটের প্রতিটি সম্ভাব্য সমন্বয়ের জন্য ঠিক একটি অঞ্চল থাকতে হয়, অর্থাৎ মোট 2nটি অঞ্চল (বাইরের অঞ্চলসহ)। চার সেটে ১৬টি। এখন গুনে দেখা যাক n-টি বৃত্ত সমতলকে সর্বোচ্চ কয়টি অঞ্চলে ভাগ করতে পারে। দুটি বৃত্ত সর্বোচ্চ দুটি বিন্দুতে ছেদ করে। একটি নতুন বৃত্ত আগের k-টি বৃত্তকে সর্বোচ্চ 2k বিন্দুতে কাটে, আর সেই বিন্দুগুলো নতুন বৃত্তকে 2k-টি চাপে ভাগ করে; প্রতিটি চাপ একটি পুরোনো অঞ্চলকে দুই ভাগ করে, তাই অঞ্চল বাড়ে সর্বোচ্চ 2k. এক বৃত্তে ২টি অঞ্চল (ভেতর আর বাইরে) থেকে শুরু করে যোগ করলে n বৃত্তে সর্বোচ্চ n² − n + 2টি অঞ্চল। n = 3-এ এটি ৮ = 23, তাই তিন বৃত্তের Venn diagram সম্ভব। কিন্তু n = 4-এ মাত্র ১৪, যা ১৬-এর কম। অতএব চারটি বৃত্ত দিয়ে চার সেটের Venn diagram অসম্ভব; দুটি সমন্বয় ছবিতে আসবেই না।

এই হিসাব পর্ব ১০-এর induction দিয়ে পরিষ্কার লেখা যায়। আর এটি দেখায় কেন ছবির ওপর অন্ধ ভরসা বিপজ্জনক: কেউ চারটি বৃত্ত এঁকে “চার সেটের Venn diagram” বললে ছবিতে কিছু অঞ্চল অনুপস্থিত, আর সেই ছবি দিয়ে করা “প্রমাণ” সেই অঞ্চলের উপাদানের কথা ভুলে যাবে।

সমাধান হলো বৃত্তের বদলে অন্য আকৃতি। Venn নিজেই চার সেটের জন্য উপবৃত্ত (ellipse) দিয়ে diagram দিয়েছিলেন বলে উল্লেখ পাওয়া যায়, আর যেকোনো n-এর জন্য বিশেষ বক্ররেখা দিয়ে Venn diagram আঁকার পদ্ধতি পরে অনেকে দিয়েছেন (যেমন A. W. F. Edwards-এর নির্মাণ)। তবে n = 5 বা 6-এর পরে ছবিগুলো পড়ার অযোগ্য হয়ে যায়। তখন membership table, অথবা কম্পিউটারে bit string, একমাত্র ব্যবহারযোগ্য পথ: 2nটি সারি টেবিলে বা লুপে সহজেই আসে, ছবিতে আসে না।

মূল উপলব্ধি: Venn diagram তিন সেট পর্যন্ত চমৎকার চিন্তার সহায়ক, কিন্তু তার সীমা গাণিতিকভাবে প্রমাণিত। প্রমাণ আর বড় হিসাবের জন্য অঞ্চলগুলোকে 2nটি bit-সমন্বয় হিসেবে ভাবুন, ছবি হিসেবে নয়।

প্র ০২সেটের identity আর logic-এর equivalence প্রায় হুবহু এক। এটি কি কাকতালীয়, নাকি এর পেছনে কোনো গভীর কারণ আছে? এর ব্যবহারিক মূল্য কী?

কাকতালীয় নয়, আর এই মিলের ইতিহাসই আধুনিক কম্পিউটারের ইতিহাসের একটি অংশ। George Boole ১৮৫৪ সালের “The Laws of Thought”-এ যুক্তিকে বীজগণিত হিসেবে লেখেন, আর তাঁর মূল বস্তু ছিল “class”: একটি বৈশিষ্ট্য যাদের আছে তাদের দল, আজকের ভাষায় একটি সেট। দুই class-এর “গুণ” মানে দুটো বৈশিষ্ট্যই আছে এমনদের দল (∩), আর তাঁর সমীকরণ x(1 − x) = 0 বলে কোনো কিছু একই সঙ্গে একটি class-এ আছে আর নেই, এমন হয় না (A ∩ A′ = ∅)। অর্থাৎ Boole-এর কাছে সেট আর যুক্তি শুরু থেকেই একই বীজগণিত।

কারণটি §১-এ দেখেছেন: প্রতিটি সেট একটি predicate-এর truth set, আর সেটের অপারেশন predicate-এর connective. উপপাদ্য ৫.১ এটিকে নিখুঁত করে: n সেট থেকে গড়া যেকোনো রাশি একটি n-চলকের Boolean ফাংশন দিয়ে পুরোপুরি নির্ধারিত, আর দুটি রাশি সমান ঠিক তখন, যখন ফাংশন দুটি সমান, অর্থাৎ যখন সংশ্লিষ্ট logical formula দুটি equivalent. তাই logic-এর প্রতিটি equivalence ঠিক একটি set identity দেয়, আর উল্টোটাও। “আরও গভীরে” বক্সের Stone-এর উপপাদ্য বলে এটি কোনো বিশেষ উদাহরণ নয়: প্রতিটি Boolean algebra-ই আসলে কোনো সেট-পরিবার।

ব্যবহারিক মূল্য বিশাল। Claude Shannon ১৯৩৭ সালের দিকে তাঁর মাস্টার্স থিসিসে দেখান, relay-এর সার্কিট Boolean algebra মানে, আর তাই সার্কিট সরল করা মানে Boolean রাশি সরল করা। আজ query optimizer, সার্চ ইঞ্জিন বা compiler যখন AND/OR/NOT-এর শর্ত সরল করে, সবখানে একই কয়েকটি identity কাজ করে।

মূল উপলব্ধি: সেট, logic আর Boolean circuit একই বীজগণিতের তিন চেহারা। একটি জগতে শেখা identity অন্য দুটিতে বিনা খরচে পাওয়া যায়, আর সেই জন্যই membership table আর truth table আসলে একই টেবিল।

প্র ০৩বাজারঘরের কয়েক কোটি ক্রেতার মধ্যে “গত মাসে চাল আর তেল দুটোই কিনেছেন, কিন্তু চা কেনেননি” এমনদের দ্রুত বের করতে সেট কীভাবে রাখা উচিত: bit string, hash set, নাকি সাজানো তালিকা?

উত্তর নির্ভর করে তিনটি সংখ্যার ওপর: universal set-এর আকার N (সব ক্রেতা), প্রতিটি সেটের আকার k, আর কতবার এমন প্রশ্ন আসে। প্রশ্নটি নিজে এই পর্বের ভাষায় সরল: (চাল ∩ তেল) − চা, অর্থাৎ চাল AND তেল AND (NOT চা)।

Bit string (bitmap): প্রতিটি পণ্যের জন্য N bit, অর্থাৎ ক্রেতার ক্রমিক নম্বর ধরে একটি bit. N = ৫ কোটি হলে প্রতিটি bitmap প্রায় ৬ মেগাবাইট (৫ কোটি ÷ ৮ বাইট)। AND আর AND NOT শব্দ ধরে ধরে চলে: আধুনিক CPU এক নির্দেশে ৬৪ বা তার বেশি bit সামলায়, তাই পুরো হিসাব খুব দ্রুত, আর ফলের cardinality গোনার জন্য বেশিরভাগ CPU-তে popcount নির্দেশ আছে। দুর্বলতা: k ছোট হলে (যেমন একটি বিরল পণ্য মাত্র কয়েকশো জন কিনেছেন) bitmap-এর প্রায় সব bit ০, জায়গা নষ্ট। ডেটাবেসে এর উত্তর compressed bitmap, যা লম্বা ০-এর সারি সংক্ষেপে রাখে।

Hash set: জায়গা k-এর সমানুপাতিক, N-এর নয়। A ∩ B হিসাব করতে ছোট সেটটির প্রতিটি উপাদান বড়টিতে খোঁজা হয়, গড়ে প্রতিটি খোঁজ ধ্রুবক সময়ে (DSA কোর্সের পর্ব ৩২), তাই মোট সময় মোটামুটি ছোট সেটের আকার। ছোট, বিক্ষিপ্ত সেটে এটি সেরা। সাজানো তালিকা: দুটি সাজানো তালিকার ছেদ merge-এর মতো একবার পাশাপাশি হেঁটে বের হয়, সময় k1 + k2-এর সমানুপাতিক; সার্চ ইঞ্জিনের inverted index-এ তালিকার ছেদ এভাবেই হয়।

বড় সিস্টেম প্রায়ই মিশ্র পথ নেয়: ঘন সেটে bitmap, বিরল সেটে তালিকা। আর যেখানে সামান্য ভুল সহনীয়, সেখানে Bloom filter-এর মতো সম্ভাবনাভিত্তিক কাঠামো (Burton Bloom-এর ১৯৭০ সালের প্রস্তাব) খুব কম জায়গায় “সম্ভবত সেটে আছে / নিশ্চিতভাবে নেই” উত্তর দেয় (সিস্টেম ডিজাইন কোর্সের পর্ব ৪৫)।

মূল উপলব্ধি: গণিতে A ∩ B একটিই, কিন্তু কম্পিউটারে তার খরচ নির্ভর করে representation-এর ওপর। N, k আর প্রশ্নের ধরন দেখে bitmap, hash বা সাজানো তালিকা বাছুন; identity-গুলো সব representation-এ একই থাকে, তাই query আগে সরল করে নেওয়া সবসময় লাভজনক।

প্র ০৪Induction দিয়ে প্রমাণ করা যায় “প্রতিটি n-এর জন্য B1 ∩ ⋯ ∩ Bn ফাঁকা নয়”। তাহলে “সব Bi-এর ছেদ ফাঁকা নয়” কেন প্রমাণ হয় না? সসীম আর অসীমের এই ফাঁক কোথায় কোথায় দেখা যায়?

Induction যা প্রমাণ করে তা পর্ব ০৪-এর ভাষায় একটি নির্দিষ্ট বাক্য: ∀n ∈ ℤ+, P(n), যেখানে P(n) = “প্রথম n-টি সেটের ছেদ ফাঁকা নয়”। প্রতিটি P(n) একটি সসীম ছেদের কথা বলে। অসীম ছেদের দাবি সম্পূর্ণ আলাদা একটি বাক্য: ∃m, ∀i, m ∈ Bi. প্রথমটি “প্রতিটি n-এর জন্য একটি সাক্ষী আছে” (∀n ∃m), দ্বিতীয়টি (∃m ∀i) “একটি সাক্ষী সব i-এর জন্য কাজ করে”। পর্ব ০৫ “Nested quantifier — ক্রম বদলালে অর্থ বদলায়”-এর মূল শিক্ষা ঠিক এটিই: ∀∃ থেকে ∃∀ আসে না। Bi = {i, i + 1, …}-এ প্রতিটি n-এর জন্য সাক্ষী n নিজে, কিন্তু কোনো একটি m সব i-এ কাজ করে না, কারণ i = m + 1 তাকে বাদ দেয় (উপপাদ্য ৭.২)।

এই ফাঁক গণিতের বহু জায়গায় দেখা যায়। বাস্তব সংখ্যায় খোলা ব্যবধি (0, 1/n)-এর প্রতিটি সসীম ছেদ ফাঁকা নয়, কিন্তু সব n-এর ছেদ ফাঁকা, কারণ কোনো ধনাত্মক সংখ্যা সব 1/n-এর চেয়ে ছোট নয়। সসীম সেটের জগতে এই সমস্যা নেই: ক্রমশ ছোট হওয়া অফাঁকা সসীম সেটের পরিবার কোথাও না কোথাও স্থির হয়ে যায় (well-ordering, পর্ব ১১), তাই অসীম ছেদও ফাঁকা নয়।

কম্পিউটার বিজ্ঞানেও এটি দেখা যায়: একটি লুপের invariant প্রতিটি সসীম ঘোরার পরে সত্য (পর্ব ১৩), কিন্তু লুপ চিরকাল চললে “শেষে” বলে কিছু নেই। এজন্যই termination আলাদা প্রমাণ করতে হয়।

মূল উপলব্ধি: “প্রতিটি সসীম ধাপে সত্য” আর “অসীম পর্যন্ত সত্য” দুটি আলাদা দাবি, যাদের quantifier-এর ক্রম আলাদা। Generalized union বা intersection নিয়ে কাজ করার সময় সংজ্ঞায় ফিরুন (∃ আর ∀), induction-এর ফলকে অসীমে টেনে নেবেন না।

প্র ০৫Fuzzy set-এ A ∩ A′ ফাঁকা নয়, multiset-এ একই উপাদান কয়েকবার থাকে। তাহলে কি এগুলো “ভুল” সেট? কোন প্রশ্নে কোন ধারণা ঠিক হাতিয়ার?

“ভুল” নয়, ভিন্ন গাণিতিক বস্তু, যাদের নিয়ম ভিন্ন। প্রশ্ন হলো, বাস্তবের যে জিনিসটি মডেল করতে চান, তার আচরণ কোন নিয়ম মানে। সাধারণ সেট দুটি দাবি করে: সদস্যতা হ্যাঁ বা না, আর পুনরাবৃত্তির কোনো অর্থ নেই। “গত সপ্তাহে কোন ক্রেতারা অর্ডার করেছেন” প্রশ্নে দুটিই ঠিক, তাই সেট ঠিক হাতিয়ার। “কোন পণ্য কত প্যাকেট বিক্রি হয়েছে” প্রশ্নে পুনরাবৃত্তিই মূল তথ্য, তাই multiset. এ কারণেই SQL-এর টেবিল মূলত multiset: একই সারি দুবার থাকতে পারে, আর DISTINCT বা UNION চাইলে তবেই সেটে নামে। Edgar Codd-এর মূল relational model (১৯৭০) সেট দিয়ে গড়া, কিন্তু বাস্তব SQL ডুপ্লিকেট রাখার সিদ্ধান্ত নেয়, মূলত দক্ষতা আর গণনার (COUNT, SUM) প্রয়োজনে; এই পার্থক্য নিয়ে ডেটাবেস তাত্ত্বিকদের মধ্যে দীর্ঘ আলোচনা আছে।

Fuzzy set আসে অস্পষ্ট ধারণা থেকে: “দ্রুত”, “দামি”, “গরম”। Lotfi Zadeh ১৯৬৫ সালে Information and Control জার্নালে এই ধারণা প্রকাশ করেন, আর পরের দশকগুলোতে fuzzy logic-ভিত্তিক নিয়ন্ত্রণ ব্যবস্থা কিছু শিল্প-যন্ত্রে আর ভোক্তা-পণ্যে ব্যবহৃত হয়েছে বলে ব্যাপকভাবে উল্লেখ পাওয়া যায়। এখানে A ∩ A′ ≠ ∅ কোনো ত্রুটি নয়, বরং মডেলের উদ্দেশ্যই: ১০ ঘণ্টার ডেলিভারি সত্যিই “কিছুটা দ্রুত, কিছুটা ধীর”।

তবে সাবধানতার কথা আছে। Fuzzy সদস্যতা সংখ্যা কে, কীভাবে ঠিক করল (μ = 0.6 কেন, 0.5 নয়?) তা প্রায়ই বিচার-নির্ভর। আর fuzzy সদস্যতাকে সম্ভাবনার সঙ্গে গুলিয়ে ফেলা একটি সাধারণ ভুল: সম্ভাবনায় P(A ∩ A′) = 0 সবসময়, fuzzy-তে নয়। অনিশ্চয়তা যদি “ঘটবে কি ঘটবে না” ধরনের হয়, সম্ভাবনা (পর্ব ৩৮) ঠিক হাতিয়ার; যদি “কতটা” ধরনের অস্পষ্টতা হয়, fuzzy set একটি বিকল্প।

মূল উপলব্ধি: সেট, multiset আর fuzzy set তিনটি আলাদা মডেল। কোন identity টেকে (যেমন complement law) তা দেখে বোঝা যায় কোন মডেল কী ধরে নেয়; আর সমস্যার আচরণ যে নিয়ম মানে, সেই নিয়মের মডেলটিই বাছতে হয়।

অনুশীলন

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

  1. প্রমাণ: যেকোনো সেট A, B, C-এর জন্য A − (B ∩ C) = (A − B) ∪ (A − C) element chasing দিয়ে (দুই দিকের ⊆) সংখ্যাযুক্ত ধাপে প্রমাণ করুন।
    1. (⊆) ধরি x ∈ A − (B ∩ C). তাহলে x ∈ A আর x ∉ B ∩ C. — difference-এর সংজ্ঞা
    2. x ∉ B ∩ C মানে ¬(x ∈ B ∧ x ∈ C), অর্থাৎ x ∉ B অথবা x ∉ C. — logic-এর De Morgan
    3. ক্ষেত্র ১, x ∉ B: তাহলে x ∈ A − B ⊆ (A − B) ∪ (A − C). ক্ষেত্র ২, x ∉ C: তাহলে x ∈ A − C ⊆ (A − B) ∪ (A − C). — proof by cases, উপপাদ্য ১.২
    4. (⊇) ধরি y ∈ (A − B) ∪ (A − C). তাহলে y ∈ A − B অথবা y ∈ A − C; দুই ক্ষেত্রেই y ∈ A, আর y ∉ B অথবা y ∉ C. — ∪ আর difference-এর সংজ্ঞা
    5. y ∉ B অথবা y ∉ C থেকে y ∉ B ∩ C, তাই y ∈ A − (B ∩ C). — De Morgan, সংজ্ঞা
    6. দুই দিকের ⊆ থেকে সমতা। ∎

    §৬-এর ব্লকে এই identity {1, 2}-এর সব subset দিয়ে গড়া ৬৪টি ত্রয়ীতে আর হাজার এলোমেলো পরীক্ষায় পাস করেছে; প্রমাণ উপরের ধাপগুলো।

  2. হিসাব: বাজারঘরের একটি জরিপে ২০০ জন ক্রেতার মধ্যে ১২০ জন চাল, ৯০ জন তেল, আর ৫০ জন দুটোই কিনেছেন। (ক) অন্তত একটি কিনেছেন কতজন? (খ) কোনোটিই কেনেননি কতজন? (গ) শুধু চাল কতজন? (ঘ) ঠিক একটি কতজন? (ঙ) U = {1, …, 8}-এ A = 10110010 আর B = 01100011 হলে A ∪ B, A − B আর |A ⊕ B| বের করুন।

    (ক) |A ∪ B| = 120 + 90 − 50 = 160. (খ) 200 − 160 = 40. (গ) |A − B| = 120 − 50 = 70. (ঘ) |A ⊕ B| = 120 + 90 − 2 · 50 = 110; যাচাই: শুধু চাল ৭০ আর শুধু তেল ৪০, মোট ১১০.

    (ঙ) A ∪ B = 11110011 (OR); A − B = A AND (NOT B) = 10110010 AND 10011100 = 10010000; A ⊕ B = 11010001, তাতে চারটি ১, তাই |A ⊕ B| = 4. যাচাই: |A| = 4, |B| = 4, A ∩ B = 00100010-এ দুটি ১, আর 4 + 4 − 2 · 2 = 4. সব উত্তর scratch-এ Python দিয়ে মেলানো।

  3. আউটপুট অনুমান: কোড না চালিয়ে বলুন কী ছাপা হবে। শেষ লাইনের তিনটি সংখ্যা সেটের কোন অপারেশনের সঙ্গে মেলে? তারপর যেকোনো Python-এ চালিয়ে মেলান।
    A = {1, 2, 3, 4}
    B = {3, 4, 5}
    print(sorted(A | B), sorted(A & B))
    print(sorted(A - B), sorted(B - A), sorted(A ^ B))
    print(len(A | B) == len(A) + len(B) - len(A & B))
    print(0b1100 | 0b1010, 0b1100 & 0b1010, 0b1100 ^ 0b1010)
    [1, 2, 3, 4, 5] [3, 4]
    [1, 2] [5] [1, 2, 5]
    True
    14 8 6

    প্রথম তিন লাইন সেটের অপারেশন আর উপপাদ্য ৩.১-এর যাচাই: 5 = 4 + 3 − 2. শেষ লাইন একই অপারেশন bit string-এ: 1100 OR 1010 = 1110 = 14, AND = 1000 = 8, XOR = 0110 = 6. চার উপাদানের U-তে 1100 আর 1010 দুটি সেট, আর ফলগুলো তাদের union, intersection আর symmetric difference. sorted ব্যবহার করা হয়েছে কারণ Python সেট ছাপার ক্রমের নিশ্চয়তা দেয় না।

  4. প্রমাণের ভুল ধরুন: একজন লিখলেন: “দাবি: সসীম A, B, C-এর জন্য |A ∪ B ∪ C| = |A| + |B| + |C| − |A ∩ B| − |A ∩ C| − |B ∩ C|. প্রমাণ: উপপাদ্য ৩.১-এর মতো, প্রতিটি জোড়ার সাধারণ অংশ দুবার গোনা হয়েছে, তাই প্রতিটি জোড়ার ছেদ একবার করে বিয়োগ করলেই প্রতিটি উপাদান ঠিক একবার গোনা হয়। ∎” ভুল কোথায়? একটি counterexample দিন আর সূত্রটি ঠিক করুন।
    • ভুল: “প্রতিটি উপাদান ঠিক একবার” দাবিটি ক্ষেত্র ধরে পরীক্ষা করা হয়নি। তিনটি সেটেই আছে এমন উপাদান |A| + |B| + |C|-এ তিনবার যোগ হয়, আর তিনটি জোড়ার ছেদেই আছে বলে তিনবার বিয়োগ হয়: মোট ০ বার।
    • Counterexample: A = B = C = {1}. বাঁ দিক |{1}| = 1; ডান দিক 1 + 1 + 1 − 1 − 1 − 1 = 0.
    • সংশোধন: |A ∪ B ∪ C| = |A| + |B| + |C| − |A ∩ B| − |A ∩ C| − |B ∩ C| + |A ∩ B ∩ C|. যাচাই: অন্য অঞ্চলের উপাদানও ঠিক একবার গোনা হয় (যেমন শুধু A ∩ B-তে থাকা উপাদান ২ বার যোগ, ১ বার বিয়োগ)। পূর্ণ প্রমাণ আর n সেটের রূপ পর্ব ৪৯ “Inclusion–exclusion আর derangement”-এ।

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

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

ক্রমElement chasing দিয়ে X = Y প্রমাণের ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. লক্ষ্য লেখা: X ⊆ Y এবং Y ⊆ X
  2. যেকোনো x ∈ X নিয়ে সংজ্ঞা খোলা
  3. Logic-এর নিয়ম বা case দিয়ে x ∈ Y দেখানো, ফলে X ⊆ Y
  4. যেকোনো y ∈ Y নিয়ে একইভাবে y ∈ X দেখানো, ফলে Y ⊆ X
  5. দুই দিকের ⊆ থেকে X = Y সিদ্ধান্ত

U = {1, 2, …, 10}, A = {2, 4, 6, 8, 10}, B = {1, 2, 3, 4, 5}. A − B কোনটি?

  • {1, 3, 5}
  • {2, 4}
  • {6, 8, 10}
  • {1, 3, 5, 6, 8, 10}

দুটি সসীম সেটে |A| = 25, |B| = 18 আর |A ∪ B| = 35. তাহলে |A ∩ B| কত?

  • 7
  • 8
  • 43
  • 17

নিচের কোনটি সব সেট A, B-এর জন্য set identity নয়?

  • A ∩ (A ∪ B) = A
  • (A ∩ B)′ = A′ ∪ B′
  • A ⊕ A = ∅
  • (A − B) ∪ B = A

U-তে ৮টি উপাদান একটি নির্দিষ্ট ক্রমে। A-এর bit string 10110010, B-এর 01100011. A ∩ B-এর bit string কোনটি?

  • 00100010
  • 11110011
  • 11010001
  • 10010000

চারটি সেট A, B, C, D থেকে গড়া দুটি রাশির সমতা membership table দিয়ে প্রমাণ করতে কয়টি সারি পরীক্ষা করতে হয়?

  • 4
  • 8
  • 16
  • 24

প্রতিটি ধনাত্মক পূর্ণসংখ্যা i-এর জন্য Bi = {i, i + 1, i + 2, …}. সব Bi-এর ছেদ ⋂i=1∞ Bi কোনটি?

  • {1}
  • ∅ (ফাঁকা সেট)
  • ℤ+
  • একটি অসীম সেট

শব্দকোষ

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

মনে রাখুন

  1. অপারেশন = connective: ∪ ↔ ∨, ∩ ↔ ∧, A′ ↔ ¬ (সবসময় একটি U-এর সাপেক্ষে), A − B = A ∩ B′, A ⊕ B ↔ XOR.
  2. গণনা: |A ∪ B| = |A| + |B| − |A ∩ B|; |A − B| = |A| − |A ∩ B|; |A ⊕ B| = |A| + |B| − 2|A ∩ B|; শুধু সসীম সেটে।
  3. প্রমাণের পথ: element chasing (দুই দিকের ⊆), membership table (2n সারি, পূর্ণ প্রমাণ), logic বা identity-র শিকল। এলোমেলো পরীক্ষা শুধু counterexample খোঁজে।
  4. অনেক সেট: ⋃ মানে ∃, ⋂ মানে ∀; সাধারণ De Morgan quantifier-এর অস্বীকার থেকে। সসীম ছেদের ধর্ম অসীম ছেদে আপনা-আপনি আসে না।
  5. কম্পিউটারে: ছোট স্থির U-তে bit string: OR, AND, NOT, XOR আর popcount; বড় বিক্ষিপ্ত সেটে hash set. Multiset বহুলতা রাখে, fuzzy set মাত্রা রাখে।

পরের পর্বে: পর্ব ১৬ “ফাংশন — one-to-one, onto, inverse আর composition”: এক সেটের প্রতিটি উপাদানকে অন্য সেটের একটি উপাদানের সঙ্গে জোড়ার নিয়ম, আর সেই নিয়ম কখন উল্টানো যায়।

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

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