পাঠ ০৩ · ৪৪-এর মধ্যে · মডিউল ১
Home / Courses / Discrete Mathematics / প্রেডিকেট লজিক

প্রেডিকেট লজিক ও কোয়ান্টিফায়ার

Predicate logic & quantifiers
৮ মিনিট পড়া শুরু · Beginner Python কোডসহ সম্পূর্ণ বাংলায়

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

  • প্রেডিকেট ও প্রোপোজিশনের মধ্যে পার্থক্য
  • ∀ ও ∃ ব্যবহার করে গাণিতিক বিবৃতি লেখা ও পড়া
  • কোয়ান্টিফায়ার নেগেশন করা (কোয়ান্টিফায়ারের De Morgan's law)
  • নেস্টেড কোয়ান্টিফায়ারে অর্ডার কেন ফলাফল বদলে দেয় তা বোঝা
  • Python-এর all()/any() দিয়ে ∀/∃ যাচাই করা

১ · প্রেডিকেট কী?

একটি প্রেডিকেট (Predicate)Predicateএকটি ভেরিয়েবল-নির্ভর বিবৃতি যার সত্যতা সেই ভেরিয়েবলের মানের উপর নির্ভর করে — x-কে একটি নির্দিষ্ট মান বসিয়ে দিলে বা কোয়ান্টিফায়ার দিয়ে বাইন্ড করলে এটি একটি প্রোপোজিশনে পরিণত হয়। P(x) নিজে একটি প্রোপোজিশন নয় — এটি x-এর উপর নির্ভরশীল একটি "টেমপ্লেট"। ধরুন P(x): "x একটি জোড় সংখ্যা"। তাহলে P(4) সত্য, কিন্তু P(3) মিথ্যা — P(x) নিজে, x নির্দিষ্ট না হওয়া পর্যন্ত, না সত্য না মিথ্যা।

মূল পার্থক্য

P(x) একটি প্রোপোজিশন হয়ে ওঠে ঠিক দুইভাবে — (১) x-এ একটি নির্দিষ্ট মান বসিয়ে দিলে (যেমন P(4)), অথবা (২) একটি কোয়ান্টিফায়ার (∀ বা ∃) দিয়ে x-কে "বাইন্ড" করলে (যেমন ∀x P(x))। দুটোর যেকোনো একটি হলেই এটি একটি নির্দিষ্ট সত্য-মূল্য পায়।

২ · কোয়ান্টিফায়ার — ∀ ও ∃

কোয়ান্টিফায়ার (Quantifier)Quantifierএমন একটি চিহ্ন যা নির্দিষ্ট করে একটি প্রেডিকেট কতগুলো (কতজন/কয়টি) উপাদানের জন্য সত্য হতে হবে — "সবার জন্য" নাকি "অন্তত একজনের জন্য"। দুই ধরনের —

  • ইউনিভার্সাল কোয়ান্টিফায়ার ∀x P(x) ("for all x, P(x)") — ডোমেইনের প্রতিটি x-এর জন্য P(x) সত্য।
  • এক্সিস্টেনশিয়াল কোয়ান্টিফায়ার ∃x P(x) ("there exists x such that P(x)") — ডোমেইনে অন্তত একটি x আছে যার জন্য P(x) সত্য।

উদাহরণ: ডোমেইন হলো সব পূর্ণসংখ্যা। $\forall x\, (x^2 \ge 0)$ — সব পূর্ণসংখ্যার বর্গ অ-ঋণাত্মক — এটি সত্য। $\exists x\, (x^2 = 4)$ — এমন একটি পূর্ণসংখ্যা আছে যার বর্গ ৪ — এটিও সত্য (x=2 অথবা x=-2)।

৩ · কোয়ান্টিফায়ার নেগেশন

একটি কোয়ান্টিফাইড বিবৃতি নেগেট করলে কোয়ান্টিফায়ারটিও বদলে যায় — এটি কোয়ান্টিফায়ারের De Morgan's law নামে পরিচিত (L04-এ propositional De Morgan's দেখব) —

$\neg(\forall x\, P(x)) \equiv \exists x\, \neg P(x)$
$\neg(\exists x\, P(x)) \equiv \forall x\, \neg P(x)$

সাধারণ ভুল: "সব শিক্ষার্থী পাশ করেছে" ($\forall x\, P(x)$)-এর সঠিক নেগেশন হলো "কিছু শিক্ষার্থী পাশ করেনি" ($\exists x\, \neg P(x)$) — এটি "কোনো শিক্ষার্থী পাশ করেনি" ($\forall x\, \neg P(x)$, অর্থাৎ সবাই ফেল) নয়! একজন ফেল করলেই মূল দাবিটি মিথ্যা হয়ে যায় — সবাইকে ফেল করতে হবে না।

৪ · নেস্টেড কোয়ান্টিফায়ার — অর্ডার গুরুত্বপূর্ণ

যখন একাধিক কোয়ান্টিফায়ার একসাথে ব্যবহার করা হয়, তাদের ক্রম অর্থ বদলে দিতে পারে। সাধারণভাবে —

$\forall x \exists y\, P(x,y) \ne \exists y \forall x\, P(x,y)$

পূর্ণসংখ্যার উপর ক্লাসিক উদাহরণ: $P(x,y)$: "$y > x$"।

  • $\forall x \exists y\, (y>x)$ — "প্রতিটি x-এর জন্য, তার চেয়ে বড় একটি y আছে" — সত্য (যেকোনো x-এর জন্য y=x+1 নিলেই হয়)।
  • $\exists y \forall x\, (y>x)$ — "এমন একটি একক y আছে যা সব x-এর চেয়ে বড়" — মিথ্যা (পূর্ণসংখ্যার কোনো ঊর্ধ্বসীমা নেই, তাই কোনো একক y সব x-কে ছাড়িয়ে যেতে পারে না)।

পার্থক্যটির কারণ: $\forall x \exists y$-তে, প্রতিটি x-এর জন্য ভিন্ন y বেছে নেওয়া যায়। কিন্তু $\exists y \forall x$-তে, একটি একক y সব x-এর জন্য কাজ করতে হবে — এটি অনেক বেশি কঠোর শর্ত।

Python
evens = [2, 4, 6, 8, 10]
nums = [3, 15, 42, 99, 150]

# ∀x P(x): সব সংখ্যা কি জোড়?
all_even = all(n % 2 == 0 for n in evens)
print("সব সংখ্যা জোড়?", all_even)

# ∃x P(x): কোনো একটি সংখ্যা কি ১০০-এর চেয়ে বড়?
any_over_100 = any(n > 100 for n in nums)
print("১০০-এর চেয়ে বড় কোনো সংখ্যা আছে?", any_over_100)

    
all(...) শুধুমাত্র তখন True ফেরত দেয় যখন জেনারেটরের প্রতিটি মান True — ঠিক ∀-এর সংজ্ঞার মতো। any(...) True ফেরত দেয় যদি অন্তত একটি মান True হয় — ঠিক ∃-এর মতো।
মূল কথা · Key takeaway

প্রেডিকেট লজিক প্রোপোজিশনাল লজিকের চেয়ে অনেক বেশি এক্সপ্রেসিভ — এটি "সব", "কিছু", এবং তাদের মধ্যে সম্পর্ক বর্ণনা করতে পারে। প্রায় প্রতিটি গাণিতিক থিওরেম (যেমন এই কোর্সের L06-এর ইনডাকশন) কোয়ান্টিফায়ার দিয়ে লেখা — "সব n-এর জন্য..." মানেই আসলে $\forall n$।

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

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

প্র ০১ "সব শিক্ষার্থী পরীক্ষায় পাশ করেছে" — এই বিবৃতির সঠিক নেগেশন কী, এবং কেন "কোনো শিক্ষার্থী পাশ করেনি" ভুল?

মূল বিবৃতি: $\forall x\, P(x)$। এর নেগেশন $\neg(\forall x\, P(x)) \equiv \exists x\, \neg P(x)$ — অর্থাৎ "অন্তত একজন শিক্ষার্থী পাশ করেনি"। "কোনো শিক্ষার্থী পাশ করেনি" হলো $\forall x\, \neg P(x)$ — সম্পূর্ণ ভিন্ন এবং অনেক বেশি শক্তিশালী দাবি (সবাই ফেল করেছে)। মূল বিবৃতিকে মিথ্যা প্রমাণ করতে একজন ফেল করাই যথেষ্ট — সবাইকে ফেল করতে হবে না।

প্র ০২ কেন ∀x∃y(y>x) সত্য কিন্তু ∃y∀x(y>x) মিথ্যা — এমনকি যদিও উভয় বিবৃতিতে একই প্রেডিকেট ব্যবহৃত হয়েছে?

পার্থক্যটি "কে আগে বেছে নেয়" তার উপর। $\forall x \exists y\,(y>x)$-তে: প্রথমে একটি x ধরা হয়, তারপর সেই নির্দিষ্ট x-এর জন্য একটি উপযুক্ত y খুঁজে বের করা যায় (যেমন y=x+1) — প্রতিটি x-এর জন্য y ভিন্ন হতে পারে।

কিন্তু $\exists y \forall x\,(y>x)$-তে: প্রথমে একটি একক y স্থির করতে হয়, তারপর সেটিকে সব x-এর জন্য কাজ করতে হবে — কোনো পরিবর্তনের সুযোগ নেই। পূর্ণসংখ্যার কোনো সর্বোচ্চ মান নেই, তাই যেকোনো y-এর চেয়ে বড় একটি x সবসময় পাওয়া যাবে (যেমন x=y)। তাই কোনো একক y সব x-কে ছাড়িয়ে যেতে পারে না।

প্র ০৩ প্রেডিকেট P(x) নিজে কেন একটি "প্রোপোজিশন" নয়, যতক্ষণ না x-কে বাইন্ড করা হয়?

কারণ প্রোপোজিশনের সংজ্ঞা অনুযায়ী এর একটি নির্দিষ্ট সত্য-মূল্য থাকতে হবে। P(x): "x জোড়" — এই বাক্যটির সত্যতা সম্পূর্ণভাবে x-এর উপর নির্ভরশীল; x=4 হলে সত্য, x=3 হলে মিথ্যা। যতক্ষণ x অনির্দিষ্ট, ততক্ষণ এর কোনো একক, স্থির সত্য-মূল্য নেই — তাই এটি প্রোপোজিশন নয়, প্রোপোজিশন তৈরির একটি "টেমপ্লেট" মাত্র। x-এ মান বসালে বা কোয়ান্টিফায়ার দিয়ে বাইন্ড করলেই এটি একটি নির্দিষ্ট সত্য-মূল্যযুক্ত প্রোপোজিশনে পরিণত হয়।

অনুশীলন

  1. সিম্বলে লিখুন: "কোনো ঋণাত্মক সংখ্যা নেই যার বর্গ ঋণাত্মক" — এই বাক্যটিকে ∀ অথবা ∃ ব্যবহার করে symbolic ভাষায় লিখুন, এবং ব্যাখ্যা করুন কেন এটি সত্য।

    symbolic রূপ: $\neg \exists x\, (x^2 < 0)$, অথবা সমতুল্যভাবে $\forall x\, (x^2 \ge 0)$ (কোয়ান্টিফায়ার নেগেশন প্রয়োগ করে)। এটি সত্য কারণ যেকোনো বাস্তব সংখ্যার বর্গ সবসময় অ-ঋণাত্মক — ধনাত্মক, ঋণাত্মক বা শূন্য যেকোনো x-এর জন্যই $x^2 \ge 0$।

  2. কোড পরিবর্তন করুন: উপরের code cell-এ nums লিস্টে নতুন সংখ্যা বসিয়ে পরীক্ষা করুন — "সব সংখ্যা কি ৩ দ্বারা বিভাজ্য?" (∀) চেক করতে all() ব্যবহার করুন।

    কোড: all(n % 3 == 0 for n in nums)। যদি লিস্টের সব সংখ্যা ৩ দ্বারা নিঃশেষে বিভাজ্য হয়, ফলাফল True; একটি সংখ্যাও না হলে False। মনে রাখবেন — একটি খালি লিস্টে all() সবসময় True ফেরত দেয় (vacuous truth-এর মতোই ঘটনা), আর any() খালি লিস্টে সবসময় False ফেরত দেয়।

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

পাঠ ০২
প্রপোজিশনাল লজিক — বিবৃতি ও যৌক্তিক অপারেটর