AI với Python - Lập trình logic
Trong chương này, chúng ta sẽ tập trung vào lập trình logic và nó giúp ích như thế nào trong Trí tuệ nhân tạo.
Chúng ta đã biết rằng logic là nghiên cứu các nguyên tắc của suy luận đúng đắn hay nói một cách đơn giản nó là nghiên cứu về cái gì xảy ra sau cái gì. Ví dụ, nếu hai câu lệnh đúng thì chúng ta có thể suy ra bất kỳ câu lệnh thứ ba nào từ nó.
Ý tưởng
Lập trình Logic là sự kết hợp của hai từ, logic và lập trình. Lập trình Logic là một mô hình lập trình trong đó các vấn đề được thể hiện dưới dạng các dữ kiện và quy tắc bằng các câu lệnh của chương trình nhưng trong một hệ thống logic chính thức. Cũng giống như các mô hình lập trình khác như hướng đối tượng, chức năng, khai báo và thủ tục, v.v., nó cũng là một cách cụ thể để tiếp cận lập trình.
Cách giải quyết vấn đề với lập trình logic
Lập trình Logic sử dụng các dữ kiện và quy tắc để giải quyết vấn đề. Đó là lý do tại sao chúng được gọi là khối xây dựng của Lập trình Logic. Một mục tiêu cần được xác định cho mọi chương trình trong lập trình logic. Để hiểu cách một vấn đề có thể được giải quyết trong lập trình logic, chúng ta cần biết về các nguyên tắc xây dựng - Sự kiện và Quy tắc -
Sự thật
Trên thực tế, mọi chương trình logic đều cần các dữ kiện để làm việc để nó có thể đạt được mục tiêu đã cho. Sự thật về cơ bản là những tuyên bố đúng về chương trình và dữ liệu. Ví dụ, Delhi là thủ đô của Ấn Độ.
Quy tắc
Trên thực tế, các quy tắc là những ràng buộc cho phép chúng ta đưa ra kết luận về miền vấn đề. Các quy tắc về cơ bản được viết dưới dạng mệnh đề logic để diễn đạt các sự kiện khác nhau. Ví dụ, nếu chúng ta đang xây dựng bất kỳ trò chơi nào thì tất cả các quy tắc phải được xác định.
Các quy tắc rất quan trọng để giải quyết bất kỳ vấn đề nào trong Lập trình Logic. Các quy tắc về cơ bản là kết luận hợp lý có thể thể hiện sự thật Sau đây là cú pháp của quy tắc:
A∶− B1, B2, ..., B n .
Ở đây, A là đầu và B1, B2, ... Bn là thân.
Ví dụ - tổ tiên (X, Y): - cha (X, Y).
tổ tiên (X, Z): - cha (X, Y), tổ tiên (Y, Z).
Điều này có thể được đọc là, với mọi X và Y, nếu X là cha của Y và Y là tổ tiên của Z, X là tổ tiên của Z. Với mọi X và Y, X là tổ tiên của Z, nếu X là cha của Y và Y là tổ tiên của Z.
Cài đặt các gói hữu ích
Để bắt đầu lập trình logic bằng Python, chúng ta cần cài đặt hai gói sau:
Kanren
Nó cung cấp cho chúng tôi một cách để đơn giản hóa cách chúng tôi tạo mã cho logic nghiệp vụ. Nó cho phép chúng tôi thể hiện logic về các quy tắc và sự kiện. Lệnh sau sẽ giúp bạn cài đặt kanren -
pip install kanren
SymPy
SymPy là một thư viện Python cho toán học biểu tượng. Nó nhằm mục đích trở thành một hệ thống đại số máy tính (CAS) đầy đủ tính năng trong khi vẫn giữ mã đơn giản nhất có thể để dễ hiểu và dễ dàng mở rộng. Lệnh sau sẽ giúp bạn cài đặt SymPy:
pip install sympy
Ví dụ về lập trình logic
Dưới đây là một số ví dụ có thể được giải quyết bằng lập trình logic -
Đối sánh các biểu thức toán học
Trên thực tế, chúng ta có thể tìm thấy các giá trị chưa biết bằng cách sử dụng lập trình logic một cách rất hiệu quả. Đoạn mã Python sau sẽ giúp bạn so khớp một biểu thức toán học:
Trước tiên, hãy xem xét việc nhập các gói sau:
from kanren import run, var, fact
from kanren.assoccomm import eq_assoccomm as eq
from kanren.assoccomm import commutative, associative
Chúng ta cần xác định các phép toán mà chúng ta sẽ sử dụng -
add = 'add'
mul = 'mul'
Cả phép cộng và phép nhân đều là quá trình giao tiếp. Do đó, chúng ta cần xác định nó và điều này có thể được thực hiện như sau:
fact(commutative, mul)
fact(commutative, add)
fact(associative, mul)
fact(associative, add)
Bắt buộc phải xác định các biến; điều này có thể được thực hiện như sau:
a, b = var('a'), var('b')
Chúng ta cần kết hợp biểu thức với mẫu ban đầu. Chúng ta có mẫu ban đầu sau đây, về cơ bản là (5 + a) * b -
Original_pattern = (mul, (add, 5, a), b)
Chúng ta có hai biểu thức sau để khớp với mẫu ban đầu:
exp1 = (mul, 2, (add, 3, 1))
exp2 = (add,5,(mul,8,1))
Đầu ra có thể được in bằng lệnh sau:
print(run(0, (a,b), eq(original_pattern, exp1)))
print(run(0, (a,b), eq(original_pattern, exp2)))
Sau khi chạy mã này, chúng ta sẽ nhận được kết quả sau:
((3,2))
()
Đầu ra đầu tiên đại diện cho các giá trị cho a và b. Biểu thức đầu tiên khớp với mẫu ban đầu và trả về các giá trị choa và b nhưng biểu thức thứ hai không khớp với mẫu ban đầu do đó không có gì được trả về.
Kiểm tra các số nguyên tố
Với sự trợ giúp của lập trình logic, chúng ta có thể tìm các số nguyên tố từ một danh sách các số và cũng có thể tạo ra các số nguyên tố. Mã Python đưa ra bên dưới sẽ tìm số nguyên tố từ danh sách các số và cũng sẽ tạo ra 10 số nguyên tố đầu tiên.
Trước tiên, chúng ta hãy xem xét việc nhập các gói sau:
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
Bây giờ, chúng ta sẽ định nghĩa một hàm có tên là prime_check sẽ kiểm tra các số nguyên tố dựa trên các số đã cho dưới dạng dữ liệu.
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
Bây giờ, chúng ta cần khai báo một biến sẽ được sử dụng:
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))))
Đầu ra của đoạn mã trên sẽ như sau:
{19, 23, 29, 41}
(2, 3, 5, 7, 11, 13, 17, 19, 23, 29)
Giải quyết câu đố
Lập trình logic có thể được sử dụng để giải quyết nhiều vấn đề như 8 câu đố, câu đố Zebra, Sudoku, N-queen, v.v. Ở đây chúng tôi lấy một ví dụ về một biến thể của câu đố Zebra như sau:
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.
Chúng tôi đang giải quyết nó cho câu hỏi who owns zebra với sự trợ giúp của Python.
Hãy để chúng tôi nhập các gói cần thiết -
from kanren import *
from kanren.core import lall
import time
Bây giờ, chúng ta cần xác định hai hàm - left() và next() để kiểm tra xem nhà còn lại hoặc bên cạnh nhà của ai -
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)])
Bây giờ, chúng ta sẽ khai báo một nhà biến như sau:
houses = var()
Chúng ta cần xác định các quy tắc với sự trợ giúp của gói lall như sau.
Có 5 ngôi nhà -
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)
)
Bây giờ, hãy chạy trình giải với các ràng buộc trước đó -
solutions = run(0, houses, rules_zebraproblem)
Với sự trợ giúp của đoạn mã sau, chúng ta có thể trích xuất đầu ra từ bộ giải:
output_zebra = [house for house in solutions[0] if 'zebra' in house][0][0]
Đoạn mã sau sẽ giúp in ra giải pháp:
print ('\n'+ output_zebra + 'owns zebra.')
Đầu ra của đoạn mã trên sẽ như sau:
German owns zebra.