Prolog như một công cụ quy tắc


Lý Hạnh Như
3 năm trước
Hữu ích 7 Chia sẻ Viết bình luận 0
Đã xem 6944

Tôi đã bị thách thức bởi trưởng nhóm của tôi trong công ty trước đây của tôi để tạo ra một mô-đun ứng dụng Java sẽ được tích hợp vào dự án POC hiện tại của chúng tôi để hoạt động như một công cụ quy tắc. Ý tưởng là có một mô-đun sẽ chứng minh nếu URL đã cho là độc hại, lành tính hoặc đáng ngờ được cung cấp tất cả thông tin liên quan đến URL như người đăng ký, vị trí IP, mẫu URL, v.v.

Tôi đã bắt đầu phát triển chính thức với các yêu cầu kinh doanh và khi tôi trải qua quá trình phát triển cố gắng mã hóa tất cả các điều kiện bằng cách sử dụng các câu lệnh if-other, tôi nhận ra rằng mã tôi đang viết sẽ không hiệu quả. Sau đó, tôi tự hỏi: "Điều gì sẽ xảy ra nếu có sự thay đổi đột ngột trong điều kiện cần phải thực hiện?" Điều đầu tiên tôi nghĩ đến là đưa ra những điều kiện có thể được ghi bên trong một tập tin hoặc cấu hình. Cuối cùng, tôi đã dừng sự phát triển ngay lúc đó và nghĩ về điều gì đó sẽ giải quyết vấn đề của mình.

Tôi bắt đầu tìm kiếm trên web và tìm đến các ứng dụng công cụ quy tắc hiện có như Drools và JRules, nhưng tôi đã do dự vì tôi không biết các công nghệ này hoạt động như thế nào và tôi thực sự muốn tạo ra những thứ phù hợp với yêu cầu của mình. Tôi biết rằng tôi không nên lặp lại chính mình (nguyên tắc DRY) khi làm những việc đã có sẵn, nhưng tôi muốn đưa ý tưởng của mình vào thử thách.

Prolog

Cuối cùng, tôi đã đến  Prolog , một ngôn ngữ lập trình logic đa mục đích liên quan đến trí tuệ nhân tạo và ngôn ngữ học tính toán. Logic chương trình được thể hiện dưới dạng quan hệ, được biểu diễn dưới dạng sự kiện và quy tắc.

Bây giờ chúng ta hãy cố gắng đưa ra một lời giải thích ngắn gọn về "sự thật" và "quy tắc" nghĩa là gì. Tôi sẽ cố gắng làm cho nó đơn giản để chúng tôi có thể biết được cách chúng tôi có thể sử dụng Prolog làm công cụ quy tắc.

Sự kiện

Các khoản có cơ thể trống rỗng được gọi là sự thật. Một ví dụ về một thực tế là:

domain("example.com").
ip("192.168.1.1").
registrant.email("sample@domain.com").
reputation.score(88).

Quy tắc

Một quy tắc có dạng:

Head :- Body.

Hãy thử tạo ra ba quy tắc của chúng tôi: độc hại, lành tính và đáng ngờ.

Chúng tôi có thể nói rằng một tên miền là độc hại nếu nó thuộc về người đăng ký sample@domain.com.

malicious :- registrant.email("sample@domain.com").

Chúng tôi có thể nói rằng một tên miền là lành tính nếu nó không thuộc về mẫu đăng ký sample@domain.com. Chúng tôi sử dụng phủ định ở đây. (Chúng tôi có thể thêm nhiều hơn vào cơ thể của quy tắc của mình để tăng sự tự tin về quy tắc của chúng tôi)

benign :- not(registrant.email("sample@domain.com")),reputation.score(SCORE),SCORE>70.

Chúng tôi có thể nói rằng một tên miền là đáng ngờ nếu tên miền không độc hại và không lành tính.

suspicious :- not(malicious),not(benign).

Bây giờ chúng tôi đã có sự thật và quy tắc của chúng tôi, bây giờ chúng tôi có thể tiến hành.

Tôi đang sử dụng IDE TuProlog để chúng tôi có thể kiểm tra các quy tắc của mình dựa trên các sự kiện được cung cấp.

Bạn có thể xem mã nguồn ở đây để bạn tham khảo. 

PS Xin lỗi vì mã hóa - điều này đã được tạo ra trong năm thứ hai trong sự nghiệp CNTT của tôi.

Hữu ích 7 Chia sẻ Viết bình luận 0
Đã xem 6944