Python ile AI - Mantık Programlama

Bu bölümde, mantık programlamaya ve Yapay Zekaya nasıl yardımcı olduğuna odaklanacağız.

Zaten mantığın doğru akıl yürütme ilkelerinin incelenmesi olduğunu veya basit bir deyişle, neyin ardından gelen şeyin incelenmesidir. Örneğin, iki ifade doğruysa, ondan herhangi bir üçüncü ifade çıkarabiliriz.

Konsept

Mantık Programlama, iki kelimenin, mantık ve programlamanın birleşimidir. Mantık Programlama, sorunların gerçekler ve kurallar olarak program ifadeleriyle ancak bir biçimsel mantık sistemi içinde ifade edildiği bir programlama paradigmasıdır. Tıpkı nesne yönelimli, işlevsel, bildirimsel ve prosedürel vb. Gibi diğer programlama paradigmaları gibi, programlamaya da yaklaşmanın belirli bir yoludur.

Mantık Programlamayla Sorunları Çözme

Mantık Programlama, sorunu çözmek için gerçekleri ve kuralları kullanır. Bu nedenle, Mantık Programlamanın yapı taşları olarak adlandırılırlar. Mantık programlamada her program için bir hedef belirlenmelidir. Mantık programlamada bir problemin nasıl çözülebileceğini anlamak için yapı taşlarını bilmemiz gerekir - Gerçekler ve Kurallar -

Gerçekler

Aslında, her mantık programının, verilen hedefe ulaşabilmesi için birlikte çalışması gereken gerçeklere ihtiyacı vardır. Gerçekler temelde program ve verilerle ilgili doğru ifadelerdir. Örneğin, Delhi Hindistan'ın başkentidir.

Kurallar

Aslında kurallar, sorun alanı hakkında sonuçlara varmamızı sağlayan kısıtlamalardır. Temelde çeşitli gerçekleri ifade etmek için mantıksal tümceler olarak yazılan kurallar. Örneğin, herhangi bir oyun geliştiriyorsak, tüm kurallar tanımlanmalıdır.

Mantık Programlamada herhangi bir sorunu çözmek için kurallar çok önemlidir. Kurallar, temelde gerçekleri ifade edebilen mantıksal sonuçlardır. Kuralın sözdizimi aşağıdadır -

A∶− B1, B2, ..., B n .

Burada, A kafadır ve B1, B2, ... Bn bedendir.

Örneğin - ata (X, Y): - baba (X, Y).

ata (X, Z): - baba (X, Y), ata (Y, Z).

Bu, her X ve Y için, eğer X, Y'nin babası ve Y, Z'nin bir atasıysa, X, Z'nin atasıdır. Her X ve Y için, X, Z'nin atasıdır, eğer X ise Y ve Y'nin babası, Z'nin atasıdır.

Yararlı Paketleri Kurmak

Python'da mantık programlamayı başlatmak için aşağıdaki iki paketi kurmamız gerekir -

Kanren

Bize iş mantığı için kod oluşturma yöntemimizi basitleştirmenin bir yolunu sağlar. Mantığı kurallar ve gerçekler açısından ifade etmemize izin verir. Aşağıdaki komut kanren'i kurmanıza yardımcı olacaktır -

pip install kanren

SymPy

SymPy, sembolik matematik için bir Python kütüphanesidir. Anlaşılabilir ve kolayca genişletilebilir olması için kodu olabildiğince basit tutarken tam özellikli bir bilgisayar cebir sistemi (CAS) olmayı amaçlamaktadır. Aşağıdaki komut SymPy'yi kurmanıza yardımcı olacaktır -

pip install sympy

Mantık Programlama Örnekleri

Mantıksal programlama ile çözülebilecek bazı örnekler aşağıdadır -

Matematiksel ifadeleri eşleştirme

Aslında bilinmeyen değerleri mantık programlamayı çok etkili bir şekilde kullanarak bulabiliriz. Aşağıdaki Python kodu, matematiksel bir ifadeyi eşleştirmenize yardımcı olacaktır -

Önce aşağıdaki paketleri içe aktarmayı düşünün -

from kanren import run, var, fact
from kanren.assoccomm import eq_assoccomm as eq
from kanren.assoccomm import commutative, associative

Kullanacağımız matematiksel işlemleri tanımlamamız gerekiyor -

add = 'add'
mul = 'mul'

Hem toplama hem de çarpma iletişimsel süreçlerdir. Dolayısıyla, bunu belirtmemiz gerekiyor ve bu şu şekilde yapılabilir -

fact(commutative, mul)
fact(commutative, add)
fact(associative, mul)
fact(associative, add)

Değişkenleri tanımlamak zorunludur; bu şu şekilde yapılabilir -

a, b = var('a'), var('b')

İfadeyi orijinal kalıpla eşleştirmemiz gerekiyor. Temelde (5 + a) * b - olan aşağıdaki orijinal kalıba sahibiz

Original_pattern = (mul, (add, 5, a), b)

Orijinal kalıpla eşleştirmek için aşağıdaki iki ifadeye sahibiz -

exp1 = (mul, 2, (add, 3, 1))
exp2 = (add,5,(mul,8,1))

Çıktı aşağıdaki komutla yazdırılabilir -

print(run(0, (a,b), eq(original_pattern, exp1)))
print(run(0, (a,b), eq(original_pattern, exp2)))

Bu kodu çalıştırdıktan sonra aşağıdaki çıktıyı alacağız -

((3,2))
()

İlk çıktı için değerleri temsil eder a ve b. İlk ifade, orijinal kalıpla eşleşti ve için değerleri döndürdüa ve b ancak ikinci ifade orijinal kalıpla eşleşmedi, dolayısıyla hiçbir şey döndürülmedi.

Asal Sayıların Kontrol Edilmesi

Mantıksal programlama yardımıyla, bir sayılar listesinden asal sayıları bulabilir ve ayrıca asal sayılar üretebiliriz. Aşağıda verilen Python kodu, bir sayı listesinden asal sayıyı bulacak ve ayrıca ilk 10 asal sayıyı üretecektir.

Önce aşağıdaki paketleri içe aktarmayı düşünelim -

from kanren import isvar, run, membero
from kanren.core import success, fail, goaleval, condeseq, eq, var
from sympy.ntheory.generate import prime, isprime
import itertools as it

Şimdi, verilen sayılara göre asal sayıları veri olarak kontrol edecek olan prime_check adında bir işlev tanımlayacağız.

def prime_check(x):
if isvar(x):
   return condeseq([(eq,x,p)] for p in map(prime, it.count(1)))
else:
   return success if isprime(x) else fail

Şimdi, kullanılacak bir değişken tanımlamamız gerekiyor -

x = var()
print((set(run(0,x,(membero,x,(12,14,15,19,20,21,22,23,29,30,41,44,52,62,65,85)),
(prime_check,x)))))
print((run(10,x,prime_check(x))))

Yukarıdaki kodun çıktısı aşağıdaki gibi olacaktır -

{19, 23, 29, 41}
(2, 3, 5, 7, 11, 13, 17, 19, 23, 29)

Puzzle çözmek

Mantık programlama, 8-bulmaca, Zebra bulmacası, Sudoku, N-kraliçe vb. Gibi birçok sorunu çözmek için kullanılabilir. Burada Zebra bulmacasının bir çeşidinin bir örneğini alıyoruz, aşağıdaki gibi -

There are five houses.
The English man lives in the red house.
The Swede has a dog.
The Dane drinks tea.
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.
In the yellow house they smoke 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.
In a house next to the house where they have a horse, they smoke Dunhill.
The man who smokes Blue Master drinks beer.
The German smokes Prince.
The Norwegian lives next to the blue house.
They drink water in a house next to the house where they smoke Blend.

Soru için çözüyoruz who owns zebra Python yardımıyla.

Gerekli paketleri ithal edelim -

from kanren import *
from kanren.core import lall
import time

Şimdi, iki işlevi tanımlamamız gerekiyor - left() ve next() kimin evinin kaldığını veya kimin evinin yanında olduğunu kontrol etmek için -

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)])

Şimdi, aşağıdaki gibi bir değişken ev ilan edeceğiz -

houses = var()

Kuralları lall paketi yardımıyla aşağıdaki gibi tanımlamamız gerekir.

5 ev var -

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)
)

Şimdi, çözücüyü önceki kısıtlamalarla çalıştırın -

solutions = run(0, houses, rules_zebraproblem)

Aşağıdaki kodun yardımıyla, çıktıyı çözücüden çıkarabiliriz -

output_zebra = [house for house in solutions[0] if 'zebra' in house][0][0]

Aşağıdaki kod, çözümün yazdırılmasına yardımcı olacaktır -

print ('\n'+ output_zebra + 'owns zebra.')

Yukarıdaki kodun çıktısı aşağıdaki gibi olacaktır -

German owns zebra.