AI dengan Python - Pemrograman Logika

Dalam bab ini, kami akan memfokuskan pemrograman logika dan bagaimana hal itu membantu dalam Artificial Intelligence.

Kita sudah tahu bahwa logika adalah studi tentang prinsip-prinsip penalaran yang benar atau dengan kata sederhana itu adalah studi tentang apa yang muncul setelah apa. Misalnya, jika dua pernyataan benar maka kita dapat menyimpulkan pernyataan ketiga darinya.

Konsep

Pemrograman Logika adalah kombinasi dari dua kata, logika dan pemrograman. Pemrograman Logika adalah paradigma pemrograman di mana masalah dinyatakan sebagai fakta dan aturan oleh pernyataan program tetapi dalam sistem logika formal. Sama seperti paradigma pemrograman lain seperti berorientasi objek, fungsional, deklaratif, dan prosedural, dll., Ini juga merupakan cara tertentu untuk mendekati pemrograman.

Bagaimana Memecahkan Masalah dengan Pemrograman Logika

Pemrograman Logika menggunakan fakta dan aturan untuk memecahkan masalah. Itulah mengapa mereka disebut sebagai blok bangunan Pemrograman Logika. Tujuan perlu ditentukan untuk setiap program dalam pemrograman logika. Untuk memahami bagaimana suatu masalah dapat diselesaikan dalam pemrograman logika, kita perlu tahu tentang blok bangunan - Fakta dan Aturan -

Fakta

Sebenarnya, setiap program logika membutuhkan fakta untuk dikerjakan sehingga dapat mencapai tujuan yang diberikan. Fakta pada dasarnya adalah pernyataan yang benar tentang program dan data. Misalnya, Delhi adalah ibu kota India.

Aturan

Sebenarnya aturan adalah kendala yang memungkinkan kita untuk membuat kesimpulan tentang domain masalah. Aturan pada dasarnya ditulis sebagai klausa logis untuk mengungkapkan berbagai fakta. Misalnya, jika kita sedang membangun game apa pun, semua aturan harus ditentukan.

Aturan sangat penting untuk menyelesaikan masalah apa pun dalam Pemrograman Logika. Aturan pada dasarnya adalah kesimpulan logis yang dapat mengungkapkan fakta. Berikut ini adalah sintaks aturan -

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

Di sini, A adalah kepala dan B1, B2, ... Bn adalah badan.

Misalnya - leluhur (X, Y): - ayah (X, Y).

leluhur (X, Z): - ayah (X, Y), leluhur (Y, Z).

Ini dapat dibaca sebagai, untuk setiap X dan Y, jika X adalah ayah dari Y dan Y adalah nenek moyang Z, X adalah nenek moyang Z. Untuk setiap X dan Y, X adalah nenek moyang Z, jika X adalah ayah dari Y dan Y adalah nenek moyang dari Z.

Menginstal Paket Berguna

Untuk memulai pemrograman logika dengan Python, kita perlu menginstal dua paket berikut -

Kanren

Ini memberi kita cara untuk menyederhanakan cara kita membuat kode untuk logika bisnis. Ini memungkinkan kita mengungkapkan logika dalam hal aturan dan fakta. Perintah berikut akan membantu Anda menginstal kanren -

pip install kanren

SymPy

SymPy adalah pustaka Python untuk matematika simbolik. Ini bertujuan untuk menjadi sistem aljabar komputer (CAS) berfitur lengkap sambil menjaga kode sesederhana mungkin agar dapat dipahami dan mudah diperluas. Perintah berikut akan membantu Anda menginstal SymPy -

pip install sympy

Contoh Pemrograman Logika

Berikut adalah beberapa contoh yang dapat diselesaikan dengan pemrograman logika -

Mencocokkan ekspresi matematika

Sebenarnya kita dapat menemukan nilai yang tidak diketahui dengan menggunakan logika pemrograman dengan cara yang sangat efektif. Kode Python berikut akan membantu Anda mencocokkan ekspresi matematika -

Pertimbangkan untuk mengimpor paket berikut terlebih dahulu -

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

Kita perlu mendefinisikan operasi matematika yang akan kita gunakan -

add = 'add'
mul = 'mul'

Baik penjumlahan dan perkalian adalah proses komunikatif. Oleh karena itu, kita perlu menentukannya dan ini dapat dilakukan sebagai berikut -

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

Variabel wajib didefinisikan; ini dapat dilakukan sebagai berikut -

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

Kita perlu mencocokkan ekspresi dengan pola aslinya. Kami memiliki pola asli berikut, yang pada dasarnya (5 + a) * b -

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

Kami memiliki dua ekspresi berikut untuk dicocokkan dengan pola aslinya -

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

Output dapat dicetak dengan perintah berikut -

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

Setelah menjalankan kode ini, kita akan mendapatkan output berikut -

((3,2))
()

Keluaran pertama mewakili nilai untuk a dan b. Ekspresi pertama cocok dengan pola asli dan mengembalikan nilaia dan b tetapi ekspresi kedua tidak cocok dengan pola asli sehingga tidak ada yang dikembalikan.

Memeriksa Bilangan Prima

Dengan bantuan pemrograman logika, kita dapat menemukan bilangan prima dari daftar bilangan dan juga dapat menghasilkan bilangan prima. Kode Python yang diberikan di bawah ini akan mencari bilangan prima dari daftar bilangan dan juga akan menghasilkan 10 bilangan prima pertama.

Mari kita pertimbangkan untuk mengimpor paket-paket berikut -

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

Sekarang, kita akan mendefinisikan fungsi yang disebut prime_check yang akan memeriksa bilangan prima berdasarkan bilangan yang diberikan sebagai data.

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

Sekarang, kita perlu mendeklarasikan variabel yang akan digunakan -

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

Output dari kode di atas adalah sebagai berikut -

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

Memecahkan Puzzle

Pemrograman logika dapat digunakan untuk menyelesaikan banyak masalah seperti teka-teki 8, teka-teki Zebra, Sudoku, N-queen, dll. Di sini kita mengambil contoh varian dari teka-teki Zebra yaitu sebagai berikut -

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.

Kami sedang menyelesaikannya untuk pertanyaan itu who owns zebra dengan bantuan Python.

Mari kita impor paket yang diperlukan -

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

Sekarang, kita perlu mendefinisikan dua fungsi - left() dan next() untuk memeriksa rumah siapa yang tersisa atau di sebelah rumah siapa -

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

Sekarang, kita akan mendeklarasikan rumah variabel sebagai berikut -

houses = var()

Kita perlu mendefinisikan aturan dengan bantuan paket lall sebagai berikut.

Ada 5 rumah -

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

Sekarang, jalankan pemecah dengan batasan sebelumnya -

solutions = run(0, houses, rules_zebraproblem)

Dengan bantuan kode berikut, kita dapat mengekstrak output dari solver -

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

Kode berikut akan membantu mencetak solusi -

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

Output dari kode di atas adalah sebagai berikut -

German owns zebra.