هوش مصنوعی CS50 s1
آموزش هوش مصنوعی
دوره کامل آموزش هوش مصنوعی بر مبنای دوره CS5 دانشگاه هاروارد به عنوان معتبرترین و جامع ترین دوره آموزش مقدماتی و مفهومی هوش مصنوعی شناخته می شود.
این دوره به بررسی دقیق و عمیق مباحث هوش مصنوعی به صورت پایه ای می پردازد و شامل 7 بخش میباشد .جهت دسترسی به سایر دوره ها می توانید از لینک های زیر استفاده نمایید.
و برای مشاهده لیست تمام دوره ها به بخش مقالات مراجه نمایید.
CS50’s Introduction to Artificial Intelligence with Python
Danix Ai
دانش (Knowledge)
مقالات هوش مصنوعی CS50’s1 : انسانها بر اساس دانشی که از قبل دارند استدلال میکنند و به نتیجه میرسند. همین مفهومِ بازنمایی دانش و نتیجهگیری از آن در هوش مصنوعی نیز به کار میرود و در این درس بررسی میکنیم که چگونه میتوان چنین رفتاری را در هوش مصنوعی ایجاد کرد.
عاملهای مبتنی بر دانش (Knowledge-Based Agents)
این عاملها با کار کردن روی بازنماییهای درونی دانش، استدلال میکنند.
اما «استدلال مبتنی بر دانش برای نتیجهگیری» دقیقاً یعنی چه؟
برای پاسخ به این سؤال، با یک مثال از هری پاتر شروع میکنیم. جملات زیر را در نظر بگیرید:
- اگر باران نباریده باشد، هری امروز به دیدن هاگرید رفته است.
- هری امروز یا به دیدن هاگرید رفته است یا دامبلدور، اما نه هر دو.
- هری امروز به دیدن دامبلدور رفته است.
بر اساس این سه جمله میتوانیم به پرسش «آیا امروز باران باریده؟» پاسخ بدهیم، حتی با اینکه هیچیک از جملهها بهطور مستقیم دربارهٔ باران حرفی نمیزنند.
در ادامه استدلال را میبینیم:
با توجه به جملهٔ ۳ میدانیم هری به دیدن دامبلدور رفته است.
با توجه به جملهٔ ۲ میدانیم او یا به دیدن دامبلدور رفته یا هاگرید، و چون دامبلدور را ملاقات کرده، پس نتیجه میگیریم:
- هری به دیدن هاگرید نرفته است.
اکنون جملهٔ ۱ را در نظر میگیریم: اگر باران نباریده باشد، هری باید به هاگرید سر میزد. اما از جملهٔ ۴ میدانیم این اتفاق نیفتاده است. بنابراین نتیجه میگیریم:
- امروز باران باریده است.
برای رسیدن به این نتیجه، از منطق استفاده کردیم. در این درس بررسی میکنیم که هوش مصنوعی چگونه از منطق برای رسیدن به اطلاعات جدید بر اساس اطلاعات موجود استفاده میکند.
جمله (Sentence)
یک جمله ادعایی دربارهٔ جهان است که در یک زبان نمایش دانش بیان میشود. جمله ابزاری است که هوش مصنوعی از آن برای ذخیرهٔ دانش و استنتاج اطلاعات جدید استفاده میکند.
منطق گزارهای (Propositional Logic)
منطق گزارهای بر پایهٔ گزارهها ساخته شده است؛ گزارهها گفتههایی دربارهٔ جهاناند که میتوانند «درست» یا «نادرست» باشند، مانند جملههای ۱ تا ۵ در بالا.
نمادهای گزارهای (Propositional Symbols)
نمادهای گزارهای معمولاً حروفی مانند P، Q، R هستند که برای نمایش یک گزاره استفاده میشوند.
اتصالدهندههای منطقی (Logical Connectives)
اتصالدهندههای منطقی نمادهایی هستند که گزارهها را به هم وصل میکنند تا بتوانیم دربارهٔ جهان استدلالهای پیچیدهتری انجام دهیم.
- نفی (¬) ارزشِ حقیقتِ گزاره را معکوس میکند.
مثلاً اگر P: باران میبارد باشد، آنگاه ¬P یعنی: «باران نمیبارد.
جدولهای حقیقت (Truth Tables) برای بررسی همهٔ حالتهای ممکنِ درست یا نادرست بودن گزارهها بهکار میروند. این ابزار کمک میکند ارزشهای حقیقتِ گزارهها را هنگام استفاده از اتصالدهندههای مختلف بهتر درک کنیم.
برای نمونه، اولین جدول حقیقت ما به شکل زیر است:

و (∧)
علامت And یا همان ∧ دو گزاره را به هم وصل میکند. هنگامی که دو گزاره P و Q با ∧ به هم متصل شوند، حاصلِ P ∧ Q فقط زمانی درست است که هر دو گزارهٔ P و Q درست باشند.

یا (∨)
Or زمانی درست است که حداقل یکی از گزارههایش درست باشد.
یعنی برای درست بودن P ∨ Q، کافی است یکی از P یا Q درست باشد.

یا فراگیر و یا انحصاری
دو نوع «یا» وجود دارد:
- یا فراگیر (Inclusive Or): اگر P یا Q درست باشد—یا هر دو—گزاره درست است.
- یا انحصاری (Exclusive Or) یا XOR : اگر هر دو P و Q درست باشند، گزاره نادرست میشود. فقط یکی باید درست باشد.
مثال برای یا فراگیر:
«برای اینکه دسر بخوری، باید اتاقت را تمیز کنی یا چمن را کوتاه کنی.»
اگر هر دو کار را انجام دهی هم باز دسر را میگیری.
مثال برای یا انحصاری:
«برای دسر میتوانی یا کلوچه بخوری یا بستنی.»
اینجا نمیتوانی هر دو را بخوری.
نماد رایج برای یا انحصاری: ⊕ است.
شرطی (→)
Implication یا «اگر … آنگاه …» رابطهای بین دو گزاره است.
اگر P: باران میبارد و Q: من داخل خانه هستم.
آنگاه P → Q یعنی: «اگر باران میبارد، پس من داخل خانهام».
- P پیششرط (antecedent) نامیده میشود
- Q نتیجه (consequent)
قواعد ارزش truth آن:
- اگر P درست باشد و Q درست باشد → جمله درست است.
- اگر P درست باشد و Q نادرست باشد → جمله نادرست است.
- اگر P نادرست باشد → جمله همیشه درست است؛ به این میگویند «درستِ بدیهی» (trivially true).
این بخش گاهی گیجکننده است:
اگر پیششرط (P) نادرست باشد، جملهٔ شرطی هیچ اطلاعاتی دربارهٔ Q به ما نمیدهد.

دوشرطی (↔)
Biconditional یا ↔ یعنی «اگر و تنها اگر».
عبارت P ↔ Q برابر است با دو شرطی در هر دو جهت:
- P → Q
- Q → P
مثلاً اگرP :باران میبارد و Q : »من داخل خانه هستم«،
آنگاه P ↔ Q یعنی:
- اگر باران میبارد، من داخل هستم.
- و اگر من داخل هستم، باران میبارد.
در این حالت، اگر P نادرست باشد (باران نبارد)، Q هم باید نادرست باشد (من داخل نیستم).
مدل (Model)
مدل ،اختصاص ارزشِ حقیقت به هر گزاره است.
مثلاً:
اگر P: »باران میبارد« و Q: »امروز سهشنبه است. «
یک مدل میتواند این باشد:
{P = True, Q = False}
یعنی: باران میبارد، اما امروز سهشنبه نیست.
تعداد مدلهای ممکن برابر است با:
در مثال بالا ۲ گزاره داریم .4 =2² مدل ممکن.
پایگاه دانش (Knowledge Base – KB)
پایگاه دانش مجموعهای از جملههایی است که یک عامل مبتنی بر دانش میداند. این جملهها به صورت منطق گزارهای تعریف میشوند و هوش مصنوعی میتواند بر اساس آنها نتیجهگیری کند.
استلزام (⊨)
اگر α ⊨ β یعنی:
در هر دنیایی که α درست باشد، β نیز درست است.
مثلاً:
α : سهشنبهای در ماه ژانویه است.
: β ژانویه است.
پس α ⊨ β.
تفاوت مهم:
- (→) Implication یک نماد منطقی بین دو گزاره است.
- Entailment (⊨) یک رابطهٔ معنایی است: هرچه α بگوید درست باشد، β هم باید درست باشد.
استنتاج (Inference)
استنتاج یعنی تولید جملههای جدید از جملههای قبلی.
در مثال هری پاتر، جملههای ۵ و ۴ از ۳ و۲ و۱ استنتاج شدند.
یکی از روشهای استنتاج: بررسی مدل (Model Checking).
بررسی مدل (Model Checking)
برای اینکه بفهمیم آیا KB ⊨ α است یا نه، باید:
- همهٔ مدلهای ممکن را فهرست کنیم.
- اگر در هر مدلی که KB درست باشد، α نیز درست بود → آنگاه KB α را مستلزم میشود.
مثال هوش مصنوعی CS50 s1:
P: امروز سهشنبه است.
Q: باران میبارد.
R: هری برای دویدن بیرون میرود.
KB: (P ∧ ¬Q) → R
یعنی: اگر سهشنبه باشد و باران نبارد، هری میدود.
دانش KB:
- P درست است
- Q نادرست است → پس ¬Q درست است
پرسش:
آیا میتوان نتیجه گرفت R درست است؟
(KB ⊨ R ?)
برای پاسخ باید همهٔ مدلهای ممکن را بررسی کنیم

در مثال زیر داریم:
P: امروز سهشنبه است.
Q: باران میبارد.
R: هری برای دویدن میرود.
پایگاه دانش (KB):
(P∧¬Q)→R(P ∧ ¬Q) → R(P∧¬Q)→R
به عبارت دیگر: اگر P درست باشد و Q نادرست، آنگاه R برقرار است.
اطلاعاتی که داریم:
P درست است.
¬Q یعنی Q نادرست است.
پرسش:
R؟ — میخواهیم بدانیم آیا R درست است یا نه؛ یعنی آیا KB نتیجه میدهد که R برقرار است یا خیر
؟KB ⊨ R
برای پاسخ دادن به پرسش با الگوریتم بررسی مدلها (Model Checking)، همهٔ مدلهای ممکن را بررسی میکنیم.


سپس تمام مدلها را یکبهیک بررسی میکنیم تا ببینیم با توجه به پایگاه دانش (KB) درست هستند یا نه.
ابتدا، در پایگاه دانش میدانیم که P درست است.
بنابراین، میتوانیم بگوییم در هر مدلی که P نادرست باشد، پایگاه دانش نادرست است و آن مدل را کنار میگذاریم.

سپس، بهطور مشابه، در پایگاه دانش میدانیم که Q نادرست است.
بنابراین، میتوانیم بگوییم در هر مدلی که Q درست باشد، پایگاه دانش نادرست است و آن مدل را کنار میگذاریم.


در نهایت، دو مدل برایمان باقی میماند.
در هر دوی آنها P درست و Q نادرست است.
در یکی از مدلها R درست است و در مدل دیگر R نادرست.
به دلیل وجود جملهٔ (P ∧ ¬Q) → R در پایگاه دانش، میدانیم هرگاه P درست و Q نادرست باشد، R باید درست باشد.
بنابراین، میگوییم مدلِی که در آن R نادرست است با پایگاه دانش سازگار نیست و پایگاه دانش در آن مدل نادرست است.
و مدلِی که در آن R درست است با پایگاه دانش سازگار است و پایگاه دانش در آن مدل درست است.

با نگاه کردن به این جدول، فقط یک مدل وجود دارد که در آن پایگاه دانش ما درست است.
در آن مدل، میبینیم که R نیز درست است.
بر اساس تعریف نتیجهگیری (entailment)، اگر R در تمام مدلهایی که KB در آنها درست است، درست باشد، آنگاه
KB ⊨ R برقرار است.
حال، بیایید ببینیم دانش و منطق چگونه میتوانند در قالب کد نمایش داده شوند.
from logic import *
# Create new classes, each having a name, or a symbol, representing each proposition.
rain = Symbol("rain") # It is raining.
hagrid = Symbol("hagrid") # Harry visited Hagrid
dumbledore = Symbol("dumbledore") # هری به دامبلدور سر زده است
# ذخیرهٔ گزارهها در پایگاه دانش (KB)
knowledge = And( # از عملگر «و» (And) استفاده میکنیم چون هر گزاره یک جملهی مستقل در KB است
Implication(Not(rain), hagrid), # اگر باران نبارد → هری به هاگرید سر میزند
Or(hagrid, dumbledore), # هری یا به هاگرید رفته یا به دامبلدور
Not(And(hagrid, dumbledore)), # هری نمیتواند همزمان به هر دو رفته باشد
dumbledore # هری به دامبلدور سر زده است
)
برای اجرای الگوریتم بررسی مدلها (Model Checking)، اطلاعات زیر لازم است:
- پایگاه دانش (Knowledge Base): که برای نتیجهگیری استفاده میشود.
- پرسش (Query): گزارهای که میخواهیم ببینیم آیا از پایگاه دانش استنتاج میشود یا خیر.
- نمادها (Symbols): لیستی از تمام نمادها یا گزارههای اتمی که استفاده شدهاند (در مثال ما، اینها hagride وDumbledore هستند)
- مدل (Model): تخصیص مقادیر درست و نادرست به نمادها.
def check_all(knowledge, query, symbols, model):
"""
الگوریتم بررسی مدلها:
بررسی میکند که آیا query در تمام مدلهایی که knowledge درست است،
نیز درست است یا خیر.
knowledge: پایگاه دانش (KB)
query: گزارهای که میخواهیم بررسی کنیم
symbols: لیست نمادهای باقیمانده
model: مدل فعلی (تخصیص درست/نادرست به نمادها)
"""
# اگر همه نمادها در مدل تخصیص داده شدهاند
if not symbols:
# اگر پایگاه دانش در این مدل درست باشد، باید query هم درست باشد
if knowledge.evaluate(model):
return query.evaluate(model)
# اگر پایگاه دانش در این مدل درست نباشد، تاثیری بر نتیجه entailment ندارد
return True
else:
# انتخاب یکی از نمادهای باقیمانده
remaining = symbols.copy()
p = remaining.pop()
# ایجاد مدلی که نماد p درست باشد
model_true = model.copy()
model_true[p] = True
# ایجاد مدلی که نماد p نادرست باشد
model_false = model.copy()
model_false[p] = False
# بررسی بازگشتی برای هر دو حالت و اطمینان از صحت entailment
return (check_all(knowledge, query, remaining, model_true) and
check_all(knowledge, query, remaining, model_false))
توجه داشته باشید که ما تنها به مدلهایی علاقهمندیم که در آنها پایگاه دانش (KB) درست است. اگر KB نادرست باشد، شرایطی که میدانیم درست هستند در این مدلها برقرار نیستند و بنابراین برای ما بیاهمیت هستند.
هوش مصنوعی CS50 s1 — مثالی خارج از درس:
فرض کنید:
- P: هری نقش جستجوگر (seeker) را بازی میکند
- Q: اولیور نقش دروازهبان (keeper) را بازی میکند
- R: گریفیندور برنده میشود
پایگاه دانش ما مشخص میکند که R→ (P ∧ Q) به عبارت دیگر:
- میدانیم P درست است، یعنی هری جستجوگر بازی میکند.
- میدانیم Q درست است، یعنی اولیور دروازهبان بازی میکند.
- و اگر هر دو P و Q درست باشند، آنگاه R درست است، یعنی گریفیندور برنده مسابقه میشود.
حالا فرض کنید مدلی وجود دارد که هری به جای جستجوگر، نقش ضربهزننده (beater) را بازی کرده باشد (پس P نادرست است ¬P )
در این حالت، برای ما اهمیتی ندارد که آیا گریفیندور برنده شد یا نه )R درست است یا نادرست(، چون پایگاه دانش ما میگوید هری جستجوگر بازی کرده است و نه ضربه زننده. ما تنها به مدلهایی علاقهمندیم که در آنها P و Q درست هستند.
علاوه بر این، تابع check all به صورت بازگشتی عمل میکند.
یعنی:
- یک نماد را انتخاب میکند.
- دو مدل ایجاد میکند: در یکی این نماد درست است و در دیگری نادرست.
- سپس دوباره خودش را با این دو مدل فراخوانی میکند، که فقط با تخصیص درست/نادرست این نماد متفاوت هستند.
- این فرآیند ادامه مییابد تا تمام نمادها در مدلها تخصیص داده شوند و لیست symbols خالی شود.
- وقتی لیست خالی شد (خط if not symbols)، در هر نمونه از تابع (که هر کدام یک مدل متفاوت دارند)، بررسی میشود که آیا KB در آن مدل درست است یا خیر. اگر KB درست باشد، بررسی میشود که query هم درست باشد یا خیر، همانطور که قبلاً توضیح داده شد.
مهندسی دانش (Knowledge Engineering)
مهندسی دانش فرآیندی است برای تعیین اینکه چگونه گزارهها و منطق را در هوش مصنوعی نمایش دهیم.
بیایید مهندسی دانش را با بازی Clue تمرین کنیم.
در این بازی، یک قتل توسط یک نفر با یک ابزار در یک مکان انجام شده است. افراد، ابزارها و مکانها با کارتها نمایش داده میشوند. یک کارت از هر دسته به صورت تصادفی انتخاب شده و در پاکتی قرار میگیرد و هدف بازیکنان این است که بفهمند چه کسی قاتل است. بازیکنان با دیدن کارتها و استنتاج از آنها، تلاش میکنند محتوای پاکت را حدس بزنند.
ما از الگوریتم Model Checking که پیشتر معرفی شد برای کشف این راز استفاده میکنیم.
- در مدل ما، آیتمهایی که میدانیم با قتل مرتبط هستند True و سایر موارد False علامتگذاری میشوند.
برای مثال، فرض کنید:
-
سه نفر: Mustard، Plum و Scarlet
-
سه ابزار: چاقو (knife)، هفتتیر (revolver) و آچار (wrench)
-
سه مکان: سالن رقص (ballroom)، آشپزخانه (kitchen) و کتابخانه (library)
میتوانیم پایگاه دانش خود را با افزودن قوانین بازی بسازیم:
- میدانیم یک نفر قاتل است، یک ابزار استفاده شده و قتل در یک مکان رخ داده است.
- این موضوع در منطق گزارهای به شکل زیر نمایش داده میشود:
(Mustard ∨ Plum ∨ Scarlet)
(knife ∨ revolver ∨ wrench)
(ballroom ∨ kitchen ∨ library)
- بازی با این شروع میشود که هر بازیکن یک نفر، یک ابزار و یک مکان را میبیند و بنابراین میداند که اینها با قتل مرتبط نیستند. بازیکنان این اطلاعات را با دیگران به اشتراک نمیگذارند.
فرض کنید بازیکن ما کارتهای Mustard، kitchen و revolver را دارد.
- پس ما میدانیم اینها با قتل مرتبط نیستند و میتوانیم به پایگاه دانش خود اضافه کنیم:
¬Mustard
¬kitchen
- در سایر وضعیتها در بازی، بازیکن میتواند حدس بزند و یک ترکیب از فرد، ابزار و مکان را پیشنهاد دهد.
- فرض کنید حدس زده شود که Scarlet با آچار (wrench) قتل را در کتابخانه (library) انجام داده است.
اگر این حدس اشتباه باشد، میتوان استنتاج زیر را انجام داد و به پایگاه دانش اضافه کرد:
(¬Scarlet ∨ ¬library ∨ ¬wrench)
حالا فرض کنید کسی به ما کارت Plum را نشان دهد.
در این صورت میتوانیم این را به KB اضافه کنیم:
¬Plum
در این مرحله، میتوان نتیجه گرفت که قاتل Scarlet است، زیرا باید یکی از Mustard، Plum یا Scarlet باشد و شواهد نشان میدهد که دو نفر اول نیستند.
اگر تنها یک قطعه اطلاعات دیگر اضافه کنیم، برای مثال قتل در سالن رقص (ballroom) نبوده است، میتوانیم اطلاعات بیشتری به دست آوریم:
¬ballroom
حالا با استفاده از دادههای قبلی میتوان استنتاج کرد که Scarlet با چاقو (knife) در کتابخانه قتل را انجام داده است.
میدانیم مکان باید یکی از سالن رقص، آشپزخانه یا کتابخانه باشد و دو مکان اول رد شدهاند، پس مکان کتابخانه است.
حدس قبلی Scarlet، library، wrench اشتباه بوده است، پس حداقل یکی از این سه عنصر نادرست است.
چون میدانیم Scarlet و library درست هستند، بنابراین ابزار اشتباه آچار (wrench) بوده است.
از آنجا که یکی از سه ابزار باید درست باشد و نه آچار و نه هفتتیر (revolver)، نتیجه میگیریم ابزار چاقو (knife) است.
مقالات هوش مصنوعی CS50’s1:نحوه اضافه کردن این اطلاعات به پایگاه دانش در پایتون:
# اضافه کردن اطلاعات مشاهده شده
knowledge.add(Not(Mustard)) # Mustard قاتل نیست
knowledge.add(Not(Plum)) # Plum قاتل نیست
knowledge.add(Not(ballroom)) # قتل در سالن رقص نبوده است
knowledge.add(Or(Not(Scarlet), Not(library), Not(wrench))) # حدس اشتباه است
# نتیجهگیری نهایی با Model Checking:
# قاتل: Scarlet
# مکان: library
# ابزار: knife
نمونه کد:
# افزودن سرنخها به پایگاه دانش (KB)
knowledge = And(
# شرایط اولیه بازی: باید یکی از آیتمها در هر دسته درست باشد
Or(mustard, plum, scarlet), # یک نفر قاتل است
Or(ballroom, kitchen, library), # یک مکان قتل وجود دارد
Or(knife, revolver, wrench), # یک ابزار استفاده شده است
# اطلاعات کارتهای اولیه که دیدهایم
Not(mustard), # Mustard قاتل نیست
Not(kitchen), # قتل در آشپزخانه رخ نداده است
Not(revolver), # ابزار قتل هفتتیر نبوده است
# حدسی که کسی زده: Scarlet با آچار در کتابخانه
Or(Not(scarlet), Not(library), Not(wrench)),
# کارتهایی که به ما نشان داده شدهاند
Not(plum), # Plum قاتل نیست
Not(ballroom) # قتل در سالن رقص رخ نداده است)

میتوانیم سایر معماهای منطقی را نیز بررسی کنیم.
هوش مصنوعی CS50 s1 – مثال:
- چهار نفر مختلف، Gil Deroy، Pomona، Minerva و Horace، به چهار خانهٔ متفاوت یعنی Gryffindor، Hufflepuff، Ravenclaw و Slytherin اختصاص داده شدهاند. هر خانه دقیقاً یک نفر دارد.
نمایش شرایط این معما در منطق گزارهای (propositional logic) کمی پیچیده است:
هر تخصیص ممکن باید یک گزاره مستقل باشد:
Minerva Gryffindor, Minerva Hufflepuff, Minerva Ravenclaw, Minerva Slytherin, Pomona Gryffindor, …
- برای نمایش اینکه هر نفر به یکی از خانهها تعلق دارد، باید از یک عبارت OR(یا)، استفاده کنیم که همهٔ تخصیصهای ممکن برای هر نفر را شامل شود:
(Minerva Gryffindor ∨ Minerva Hufflepuff ∨ Minerva Ravenclaw ∨ Minerva Slytherin)
این کار برای هر نفر تکرار میشود.
- برای نمایش اینکه اگر یک نفر به یک خانه اختصاص داده شود، نمیتواند به خانههای دیگر تعلق داشته باشد، باید عباراتی مانند زیر بنویسیم:
(Minerva Gryffindor → ¬Minerva Hufflepuff) ∧ (Minerva Gryffindor → ¬Minerva Ravenclaw) ∧ (Minerva Gryffindor → ¬Minerva Slytherin) ∧(Minerva Hufflepuff → ¬Minerva Gryffindor) ∧ …
و این کار برای همهٔ خانهها و همهٔ افراد انجام میشود.
- راهحل بهینهتر برای این پیچیدگی در بخش منطق مرتبه اول (first-order logic) ارائه شده است.
با این حال، این نوع معما همچنان با منطق گزارهای نیز قابل حل است، به شرط اینکه سرنخهای کافی موجود باشد.
هوش مصنوعی CS50 s1 – مثال دیگر:
نوع دیگری از معما که با منطق گزارهای قابل حل است، بازی Mastermind است.
در این بازی، بازیکن اول رنگها را به ترتیب خاصی قرار میدهد.
بازیکن دوم باید ترتیب درست را حدس بزند.
در هر دور، بازیکن دوم یک حدس میزند و بازیکن اول یک عدد برمیگرداند که نشان میدهد چند رنگ در حدس درست بوده است.
فرض کنید یک بازی با چهار رنگ شبیهسازی کنیم و بازیکن دوم ترتیب زیر را پیشنهاد دهد:

- بازیکن اول پاسخ میدهد «دو». بنابراین میدانیم که دو تا از رنگها در جای درست قرار دارند و دو رنگ دیگر در جای نادرست هستند. بر اساس این اطلاعات، بازیکن دوم تلاش میکند جای دو رنگ را با هم عوض کند.

- اکنون بازیکن اول پاسخ میدهد «صفر». بنابراین بازیکن دوم میفهمد که رنگهایی که جابهجا کرده بود، در ابتدا در جای درست قرار داشتند. این یعنی دو رنگی که دستنخورده باقی مانده بودند، در جای نادرست بودهاند. پس بازیکن دوم آن دو رنگ را جابهجا میکند.

بازیکن اول میگوید «چهار» و بازی تمام میشود.
- برای بازنمایی این وضعیت در منطق گزارهای، لازم است به تعداد، ² (تعداد رنگها) گزارهٔ اتمیک داشته باشیم. پس در حالتی که چهار رنگ داریم، گزارههایی مانند red0، red1، red2، red3، blue0… خواهیم داشت که هر یک نشاندهندهٔ یک رنگ و یک موقعیت هستند.
- گام بعدی این است که قوانین بازی را در منطق گزارهای بازنمایی کنیم (اینکه در هر موقعیت فقط یک رنگ وجود دارد و هیچ رنگی تکرار نمیشود) و آنها را به پایگاه دانش (KB) اضافه کنیم. گام پایانی این است که سرنخها را نیز به پایگاه دانش بیفزاییم. در مثال ما، اضافه میکنیم که در حدس اول، دو موقعیت اشتباه و دو موقعیت درست بودهاند و در حدس دوم هیچ موقعیتی درست نبوده است. با استفاده از این اطلاعات، یک الگوریتم «بررسی مدل» (Model Checking) میتواند پاسخ معما را به دست آورد.
قواعد استنتاج
- الگوریتم Model Checking کارآمد نیست، زیرا باید تمام مدلهای ممکن را پیش از ارائهٔ پاسخ بررسی کند. (یادآوری: یک پرسش R زمانی درست است که در تمام مدلهایی که KB در آنها درست است، R نیز درست باشد.)
قواعد استنتاج به ما اجازه میدهند بدون بررسی تکتک مدلها، از دانش موجود اطلاعات جدید بهدست آوریم. - قواعد استنتاج معمولاً با یک خط افقی نمایش داده میشوند که بخش بالایی آن مقدمه (premise) و بخش پایینی آن نتیجه (conclusion) است. مقدمه دانشی است که در اختیار داریم، و نتیجه دانشی است که بر اساس مقدمه میتوان تولید کرد.

faLecture 1 – CS50’s 16
هوش مصنوعی CS50 s1 — در این مثال، فرض ما شامل گزارههای زیر است:
- اگر باران ببارد، هری داخل خانه است.
- باران میبارد.
بر اساس این فرضها، نتیجهی منطقی این است که:
- هری داخل خانه است.
قاعدهی استنتاجی که در این مثال استفاده میکنیم Modus Ponens نام دارد. این اصطلاح به زبان ساده یعنی: اگر یک جملهی شرطی داشته باشیم و بدانیم بخش اول آن درست است، پس بخش دوم آن هم درست خواهد بود.

faLecture 1 – CS50’s 17
حذف AND (And Elimination)
اگر یک گزارهی AND درست باشد، آنوقت هر یک از گزارههای ساده (اتمیک) درون آن نیز درست خواهد بود.
- برای مثال: اگر بدانیم «هری دوستِ ران و هرمیون است»، میتوانیم نتیجه بگیریم که «هری دوستِ هرمیون است».
- به زبان ساده: وقتی یک جملهی ترکیبی با و درست باشد، هر بخش جداگانهی آن هم درست است.

faLecture 1 – CS50’s 18
حذف نقیض مضاعف (Double Negation Elimination)
یک گزارهای که دوبار نقیض (منفی) شده باشد، در واقع درست است.
برای مثال، گزارهی زیر را در نظر بگیرید: «درست نیست که هری در امتحان قبول نشده است.»
میتوان آن را اینطور تجزیه کرد:
- » درست نیست که (هری قبول نشده است) «
- یا به زبان نمادین: ¬(هری قبول نشده است)
- و در نهایت: ¬(¬(هری قبول شده است))
این دو نقیض یکدیگر را خنثی میکنند و نتیجه این میشود که گزارهی «هری در امتحان قبول شده است» درست است

حذف گزارهی شرطی (Implication Elimination)
یک گزارهی شرطی معادل یک رابطهی «یا» بین نقیضِ بخش مقدم و بخش تالی است.
برای مثال: گزارهی «اگر باران ببارد، هری داخل خانه است» معادل گزارهی «یا باران نمیبارد، یا هری داخل خانه است» میباشد.
به زبان ساده: جملهی شرطی «اگر P آنگاه Q» را میتوان به صورت «(نه P) یا Q» نوشت.

این مورد کمی گیجکننده است
با این حال، اگر به جدول ارزش (Truth Table) نگاه کنیم، موضوع روشنتر میشود.
برای مثال، در مورد گزارهی شرطی P→Q:

- از آنجا که P→Q و P∨Q¬ دارای همان جدول ارزش هستند، میدانیم که از نظر منطقی معادلاند. راه دیگری برای فکر کردن به این موضوع این است که یک گزارهی شرطی زمانی درست است که یکی از دو حالت برقرار باشد:
- اگر مقدم (P) نادرست باشد، گزارهی شرطی بهطور بدیهی درست است. این حالت توسط نقیض مقدم در P∨Q¬P \lor Q¬ نشان داده میشود، یعنی اگر P نادرست باشد، کل گزاره همیشه درست است.
- اگر مقدم درست باشد، آنگاه گزارهی شرطی فقط زمانی درست است که تالی (Q) نیز درست باشد. یعنی اگر هم P و هم Q درست باشند، آنگاه
¬𝑃∨𝑄
درست است. اما اگر P درست باشد و Q نادرست، آنگاه
¬𝑃∨𝑄
نادرست خواهد بود.
حذف دوشرطی (Biconditional Elimination)
یک گزارهی دوشرطی معادل یک گزارهی شرطی و عکس آن با اتصال AND است.
برای مثال: «باران میبارد اگر و تنها اگر هری داخل خانه باشد» معادل است با:
«اگر باران ببارد، هری داخل خانه است»
و
«اگر هری داخل خانه باشد، باران میبارد».

قانون دمورگان (De Morgan’s Law)
میتوان یک گزارهی AND را به یک گزارهی OR تبدیل کرد.
برای مثال، گزارهی زیر را در نظر بگیرید: (درست نیست که هم هری و هم ران در امتحان قبول شدهاند.)
از این گزاره میتوان نتیجه گرفت: (یا درست نیست که هری در امتحان قبول شده است، یا درست نیست که ران در امتحان قبول شده است.)
یعنی برای اینکه گزارهی AND قبلی درست باشد، باید دستکم یکی از گزارههای OR درست باشد.
به زبان ساده: قانون دمورگان میگوید نقیضِ یک جملهی ترکیبی با «و» معادل است با جملهای که هر بخش آن جداگانه منفی شده و با «یا» به هم وصل شدهاند.

faLecture 1 – CS50’s 23
نتیجهگیری معکوس بر اساس قانون دمورگان
بهطور مشابه، میتوان نتیجهی معکوس را هم گرفت.
برای مثال، گزارهی «درست نیست که هری یا ران در امتحان قبول شدهاند» را در نظر بگیرید.
این گزاره را میتوان بازنویسی کرد به شکل: «هری در امتحان قبول نشده است» و «ران در امتحان قبول نشده است».
به زبان ساده: نقیضِ یک جملهی ترکیبی با «یا» معادل است با جملهای که هر بخش آن جداگانه منفی شده و با «و» به هم وصل شدهاند.

faLecture 1 – CS50’s 24
یک گزاره که شامل دو عنصر باشد و با اتصالهای و (AND) یا یا (OR) گروهبندی شده باشد، میتواند توزیع شود یا به واحدهای کوچکتر شامل AND و OR شکسته شود.
- به زبان ساده: خاصیت توزیع در منطق شبیه خاصیت توزیع در ریاضی است. مثلاً:
𝑃∧(𝑄∨𝑅)≡(𝑃∧𝑄)∨(𝑃∧𝑅)
- و همچنین:
𝑃∨(𝑄∧𝑅)≡(𝑃∨𝑄)∧(𝑃∨𝑅)
یعنی میتوان پرانتزها را باز کرد و گزارهها را به صورت ترکیبهای کوچکتر نوشت.

faLecture 1 – CS50’s 25

faLecture 1 – CS50’s 26
دانش و مسائل جستجو (Knowledge and Search Problems)
استنتاج را میتوان به عنوان یک مسئلهی جستجو در نظر گرفت که ویژگیهای زیر را دارد:
- وضعیت اولیه (Initial state): پایگاه دانش اولیه
- اعمال (Actions): قواعد استنتاج
- مدل انتقال (Transition model): پایگاه دانش جدید پس از اعمال استنتاج
- آزمون هدف (Goal test): بررسی اینکه آیا گزارهای که میخواهیم ثابت کنیم در پایگاه دانش وجود دارد یا نه
- تابع هزینه مسیر (Path cost function): تعداد گامهای لازم برای رسیدن به اثبات
این نشان میدهد که الگوریتمهای جستجو چقدر انعطافپذیر هستند و به ما اجازه میدهند با استفاده از قواعد استنتاج، اطلاعات جدیدی را بر اساس دانش موجود استخراج کنیم.
قاعدهی Resolution(حل یا رفع تناقض)
Resolution یک قاعدهی قدرتمند در استنتاج است که میگوید: اگر یکی از دو گزارهی اتمیک در یک جملهی OR نادرست باشد، دیگری باید درست باشد.
برای مثال:
- گزاره: «ران در سالن بزرگ است» یا «هرمیون در کتابخانه است»
- گزارهی دیگر: «ران در سالن بزرگ نیست»
از این دو گزاره میتوان نتیجه گرفت:
- «هرمیون در کتابخانه است»
تعریف رسمیتر
قاعدهی Resolution به طور رسمی بیان میکند که اگر یک جملهی OR داشته باشیم و یکی از اجزای آن نادرست باشد، آنگاه جزء دیگر باید درست باشد.

قاعدهی Resolution و ادبیات مکمل (Complementary Literals)
قاعدهی Resolution بر پایهی «ادبیات مکمل» بنا شده است؛ یعنی دو گزارهی یکسان که یکی نقیض شده و دیگری نقیض نشده است، مانند P و ¬P
تعمیم Resolution
این قاعده را میتوان کلیتر هم بیان کرد.
فرض کنید علاوه بر گزارهی:
- «ران در سالن بزرگ است» یا «هرمیون در کتابخانه است»
ما همچنین میدانیم:
- «ران در سالن بزرگ نیست» یا «هری خوابیده است»
با استفاده از قاعدهی Resolution میتوان نتیجه گرفت:
- «هرمیون در کتابخانه است» یا «هری خوابیده است»
مقالات هوش مصنوعی CS50 s1 بیان رسمیتر
به زبان رسمی، اگر دو گزارهی OR داشته باشیم که یکی شامل P و دیگری شامل ¬P باشد، میتوانیم آنها را ترکیب کرده و نتیجهای جدید به دست آوریم که شامل بقیهی اجزای OR است.
به زبان ساده: Resolution مثل حذف کردن بخشهای متناقض (مثل P و ( ¬P از دو جملهی OR است و نتیجهی ترکیب آنها یک جملهی OR جدید خواهد بود.

ادبیات مکمل و قاعدهی Resolution
ادبیات مکمل (Complementary Literals) به ما اجازه میدهند که از طریق قاعدهی Resolution جملات جدیدی تولید کنیم.
بنابراین، الگوریتمهای استنتاج با پیدا کردن این ادبیات مکمل میتوانند دانش تازهای به دست آورند.
به زبان ساده: وقتی یک گزاره و نقیض همان گزاره در دو جملهی مختلف وجود داشته باشد (مثل P و ¬P )میتوانیم آنها را ترکیب کنیم و جملهی جدیدی بسازیم که اطلاعات بیشتری به پایگاه دانش اضافه کند.
گزارهها و فرم نرمال همبندی (CNF)
گزارهی OR (یا): مجموعهای از گزارهها که با اتصال منطقی «یا» به هم وصل شدهاند، مثل 𝑃∨𝑄∨𝑅
گزارهی AND (و): مجموعهای از گزارهها که با اتصال منطقی «و» به هم وصل شدهاند، مثل 𝑃∧𝑄∧𝑅
بندها (Clauses): هر گزارهی منطقی را میتوان به فرم نرمال همبندی (CNF) تبدیل کرد؛ یعنی یک همبندی از بندها.
هوش مصنوعی CS50 s1 —مثال:
(𝐴∨𝐵∨𝐶)∧(𝐷∨¬𝐸)∧(𝐹∨𝐺)
مراحل تبدیل گزارهها به CNF
- حذف دوشرطیها:
(𝛼↔𝛽) را به (𝛼→𝛽)∧(𝛽→𝛼) تبدیل کنید.
- حذف شرطیها:
(𝛼→𝛽)را به ¬𝛼∨𝛽تبدیل کنید.
- حرکت دادن نقیض به داخل تا فقط گزارههای ساده منفی شوند (با استفاده از قوانین دمورگان).
هوش مصنوعی CS50 s1 —مثال:
¬(𝛼∧𝛽) تبدیل میشود به ¬𝛼∨¬𝛽
- استفاده از خاصیت توزیع برای باز کردن پرانتزها.
- مثال تبدیل(𝑃∨𝑄)→𝑅
- حذف شرطی ¬(𝑃∨𝑄)∨𝑅
- قانون دمورگان (¬𝑃∧¬𝑄)∨𝑅
- قانون توزیع (¬𝑃∨𝑅)∧(¬𝑄∨𝑅)
استنتاج با Resolution
- گاهی در روند استنتاج، یک بند شامل یک گزارهی تکراری میشود. در این حالت از Factoring استفاده میکنیم و گزارهی تکراری را حذف میکنیم.
برای مثال
(P ∨ Q ∨ S) ∧ (¬P ∨ R ∨ S) نتیجه می دهد (Q ∨ S ∨ R ∨ S).
با حذف موارد تکراری می رسیم به (Q ∨ R ∨ S)
اگر یک گزاره و نقیض آن (مثل P و P¬ را حل کنیم)، به بند خالی ()میرسیم. بند خالی همیشه نادرست است، چون امکان ندارد هم P و هم ¬P درست باشند.
اثبات با تناقض (Proof by Contradiction)
برای بررسی اینکه آیا KB⊨ α:
- بررسی میکنیم آیا (KB ∧¬α) تناقض دارد یا نه.
- اگر تناقض داشت، پس KB⊨α.
- اگر تناقضی نبود، نتیجهگیری نمیشود.
To determine if KB ⊨ α:
Check: is (KB ∧ ¬α) a contradiction?
If so, then KB ⊨ α.
Otherwise, no entailment.
اثبات با تناقض ابزاری است که در علوم کامپیوتر بسیار استفاده میشود. اگر پایگاه دانش (KB) ما درست باشد و با ¬α تناقض پیدا کند، این به معنای آن است که ¬α نادرست است و بنابراین α درست خواهد بود.
روند الگوریتمی
برای تعیین اینکه آیا KB⊨ α:
- عبارت (KB ∧ ¬α) را به فرم نرمال همبندی (CNF) تبدیل کنید.
- بررسی کنید که آیا میتوان با استفاده از قاعدهی Resolution بند جدیدی تولید کرد.
- اگر در نهایت به بند خالی ()برسیم (که معادل نادرست است)، تبریک! به تناقض رسیدهایم و بنابراین ثابت کردهایم که KB⊨ α.
- اگر تناقض به دست نیاید و دیگر نتوان بند جدیدی استنتاج کرد، آنگاه هیچ نتیجهگیری (entailment) وجود ندارد.
هوش مصنوعی CS50 s1 —مثال:
آیا
(A∨B)∧(¬B∨C)∧(¬C)
نتیجه میدهد که A درست است؟
- فرض میکنیم A نادرست است
(A∨B)∧(¬B∨C)∧(¬C)∧ (¬A)
- چون C نادرست است، برای درست بودن
(¬B∨C)(¬B ∨ C)
باید B¬ درست باشد.
- حالا چون B¬ درست است، برای درست بودن
(A∨B)(A ∨ B)،
باید A درست باشد.
- اکنون A و A ¬داریم → تناقض → پس A نتیجه میشود.
منطق مرتبه اول (First Order Logic)
- نمادهای ثابت (Constant Symbols): اشیاء یا افراد مثل Minerva، Gryffindor
- نمادهای معمولی (Predicate Symbols): مانند روابط یا توابع هستند که یک یا چند آرگومان میگیرند و مقدار درست یا نادرست برمیگردانند.
هوش مصنوعی CS50 s1 —مثال (پازل هاگوارتز)
فرض کنید در پازل مربوط به افراد و خانههای هاگوارتز هستیم:
- نمادهای ثابت: افراد یا خانهها، مثل Minerva، Pomona، Gryffindor، Hufflepuff.
- نمادهای معمولی: ویژگیها یا روابطی که برای نمادهای ثابت درست یا نادرست هستند.
برای نمونه:
- :Person(Minerva) مینروا یک شخص است.
- :House(Gryffindor) گریفیندور یک خانه است.
- :¬House(Minerva) مینروا یک خانه نیست.
- :BelongsTo(Minerva, Gryffindor) مینروا متعلق به گریفیندور است.
تفاوت با منطق گزارهای
در منطق گزارهای، برای هر ترکیب «شخص–خانه» باید یک نماد جداگانه تعریف شود. اما در منطق مرتبه اول، میتوانیم برای هر شخص و هر خانه یک نماد داشته باشیم و روابط را با محمولها بیان کنیم. این کار بسیار خلاصهتر و کارآمدتر است.

کمیتگذاری کلی (Universal Quantification)
کمیتگذاری ابزاری در منطق مرتبه اول است که به ما اجازه میدهد جملههایی را بدون استفاده از نماد ثابت خاص بیان کنیم.
کمیتگذاری کلی با نماد ∀ نمایش داده میشود و معنای آن «برای همه» است.
برای مثال، جملهی زیر:
∀x. BelongsTo(x, Gryffindor) → ¬BelongsTo(x, Hufflepuff)
بیان میکند که برای هر نماد x، اگر x متعلق به گریفیندور باشد، آنگاه متعلق به هافلپاف نیست.
توضیح ساده
این یعنی قانون کلی: هیچ فردی نمیتواند همزمان عضو گریفیندور و هافلپاف باشد.
کمیتگذاری وجودی (Existential Quantification)
کمیتگذاری وجودی مفهومی موازی با کمیتگذاری کلی است.
- در حالی که کمیتگذاری کلی (∀) جملههایی را بیان میکند که برای همهی x درست هستند،
- کمیتگذاری وجودی (∃) جملههایی را بیان میکند که برای حداقل یک x درست باشند.
نماد
کمیتگذاری وجودی با نماد ∃ نمایش داده میشود.
ترکیب کمیتگذاری کلی و وجودی
کمیتگذاری کلی (∀) و وجودی (∃) میتوانند در یک جمله با هم استفاده شوند.
هوش مصنوعی CS50 s1 مثال:
جملهی زیر:
∀x.Person(x)→(∃y.House(y)∧BelongsTo(x,y))∀x. Person(x) → (∃y. House(y) ∧ BelongsTo(x, y))
این جمله بیان میکند: برای هر x، اگر x یک شخص باشد، آنگاه دستکم یک y وجود دارد که یک خانه است و آن شخص به آن خانه تعلق دارد.
توضیح ساده
به زبان ساده: هر شخصی به یک خانه تعلق دارد.
این ترکیب قدرت منطق مرتبه اول را نشان میدهد، چون میتوانیم قوانین کلی (برای همه) و وجودی (برای دستکم یک مورد) را در یک جملهی واحد بیان کنیم.
هوش مصنوعی CS50 s1 مثال: دانشآموزان و کتابخانه
فرض کنید میخواهیم بگوییم: «هر دانشآموزی دستکم یک کتاب در کتابخانه دارد.»
به زبان منطق مرتبه اول:
∀x.Student(x)→(∃y.Book(y)∧Has(x,y))
توضیح ساده
- ∀x برای همهی افراد x
- اگرx یک دانشآموز باشد،
- آنگاه دستکم یک y وجود دارد که هم کتاب است و هم آن دانشآموز آن را دارد.
نتیجه
این جمله یک قانون کلی بیان میکند: همهی دانشآموزان حداقل یک کتاب دارند.


