Chúng ta đã biết rằng logic là nghiên cứu về các nguyên tắc suy luận đúng đắn hay nói một cách đơn giản, đó là nghiên cứu về cái gì đến sau cái gì. Ví dụ, nếu hai câu lệnh là đú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 sự 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 hì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 sự kiện và quy tắc để giải quyết vấn đề. Đó là lý do tại sao chúng được gọi là các khối xây dựng của Lập trình logic. Một mục tiêu cần được chỉ định cho mọi chương trình trong lập trình logic. Để hiểu cách giải quyết một vấn đề trong lập trình logic, chúng ta cần biết về các khối 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 sự 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 các 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 logic có thể diễn đạt các sự kiện. Sau đây là cú pháp của quy tắc –
A∶− B1,B2,…,B n .
Ở đây, A là phần đầu và B1, B2, … Bn là phần 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, thì 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 trong 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 ta thể hiện logic dưới dạng 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 tượng trư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ễ 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
Sau đây là một số ví dụ có thể được giải quyết bằng lập trình logic –
Nối 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ả. Mã Python sau đây 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à các quá trình giao tiếp. Do đó, chúng ta cần chỉ đị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 khớp biểu thức với mẫu ban đầu. Chúng ta có mẫu ban đầu sau, về cơ bản là (5+a)*b
Original_pattern = (mul, (add, 5, a), b)
Chúng tôi 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 đầu ra 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ị cho a 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 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ừ danh sách các số và cũng có thể tạo ra các số nguyên tố. Mã Python đưa ra dưới đây 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 gọi là prime_check hàm này 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 đang 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 câu hỏi ai sở hữu ngựa vằn 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 nhà của ai ở bên trá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 biến house 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 bộ 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 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. Xem thêm : AI với Python - Học không giám sát Phân cụm