পাঠ ০৩ · ৫৬-এর মধ্যে · মডিউল ১
Home / Courses / Formal Language & Automata Theory / Theory of Computation / ইনডাকশন ও প্রুফ

ম্যাথমেটিক্যাল ইনডাকশন ও প্রুফ টেকনিক

Mathematical induction & proof techniques
৮ মিনিট পড়া শুরু · Beginner Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • ম্যাথমেটিক্যাল ইনডাকশনের ফরমাল স্ট্রাকচার — base case ও inductive step
  • স্ট্রাকচারাল ইনডাকশন — কেন এই কোর্সের প্রুফগুলো (স্ট্রিং, গ্রামার নিয়ে) মূলত এই ফর্মে হয়
  • প্রুফ বাই কনট্রাডিকশন — টেমপ্লেট ও কখন ব্যবহার করবেন
  • একটি worked example — $|w^R| = |w|$ প্রমাণ স্ট্রাকচারাল ইনডাকশন দিয়ে
  • Python দিয়ে reversal-এর inductive definition বাস্তবায়ন এবং একটি কাউন্টার-এক্সাম্পল চেকার

১ · ম্যাথমেটিক্যাল ইনডাকশন

ম্যাথমেটিক্যাল ইনডাকশনMathematical Inductionএকটি স্টেটমেন্ট P(n) সব প্রাকৃতিক সংখ্যা n ≥ base-এর জন্য সত্য প্রমাণ করার একটি টেকনিক — base case + inductive step। হলো একটি স্টেটমেন্ট $P(n)$ সব $n \geq \text{base case}$-এর জন্য প্রমাণ করার একটি টেকনিক — এই কোর্সের প্রায় প্রতিটি বড় থিওরেম এই টেকনিকের কোনো না কোনো রূপ ব্যবহার করে ( discrete-math L06-এ পড়ে থাকলে সরাসরি পুনরাবৃত্তি, নতুন করে করছি না)। এটি দুটি অংশে গঠিত —

  1. Base case: $P(\text{base})$ সরাসরি (সাধারণত হাতে-গোনা যাচাইযোগ্য) প্রমাণ করা।
  2. Inductive step: inductive hypothesis — $P(k)$ সত্য ধরে নিয়ে — দেখানো যে $P(k+1)$-ও সত্য হতে বাধ্য।

এই দুটো মিলিয়ে $P(\text{base})$, তারপর $P(\text{base}) \implies P(\text{base}+1)$, তারপর $P(\text{base}+1) \implies P(\text{base}+2)$ ... — একটি ডমিনো-চেইনের মতো, যা সব $n \geq \text{base}$-এর জন্য $P(n)$ প্রতিষ্ঠা করে।

২ · স্ট্রাকচারাল ইনডাকশন

স্ট্রাকচারাল ইনডাকশনStructural Inductionইন্টিজারের উপর নয়, বরং রিকার্সিভভাবে সংজ্ঞায়িত বস্তুর (স্ট্রিং, পার্স ট্রি) গঠনের উপর ইনডাকশন। হলো ইনডাকশনের একটি রূপান্তর যেখানে ইন্টিজারের বদলে একটি রিকার্সিভভাবে-সংজ্ঞায়িত বস্তুর গঠনের উপর ইনডাকশন করা হয় — এই কোর্সে সবচেয়ে বেশি ব্যবহৃত ফর্ম, কারণ স্ট্রিং (L02), পার্স ট্রি (M4), এমনকি টুরিং মেশিন কনফিগারেশন (M8) — সবই রিকার্সিভভাবে সংজ্ঞায়িত। উদাহরণস্বরূপ, $\Sigma^*$-এর সব স্ট্রিং-এর জন্য একটি প্রপার্টি প্রমাণ করতে —

  1. Base case: প্রপার্টিটি $\varepsilon$-এর জন্য সত্য প্রমাণ করা।
  2. Inductive step: প্রপার্টিটি একটি স্ট্রিং $w$-এর জন্য সত্য ধরে নিয়ে, দেখানো যে এটি $wa$ (যেকোনো সিম্বল $a$ যোগ করে তৈরি বড় স্ট্রিং)-এর জন্যও সত্য।

যেহেতু $\Sigma^*$-এর প্রতিটি স্ট্রিং $\varepsilon$ থেকে শুরু করে বারবার একটি সিম্বল যোগ করে তৈরি করা যায় (L02-এর রিকার্সিভ সংজ্ঞা), এই দুই ধাপ মিলিয়ে সব স্ট্রিং-এর জন্য প্রপার্টিটি প্রতিষ্ঠিত হয়।

৩ · প্রুফ বাই কনট্রাডিকশন

প্রুফ বাই কনট্রাডিকশনProof by Contradictionযা প্রমাণ করতে চাই তার নেগেশন ধরে নিয়ে একটি লজিক্যাল বিরোধ বের করে মূল দাবিটি সত্য প্রমাণ করা। হলো এই কোর্সের অন্য প্রধান প্রুফ টেকনিক — বিশেষত non-regularity (M3) ও undecidability (M9) প্রমাণে প্রায় সবসময় ব্যবহৃত হয়। টেমপ্লেটটি —

  1. যা প্রমাণ করতে চাই তার নেগেশন ধরে নাও।
  2. সেই নেগেশন থেকে যৌক্তিকভাবে অগ্রসর হও।
  3. একটি লজিক্যাল বিরোধ (contradiction) — এমন কিছু যা একইসাথে সত্য ও মিথ্যা, বা কোনো পূর্বপ্রতিষ্ঠিত সত্যকে লঙ্ঘন করে — খুঁজে বের করো।
  4. যেহেতু নেগেশন থেকে একটি বিরোধ আসে, নেগেশনটি মিথ্যা হতে বাধ্য — তাই মূল স্টেটমেন্টটি সত্য।

৪ · Worked Example — $|w^R| = |w|$

দাবি: সব স্ট্রিং $w \in \Sigma^*$-এর জন্য, $|w^R| = |w|$ (উল্টো করলে length অপরিবর্তিত থাকে)। স্ট্রাকচারাল ইনডাকশন দিয়ে প্রমাণ —

প্রমাণ

Base case ($w = \varepsilon$): $\varepsilon^R = \varepsilon$, তাই $|\varepsilon^R| = 0 = |\varepsilon|$ ✓।
Inductive step: ধরি $w$-এর জন্য $|w^R| = |w|$ সত্য (inductive hypothesis)। এখন $wa$ (যেকোনো সিম্বল $a$ যোগ করে) বিবেচনা করি — সংজ্ঞা অনুযায়ী $(wa)^R = a \cdot w^R$ (নতুন যোগ করা সিম্বলটিই উল্টোতে সবার সামনে চলে আসে)। তাই $|(wa)^R| = |a \cdot w^R| = 1 + |w^R| = 1 + |w|$ (inductive hypothesis দিয়ে) $= |wa|$। ✓ তাই ইনডাকশন দ্বারা সব $w \in \Sigma^*$-এর জন্য $|w^R|=|w|$।

৫ · Python-এ ইনডাকটিভ Reversal ও একটি কনট্রাডিকশন-চেকার

নিচের কোড সেলে ঠিক উপরের ইনডাকটিভ সংজ্ঞা অনুযায়ী (base case: $\varepsilon$, inductive case: $wa \to a \cdot \text{reverse}(w)$) একটি reverse_string ফাংশন লেখা হচ্ছে (Python-এর স্লাইসিং শর্টকাট ব্যবহার না করে), তারপর একটি ছোট্ট প্রুফ-বাই-কনট্রাডিকশন-স্টাইল চেকার — একটি বিখ্যাত উদাহরণ, অয়লারের "$n^2-n+41$ সবসময় মৌলিক" দাবির প্রথম কাউন্টার-এক্সাম্পল খুঁজে বের করছে।

Python
def reverse_string(s):
    """base case: khali string nijei fire ase; inductive case: reverse(s[1:]) + s[0]"""
    if s == "":
        return s
    return reverse_string(s[1:]) + s[0]

test_strings = ["", "a", "ab", "hello", "0110", "1101001"]
print(f"{'w':10s} | {'reverse(w)':12s} | |w| | |reverse(w)| | মিলছে?")
print("-" * 55)
all_ok = True
for s in test_strings:
    r = reverse_string(s)
    ok = len(r) == len(s)
    all_ok = all_ok and ok
    print(f"{s!r:10s} | {r!r:12s} | {len(s):3d} | {len(r):11d} | {'হ্যাঁ' if ok else 'না'}")
print()
print("সব টেস্ট স্ট্রিং-এ |w^R| = |w| সন্তুষ্ট? (ইনডাকটিভ দাবির স্পট-চেক):", all_ok)

def is_prime(n):
    if n < 2:
        return False
    for d in range(2, int(n ** 0.5) + 1):
        if n % d == 0:
            return False
    return True

def property_holds(n):
    # daabi: shokol n >= 1 -er jonno, n^2 - n + 41 ekti mowlik shonkha
    return is_prime(n * n - n + 41)

def check_counterexample(claimed_n, property_fn):
    """dile ekti 'counterexample'-er dabi, jachai kore eta shotti property longhon kore kina"""
    return not property_fn(claimed_n)

print()
print("দাবি: সব n >= 1-এর জন্য, n^2 - n + 41 একটি মৌলিক সংখ্যা (Euler's prime-generating polynomial)")
for n in [1, 5, 10, 40, 41]:
    value = n * n - n + 41
    is_counterexample = check_counterexample(n, property_holds)
    print(f"n={n:3d} -> n^2-n+41 = {value:5d}, মৌলিক? {is_prime(value)}, contradiction/counterexample? {is_counterexample}")

    
লক্ষ্য করুন n=1 থেকে n=40 পর্যন্ত দাবিটি সত্য মনে হচ্ছে (সব মৌলিক) — কিন্তু n=41-এ ভেঙে পড়ে ($41^2 = 1681 = 41 \times 41$, মৌলিক নয়)। এটিই ঠিক প্রুফ বাই কনট্রাডিকশনের/কাউন্টার-এক্সাম্পলের শক্তি — "সব $n$-এর জন্য সত্য" প্রমাণ করতে প্রতিটি $n$ যাচাই করতে হয় (অসম্ভব, অসীম সংখ্যক), কিন্তু ভুল প্রমাণ করতে একটি-ই যথেষ্ট।
মূল কথা · Key takeaway

ইনডাকশন (বিশেষত স্ট্রাকচারাল ইনডাকশন) দিয়ে "সব স্ট্রিং/গ্রামারের জন্য সত্য" প্রমাণ করা হয়, আর কনট্রাডিকশন দিয়ে "এটি অসম্ভব/ভুল" প্রমাণ করা হয়। এই দুটো টুল ছাড়া M3-এর pumping lemma প্রুফ থেকে M9-এর undecidability প্রুফ পর্যন্ত কিছুই দাঁড়াতে পারবে না — বাকি কোর্স জুড়ে বারবার এদের প্রয়োগ দেখবেন।

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

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ স্ট্রাকচারাল ইনডাকশন সাধারণ ইন্টিজার-ইনডাকশন থেকে ঠিক কীভাবে আলাদা?

সাধারণ ইন্টিজার-ইনডাকশনে $P(n)$ প্রমাণ হয় $n=0,1,2,\ldots$ ক্রমানুসারে — প্রতিটি স্টেপে সংখ্যা ১ বাড়ে। স্ট্রাকচারাল ইনডাকশনে "বাড়া"টা সংখ্যায় নয়, বরং বস্তুর গঠনে — যেমন একটি স্ট্রিং $w$ থেকে $wa$ (এক সিম্বল যোগ), বা একটি ছোট পার্স ট্রি থেকে একটি বড় পার্স ট্রি (একটি প্রোডাকশন রুল প্রয়োগ করে)। মূলনীতি একই (base case + inductive step), কিন্তু "পরবর্তী ধাপ"-এর সংজ্ঞা বস্তুর নিজস্ব রিকার্সিভ গঠন থেকে আসে, প্রাকৃতিক সংখ্যার ক্রম থেকে নয়।

প্র ০২ প্রুফ বাই কনট্রাডিকশন কেন বিশেষভাবে non-regularity ও undecidability প্রমাণে এত বেশি ব্যবহৃত হয়?

কারণ এই দাবিগুলো মূলত "অস্তিত্বহীনতা" প্রমাণ করে — "কোনো DFA-ই এই ভাষা accept করতে পারে না" বা "কোনো অ্যালগরিদমই এই সমস্যা সমাধান করতে পারে না।" এই ধরনের "কিছু নেই" দাবি সরাসরি (constructively) প্রমাণ করা কঠিন — সব সম্ভাব্য DFA/অ্যালগরিদম হাতে-গোনে দেখানো অসম্ভব। বরং, বিপরীতটি ধরে নেওয়া ("এমন একটি DFA/অ্যালগরিদম আছে ধরি") এবং সেখান থেকে একটি সুনির্দিষ্ট বিরোধ বের করা অনেক বেশি সহজ ও কার্যকর — এটিই M3-এর pumping lemma প্রুফ এবং M9-এর হল্টিং প্রবলেম প্রুফের কাঠামো।

প্র ০৩ উপরের কোড সেলে n=1 থেকে n=40 পর্যন্ত সব ফলাফল "মৌলিক" দেখানোর পরেও কেন এটি একটি ফরমাল প্রমাণ ("সব $n$-এর জন্য মৌলিক") হিসেবে গণ্য হয় না?

কারণ ৪০টি (বা যেকোনো ফাইনাইট সংখ্যক) উদাহরণ যাচাই করা "সব $n \geq 1$"-এর মতো একটি অসীম দাবির জন্য যথেষ্ট প্রমাণ নয় — এটি একটি ইন্ডাক্টিভ (empirical) পর্যবেক্ষণ, ডিডাক্টিভ প্রমাণ নয়। প্রকৃতপক্ষে $n=41$-এই এই নির্দিষ্ট দাবিটি ভেঙে পড়ে, যা দেখায় "প্রথম ৪০টি case-এ কাজ করছে" থেকে "সব case-এ কাজ করবে" — এই লাফটি বিপজ্জনক। এই কারণেই এই কোর্সে প্রতিটি "সব $w$/$n$-এর জন্য সত্য" দাবির জন্য একটি প্রকৃত ইনডাকশন প্রুফ (base case + inductive step, বা কনট্রাডিকশন) লাগবে — শুধু কিছু উদাহরণ টেস্ট করে যথেষ্ট নয়।

অনুশীলন

  1. প্রমাণ করুন (স্ট্রাকচারাল ইনডাকশন): দাবি করুন — সব $x, y \in \Sigma^*$-এর জন্য, $|xy| = |x| + |y|$। $y$-এর গঠনের উপর স্ট্রাকচারাল ইনডাকশন দিয়ে প্রমাণের রূপরেখা লিখুন (base case: $y=\varepsilon$, inductive case: $y=za$)।

    Base case ($y=\varepsilon$): $x\varepsilon = x$, তাই $|x\varepsilon|=|x|=|x|+0=|x|+|\varepsilon|$ ✓। Inductive step: ধরি $|xz|=|x|+|z|$ সত্য (কোনো $z$-এর জন্য)। এখন $y=za$ বিবেচনা করি — $x(za) = (xz)a$ (concatenation-এর associativity), তাই $|x(za)| = |(xz)a| = |xz|+1 = (|x|+|z|)+1 = |x|+(|z|+1) = |x|+|za|$ ✓। ইনডাকশন দ্বারা সব $y$-এর জন্য সত্য।

  2. পরীক্ষা করুন: উপরের কোড সেলে property_holds ফাংশনটি বদলে $n^2+n+41$ (মূল Euler polynomial-এর একটি ভ্যারিয়েন্ট) টেস্ট করুন — এটি $n=1$ থেকে $n=39$ পর্যন্ত মৌলিক থাকে কিন্তু $n=40$-এ ভাঙে কিনা যাচাই করুন।

    $n=40$: $40^2+40+41 = 1600+40+41=1681=41 \times 41$ — মৌলিক নয়, দাবিটি এখানে ভেঙে পড়ে (মূল Euler polynomial $n^2+n+41$-এর প্রথম কাউন্টার-এক্সাম্পল $n=40$-এ, যেখানে $n^2-n+41$-এর প্রথম কাউন্টার-এক্সাম্পল $n=41$-এ — দুটোই একই মূল কারণে: $n=41$ বসালে $41^2$ পাওয়া যায়)।

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

  • কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৬টি পাঠ পরবর্তী পাঠ — চমস্কি হায়ারার্কি: এই কোর্সের একটি রোডম্যাপ — এখনই পড়া যাবে।
  • Mathematical Induction discrete-math L06 ইনডাকশনের সম্পূর্ণ, সাধারণ (সংখ্যাতাত্ত্বিক) ভিত্তি সেই পাঠে তৈরি হয়েছে — এখানে শুধু স্ট্রিং/গ্রামার-নির্দিষ্ট প্রয়োগ যোগ করা হলো।
  • সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, DBMS, Discrete Mathematics, System Design, Cybersecurity, Cloud Computing & DevOps, Computer Networks, Operating Systems, Computer Architecture, Programming Languages & Compiler Design, Software Engineering & Git ও Theory of Computation — সব এক জায়গায়।
আগের পাঠ
আলফাবেট, স্ট্রিং ও ল্যাঙ্গুয়েজ