آموزشمطالب ویژه

هوش مصنوعی با پایتون – بخش هفتم – برنامه‌نویسی منطقی

 

حل پازل (معما)

از برنامه‌نویسی منطقی می‌توان برای حل مسائل زیادی مانند معمای 8 یا پازل 8 ، پازل Zebra، سودوکو، مسئله n وزیر و غیره استفاده نمود. در اینجا ما از انواع مطرح‌شده برای پازل Zebra نمونه‌ای در نظر می‌گیریم که در ادامه می‌بینید. عبارت انگلیسی زیر را در نظر بگیرید:

 

There are five houses.                                             ( پنج خانه وجود دارد)

The English man lives in the red house.                           (مرد انگلیسی در خانه قرمز زندگی می‌کند)

The Swede has a dog.                         ( یک سگ دارد  Swede  )

The Dane drinks tea.                              ( چای می‌نوشد  Dane)

The green house is immediately to the left of the white house.

                                                           ( خانه سبز دقیقاً در سمت چپ خانه سفید قرارگرفته است)

They drink coffee in the green house.    (نوشیدنی قهوه در خانه سبز است)

The man who smokes Pall Mall has birds.                      ( می‌کشد پرنده دارد Pall Mall  مردی که سیگار)

In the yellow house they smoke Dunhill.                   (کشیده می‌شود Dunhill در خانه سبز سیگار)

In the middle house they drink milk.                                      (در خانه میانی نوشیدنی شیر مصرف می‌کنند)

The Norwegian lives in the first house.                                               (نروژی‌ها در خانه اول ساکن هستند)

The man who smokes Blend lives in the house next to the house with cats.

                                        (می‌کشد در خانه کناریِ خانه‌ای که چند گربه دارد ساکن است Blend مردی که سیگار)

In a house next to the house where they have a horse, they smoke Dunhill.

                                          (می‌کشند Dunhill در خانه کناریِ خانه‌ای که اسب دارند سیگار)

The man who smokes Blue Master drinks beer.

                                          (می‌کشد ماءالشعیر می‌نوشد Blue Master مردی که سیگار)

The German smokes Prince.                 (می‌کشند Prince آلمانی‌ها سیگار)

The Norwegian lives next to the blue house.                         (نروژی‌ها در خانه کناریِ خانه آبی ساکن هستند)

They drink water in a house next to the house where they smoke Blend.

                                                                              (می‌کشند، نوشیدنی آب مصرف می‌کنند Blend در خانه کناریِ خانه‌ای که سیگار)

ما این مسئله را برای یافتن پاسخ سؤال چه کسی صاحب Zebra است، حل می‎‌کنیم.

ابتدا پکیج‌های ضروری را وارد می‌کنیم:

from kanren import *

from kanren.core import lall

import time

حالا باید دو تابع تعریف کنیم: توابع left() و next() برای بررسی این‌که خانه چه کسی در کنار یا در سمت چپ خانه چه کسانی قرار دارد:

def left(q, p, list):

   return membero((q,p), zip(list, list[1:]))

def next(q, p, list):

   return conde([left(q, p, list)], [left(p, q, list)])

 

حالا متغیر houses را تعریف می‌کنیم:

houses = var()

 

ما باید قوانین را با کمک پکیج lall که در ادامه آمده است تعریف کنیم:

می‌دانیم 5 اسب وجود دارند، پس: (قوانین تمام جملات در کدهایی که در ادامه آمده است، نوشته‌شده‌اند: )

  rules_zebraproblem = lall(

   (eq, (var(), var(), var(), var(), var()), houses),

   (membero,(‘Englishman’, var(), var(), var(), ‘red’), houses),

   (membero,(‘Swede’, var(), var(), ‘dog’, var()), houses),

   (membero,(‘Dane’, var(), ‘tea’, var(), var()), houses),

   (left,(var(), var(), var(), var(), ‘green’),

   (var(), var(), var(), var(), ‘white’), houses),

   (membero,(var(), var(), ‘coffee’, var(), ‘green’), houses),

   (membero,(var(), ‘Pall Mall’, var(), ‘birds’, var()), houses),

   (membero,(var(), ‘Dunhill’, var(), var(), ‘yellow’), houses),

   (eq,(var(), var(), (var(), var(), ‘milk’, var(), var()), var(), var()), houses),

   (eq,((‘Norwegian’, var(), var(), var(), var()), var(), var(), var(), var()), houses),

   (next,(var(), ‘Blend’, var(), var(), var()),

   (var(), var(), var(), ‘cats’, var()), houses),

   (next,(var(), ‘Dunhill’, var(), var(), var()),

   (var(), var(), var(), ‘horse’, var()), houses),

   (membero,(var(), ‘Blue Master’, ‘beer’, var(), var()), houses),

   (membero,(‘German’, ‘Prince’, var(), var(), var()), houses),

   (next,(‘Norwegian’, var(), var(), var(), var()),

   (var(), var(), var(), var(), ‘blue’), houses),

   (next,(var(), ‘Blend’, var(), var(), var()),

   (var(), var(), ‘water’, var(), var()), houses),

   (membero,(var(), var(), var(), ‘zebra’, var()), houses)

)

 

حالا حل‌کننده[1] مسئله را با در نظر گرفتن محدودیت‌های قبلی اجرا می‌کنیم:

solutions = run(0, houses, rules_zebraproblem)

 

با کمک کد زیر می‌توانیم خروجی را از حل‌کننده استخراج کنیم:

output_zebra = [house for house in solutions[0] if ‘zebra’ in house][0][0]

 

کد زیر در چاپ راه‌حل کمک خواهد کرد:

print (‘\n’+ output_zebra + ‘owns zebra.’)

 

خروجی کد بالا در ادامه چاپ می‌شود:

German owns zebra.

 

 

قسمت‌های دیگر مقاله را از لینک‌های زیر بخوانید:

هوش مصنوعی با پایتون – بخش هفتم – برنامه‌نویسی منطقی (قسمت اول)

هوش مصنوعی با پایتون – بخش هفتم – برنامه‌نویسی منطقی (قسمت دوم)

هوش مصنوعی با پایتون – بخش هفتم – برنامه‌نویسی منطقی (قسمت سوم)

[1] Solver

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا