24/05/2018, 21:05

Các ngôn ngữ lập trình thông minh

Hệ Prolog đầu tiên ra đời vào năm 1973 do Alain Colmerauer và nhóm trí tuệ nhân tạo thuộc Đại học tổng hợp Aix-Marseilie, Pháp xây dựng. Mục đích ban đầu của hệ này là dịch các ngôn ngữ tự nhiên. Năm 1977, David Warren thuộc Đại học tổng hợp Edinburgh đã ...

Hệ Prolog đầu tiên ra đời vào năm 1973 do Alain Colmerauer và nhóm trí tuệ nhân tạo thuộc Đại học tổng hợp Aix-Marseilie, Pháp xây dựng. Mục đích ban đầu của hệ này là dịch các ngôn ngữ tự nhiên. Năm 1977, David Warren thuộc Đại học tổng hợp Edinburgh đã cài đặt một phiên bản của Prolog, mang tên là Prolog-10. Năm 1981, người Nhật đã tiến bộ sử dụng Prolog như ngôn ngữ cơ bản cho máy tính thế hệ thứ năm. Hiện nay đã có nhiều hệ Prolog khác nhau về tốc độ, môi trường làm việc, ..., song phần lớn các hệ này tương thích với Prolog-10, Prolog-10 được công nhận như Prolog chuẩn.

Prolog đã được sử dụng như một công cụ phần mềm để phát triển các hệ thông minh. Nó đã được áp dụng trong nhiều lĩnh vực trí tuệ nhân tạo: giải quyết vấn đề, các hệ chuyên gia, biểu diễn tri thức, lập kế hoạch, xử lý ngôn ngữ tự nhiên, học máy, ...

Trong các ngôn ngữ lập trình truyền thống (chẳng hạn, Pascal, C, ...) một chương trình là một dãy các lệnh mà máy cần thực hiện. Người lập trình để viết một chương trình trong các ngôn ngữ truyền thống, phải dựa vào thuật toán đã có và cách biểu diễn dữ liệu để lập ra một dãy các lệnh chỉ dẫn cho máy cần phải thực hiện các hành động nào.

Điều khác nhau căn bản của lập trình Prolog so với lập trình truyền thống là:

• Trong Prolog người lập trình mô tả vấn đề bằng các câu trong logic.

• Hệ sẽ sử dụng lập luận logic để tìm ra các câu trả lời cho vấn đề.

Do đó một chương trình Prolog là sự đặc tả của một vấn đề. Vì lý do này Prolog là ngôn ngữ lập trình khai báo (declarative language). Trong Prolog, chỉ được phép sử dụng các câu Horn, tức là mỗi câu hoặc là câu phân tử, hoặc là một luật nếu - thì mà các điều kiện của luật và kết luận của luật đều là câu phân tử. Một chương trình Prolog gồm một dãy các luật có dạng:

A :- B1, ..., Bm

trong đó, m ≥ 0, A và Bi (i = 1, ..., m) là các câu phân tử. Luật trên được đọc là “A nếu B1 và ... và Bm”. Nó là cách viết trong Prolog của logic mênh đề sau:

B1 ∧…∧ Bm ⇒ A

Trong luật trên, A được gọi là đầu, danh sách các câu Bi (B1, ..., Bm) được gọi là thân của luật. Nếu m=0, ký hiệu “:-” sẽ được bỏ đi, khi đó ta có câu phân tử A và nó được gọi là một sự kiện.

Giả sử chúng ta biết các thông tin sau đây về An và Ba.

An yêu thích mọi môn thể thao mà cậu chơi.

Bóng đá là môn thể thao.

Bóng bàn là môn thể thao. An chơi bóng đá.

Ba yêu thích mọi thứ mà An yêu thích.

Các câu trên được chuyển thành một chương trình Prolog như sau likes(an, X) :- sport(X), plays(an, X)

sport(football).

sport(tennis).

plays(an, football).

likes(ba, Y) :- likes(an, Y).

Với chương trình Prolog trên (nó mô tả sở thích thể thao của An và Ba), ta có thể đặt ra các câu hỏi, chẳng hạn “An yêu thích cái gì ?”. Câu hỏi này được viết trong Prolog như sau.

? - likes(an, X).

Khi đưa vào một câu hỏi, hệ Prolog sẽ thực hiện quá trình suy diễn logic để tìm ra các câu trả lời cho câu hỏi. Chẳng hạn, với câu hỏi trên Prolog sẽ đưa ra câu trả lời:

X = football

điều đó có nghĩa là “An yêu thích bóng đá”. Một cách tổng quát, một câu hỏi có dạng ? - G1, ..., Gn.

trong đó, mỗi Gi (i = 1, ..., n) là một công thức phân tử, danh sách (G1, ..., Gn) được gọi là đích, các Gi (i = 1, ..., n) được gọi là đích con. Nếu n = 0, ta có đích rỗng, ký hiệu là Đến đây chúng ta muốn biết, làm thế nào mà Prolog tìm ra các câu trả lời cho các câu hỏi? Một chương trình Prolog có thể xem như một CSTT. Thủ tục tìm câu trả lời của Prolog là một cách cài đặt phương pháp lập luận lùi mà chúng ta đã trình bày ở mục 7.4. Trong cách cài đặt phương pháp lập luận lùi này, người ta sử dụng kỹ thuật tìm kiếm theo chiều sâu. Các câu trong Prolog được xét theo thứ tự từ trên xuống dưới. Các đích con được xem xét để thoả mãn theo thứ tự từ trái sang phải. Ngoài ra, thủ tục lập luận của Prolog còn cho phép người lập trình sử dụng vị từ “cut” khi cần thiết đảm bảo chương trình đúng đắn và hiệu quả.

Một đặc điểm nữa của Prolog là, thay cho việc sử dụng các câu là phủ định của các câu phân tử. Prolog đưa vào vị từ not biểu diễn phủ định như thất bại (negation as failure). Điều đó có nghĩa là not(P) được xem là đúng nếu ta thất bại trong việc tìm một chứng minh P đúng. Tức là, với CSTT hiện có, ta không tìm được một phép thay thế biến nào để P trở thành hệ quả logic của CSTT. Sau đây là một ví dụ sử dụng vị từ :

not. likes(an, X) :- animal(X), not(snaker(X)).

Bạn đọc muốn tìm hiểu sâu hơn về các kỹ thuật lập trình Prolog và các ứng dụng trong Trí tuệ nhân tạo, có thể tìm đọc các tài liệu [ ] và [ ].

CÂU HỎI VÀ BÀI TẬP

Cho {(a∧b)→c, (b∧c)→d, (a∧b)}. Hỏi d ?

Cho {p→q , q→r}. Hỏi p→r?

Cho {(a∧b)→c,(b∧c)→d,┐d}. Cm a→b ?

Cho{p∧q)→r , (p∧r)→s , p.q} Hỏi r ?..

Cụm từ {(p∧q) →r, ( q∧r) →s, ┐s} Hỏi p→ ┐q ?

Cho { ┐p v q , ┐q v r , ┐r v s, ┐u v ┐s} Hỏi ┐p,┐u

Cho{p→q , q→r , r→s , p} Hỏi p∧s?

Cho tập mênh đề:

a) Ông Tư ăn táo

b) Ông Tư ăn cam

c) Cam là thức ăn

d) Món ăn mà người ăn không chết (sống) gọi là thức ăn

e) Ông Tư đang sống

f) Hỏi táo có phải là thức ăn?

Hãy:

1. Dùng logic vi từ để mô tả các mệnh đề trên

2. Dùng thuật toán Havard (hoặc Robinson để giải.

Cho tập quan hệ (hàm) trong tam giác:

g) a/sinα= b/sinβ

h) c/sinγ= b/sinβ

i) S =

j) α+β+γ=π

k) S= hc*c

Hãy:

1. Dùng mạng ngữ nghĩa để mô tả các mối quan hệ giữa biến và hàm

2. Dùng thuật toán vết dầu loang để tìm lời giải

0