Giáo trình Trí tuệ nhân tạo (Artificial Intelligence)
MỤC LỤC
Chương 1 – Giới thiệu .5
1. Trí tuệnhân tạo là gì? . 5
2. Lịch sử.6
3. Các lĩnh vực của AI . 7
4. Nội dung môn học. 9
Chương 2 – Bài toán và phương pháp tìm kiếm lời giải .10
1. Bài toán và các thành phần của bài toán . 10
2. Giải thuật tổng quát tìm kiếm lời giải. 14
3. Đánh giá giải thuật tìm kiếm. 17
4. Các giải thuật tìm kiếm không có thông tin phản hồi (tìm kiếm mù) . 18
Chương 3 –Các phương pháp tìm kiếm heuristic .25
1. Giải thuật tìm kiếm tốt nhất đầu tiên (best first search). 25
2. Các biến thểcủa giải thuật best first search. 28
3. Các giải thuật khác. 31
Chương 4 – Các giải thuật tìm kiếm lời giải cho trò chơi .37
1. Cây trò chơi đầy đủ. 37
2. Giải thuật Minimax . 39
3. Giải thuật Minimax với độsâu hạn chế. 41
4. Giải thuật Minimax với cắt tỉa alpha-beta . 44
Chương 5 – Các phương pháp tìm kiếm lời giải thỏa mãn các ràng buộc .47
1. Các bài toán thỏa mãn các ràng buộc. 47
2. Giải thuật quay lui vét cạn . 50
3. Các cải tiến của giải thuật quay lui . 51
4. Các giải thuật tối ưu địa phương. 54
Chương 6 – Các phương pháp lập luận trên logic mệnh đề.55
1. Lập luận và Logic . 55
2. Logic mệnh đề: cú pháp, ngữnghĩa. 55
3. Bài toán lập luận và các giải thuật lập luận trên logic mệnh đề. 58
4. Câu dạng chuẩn hội và luật phân giải . 60
5. Câu dạng Horn và tam đoạn luận. 63
6. Thuật toán suy diễn dựa trên bảng giá trịchân lý. 65
7. Thuật toán suy diễn dựa trên luật phân giải. 65
8. Thuật toán suy diễn tiến, lùi dựa trên các câu Horn . 67
9. Kết chương. 70
Chương 7 – Các phương pháp lập luận trên logic cấp một .72
1. Cú pháp – ngữnghĩa . 74
2. Lập luận trong logic vịtừcấp một. 78
3. Phép đồng nhất hai vịtừ, thuật giải đồng nhất . 80
4. Câu dạng chuẩn hội, luật phân giải tổng quát. 82
5. Câu dạng Horn và tam đoạn luận tổng quát trong logic cấp 1. 84
6. Giải thuật suy diễn phân giải . 86
7. Thuật toán suy diễn tiến dựa trên câu Horn. 89
8. Thuật toán suy diễn lùi dựa trên câu Horn. 91
Chương 8 – Prolog .92
1. Lập trình logic, môi trường lập trình SWI Prolog . 92
2. Ngôn ngữProlog cơbản, chương trình Prolog. 95
3. Câu truy vấn. 97
4. Vịtừphi logic (câu phi logic). 97
5. Trảlời truy vấn, quay lui, cắt, phủ định. 98
6. Vịtừ đệqui . 104
7. Cấu trúc dữliệu trong Prolog. 105
8. Thuật toán suy diễn trong Prolog. 106
Chương 9 – Lập luận với tri thức không chắc chắn. 107
Chương 10 – Học mạng nơron nhân tạo. 108
hiện đồng nhất câu truy vấn với các vị từ là phần đầu các luật theo thứ tự từ trên xuống dưới. Khi gặp luật có thể đồng nhất được, SWI Prolog sẽ thực hiện đồng nhất câu truy vấn với phần đầu của luật và thực hiện các lệnh trong phần thân của luật. Nếu tất cả các biến trong luật (sau khi đồng nhất) đều đã xác định được giá trị thì SWI Prolog sẽ trả về cho người dùng kết quả true và đợi tương tác với người dùng. Khi người dung muốn tìm kết quả tiếp theo, nhấn phím “;”, SWI Prolog sẽ chuyển sang tìm, đồng nhất và thực hiện các luật tiếp theo. Khi câu truy vấn đồng nhất được với một luật mà có một biến nào đó vẫn còn chưa xác định được giá trị, SWI Prolog sẽ hình thành các câu truy vấn mới là các vị từ còn chứa biến; sau đó thực hiện đệ qui việc tìm, đồng nhất và thực hiện các luật trong cơ sở tri thức theo thứ tự từ trên đối với các câu truy vấn trung gian này (đích trung gian). Việc thực hiện suy diễn lùi như thế này còn gọi là quay lui. Một điểm lưu ý nữa, sau khi tìm được luật đồng nhất với câu truy vấn, SWI Prolog sẽ thực hiện phần thân của luật theo thứ tự từ trái qua phải. Vì phần thân của luật có dạng hội các vị từ, nên khi thực hiện, nếu gặp một vị từ mà có giá trị chân lý là false thì SWI Prolog sẽ không thực hiện các vị từ sau đó. Vị từ Cắt (!): Khi thực hiện chương trình, SWI Prolog thực hiện từ trên xuống, từ trái qua phải, và chứng minh câu truy vấn bằng quay lui (lùi). Khi tìm được một lời giải của câu truy vấn, SWI Prolog sẽ thực hiện quay lui vét cạn để tìm lời giải tiếp theo. Trong trường hợp chúng ta chỉ cần tìm 1 lời giải, hoặc trong trường hợp chúng ta biết chắc chắn không có lời giải khi thực hiện quay lui, ta có thể đặt vị từ cắt (!) ở sau danh sách các vị từ mong muốn. Khi có vị từ cắt xuất hiện trong một câu thì SWI Prolog sẽ không thực hiện quay lui đối với các vị từ đặt trước nó. Để hiểu cơ chế ngắt quay lui của vị từ cắt (!), ta lấy ví dụ sau: a(X, Y) :- b(X), c(Y). a(4,4). b(1). b(2). b(3). c(1). c(2). c(3). Khi thực hiện truy vấn: 1 ?- a(X,Y). a(X, Y) :- b(X), c(Y). a(4,4). a(X,Y) b(X) c(Y) a(4,4) b(3) b(1) b(2) c(2) c(1) c(3) {X|1 thì được kết quả như sau: 1 ?- a(X,Y). X = 1, Y = 1 ; X = 1, Y = 2 ; X = 1, Y = 3 ; X = 2, Y = 1 ; X = 2, Y = 2 ; X = 2, Y = 3 ; X = 3, Y = 1 ; X = 3, Y = 2 ; X = 3, Y = 3. Bây giờ chúng ta sẽ thay thế câu lệnh đầu tiên trong chương trình a(X, Y) :- b(X), c(Y). bằng một trong các câu lệnh dưới đây (chèn vị từ ngắt ! vào các vị trí khác nhau): a(X, Y) :- !, b(X), c(Y). % không quay lui đối với vị từ a a(X, Y) :- b(X),!, c(Y). % không quay lui đối với vị từ a,b a(X, Y) :- b(X), c(Y),!. % không quay lui đối với vị từ a,b,c Và thực hiện lại câu truy vấn thì ta sẽ được các kết quả khác nhau như trong các hình vẽ sau. a(X, Y) :- !, b(X), c(Y). a(4,4). a(X,Y) b(X) c(Y) a(4,4) b(3) b(1) b(2) c(2) c(1) c(3) {X|1 a(X, Y) :- b(X),!, c(Y). a(4,4). a(X,Y) b(X) c(Y) a(4,4) b(3) b(1) b(2) c(2) c(1) c(3) {X|1 Vị từ phủ định: Trong SWI Prolog, vị từ not(X) có giá trị true khi SWI không chứng minh được X. Hay nói cách khác, những sự kiện mà SWI không chứng minh được là true thì SWI sẽ cho là sự kiện đó là false (giả thuyết đóng). Ví dụ, cho chương trình logic như sau: lacontrai( binh). % binh la con trai lacontrai( an). khonglacontrai( X) :- not (lacontrai(X)). Nếu ta thực hiện các câu truy vấn: 1 ? - khonglacontrai(X). a(X, Y) :- b(X), c(Y), !. a(4,4). a(X,Y) b(X) c(Y) a(4,4) b(3) b(1) b(2) c(2) c(1) c(3) {X|1 false vì SWI không tìm được đối tượng nào làm cho vị từ khonglacontrai(X) là đúng. Nhưng khi chúng ta thực hiện truy vấn sau: 2 ? - khonglacontrai(thanh). true kết quả cho là true vì SWI không chứng minh được lacontrai( thanh). Vị từ not có tác dụng trong một số trường hợp, chẳng hạn bài toán kiểm tra xem một số có là số nguyên tố không, tức là số mà không chia hết cho các số nhỏ hơn nó (trừ số 1 và chính nó). Bài toán này độc giả có thể xem ở phần cuối chương này. 6. Vị từ đệ qui Vị từ đệ quy là vị từ xuất hiện trong cả phần đầu và phần than của luật, hay nói cách khác, vị từ gọi chính nó. Định nghĩa vị từ đệ qui bao giờ cũng có 2 phần, phần sự kiện và phần đệ qui. Ví dụ, chương trình sau định nghĩa vị từ fibonaci(N,X) để tính phần từ thứ N trong dãy fibonaci, kết quả đưa vào biến X (dãy Fibonaci là dãy có phần tử thứ nhất bằng 0, phần tử thứ hai bằng 1, phần tử thứ ba trở đi sẽ là tổng của hai phần tử liền ngay trước). fibonaci( 1,0). % phần tử đầu tiên là 0 fibonaci( 2,1). % phần tử thứ đầu tiên là 1 fibonaci( N,F) :- N>2, N1 is N-1, N2 is N-2, fibonaci(N1,F1), fibonaci(N2,F2), F is F1+F2. Truy vấn chương trình logic này với các tham số N khác nhau ta sẽ được kết quả lưu trên biến F là phần tử thứ N của dãy. Ví dụ: 1 ? - fibonaci(3,F). F=1 2 ? - fibonaci(4,F). F=2 3 ? - fibonaci(10,F). F=34 Chú ý: Vị từ fibonaci(N,F) ở trên là để định nghĩa phần tử thứ N của dãy Fibonaci và kết quả lưu trong F, vì vậy mà SWI chỉ có thể thực hiện các câu truy vấn mà ở đó tham số thứ nhất là hằng số, ví dụ câu truy vấn như fibonaci(10,F) để tìm phần tử thứ 10 của dãy; câu truy vấn như fibonaci(10,34) để kiểm tra xem phần tử thứ 10 của dãy có là 34 không; câu truy vấn fibonaci(N,34) sẽ không thực hiện được trên SWI! 7. Cấu trúc dữ liệu trong Prolog Danh sách: Danh sách là một cấu trúc dữ liệu được tạo dựng sẵn trong SWI Prolog và cũng đã có sẵn các phép toán để lấy phần tử đầu và phần đuôi danh sách. Danh sách là nhóm bất kỳ các hạng thức với nhau bằng dấu “[“ và “]” và phân cách bởi dấu “,”. Ví dụ [a,b,c,d] là danh sách gồm 4 phần tử. Thao tác cơ bản để thao tác với danh sách là tách phần tử đầu của danh sách. Ví dụ: 1 ? – [X|Y]=[a,b,c,d]. X=a, Y=[b,c,d] 2 ? – [X,Y|Z]=[a,b,c,d]. X=a, Y=b, Z=[c,d] 3 ? – [X,[Y|Z]]=[a,b,c,d]. X=a, Y=b, Z=[c,d] Ngoài thao tác cơ bản ở trên, SWI cũng đã xây dựng một số thao tác khác, ví dụ: 4 ? – member(b,[a,b,c,d]). % b có phải là phần tử của danh sách [a,b,c,d] không? true 5 ? – append([a,b,c],[d,e,f],X). % nối hai danh sách X = [a, b, c, d, e, f] Để hiểu rõ thêm về danh sách, chúng ta xét ví dụ sau: hãy viết chương trình đảo ngược danh sách. my_reverse([],[]). my_reverse([H|T],L):- my_reverse(T,R),append(R,[H],L). Câu truy vấn có thể là: 1 ? – my_reverse([a,b,c,d],Y). Y=[d,c,b,a] Ví dụ tiếp theo là sắp xếp danh sách theo thứ tự tăng dần. Để giải bài toán này, chúng ta sẽ xây dựng vị từ có hai tham số sapxep(X,Y), với X là danh sách cần sắp xếp, Y là kết quả danh sách đã sắp xếp. Trong ví dụ dưới đây, ta sử dụng giải thuật sắp xếp theo kiểu chèn, sử dụng biến trung gian sapxep (X,Y):-i_sort(X,[],Y). i_sort([],Y,Y). i_sort([H|T],Z,Y):-insert(H,Z,Y1),i_sort(T,Y1,Y). insert(X,[Y|T],[Y|NT]):-X>Y,insert(X,T,NT). insert(X,[Y|T],[X,Y|T]):-X=<Y. insert(X,[],[X]). 8. Thuật toán suy diễn trong Prolog Chương 9 – Lập luận với tri thức không chắc chắn Trong các chương trước, chúng ta đã tìm hiểu logic mệnh đề, logic vị từ cấp một, và prolog. Ngôn ngữ và ngữ nghĩa của các logic này chỉ giới hạn cho các câu đúng/sai. Trong thực tế, nhiều thông tin/tri thức chúng ta không hoàn toàn biết được nó là đúng hay sai và chúng ta vẫn có thể rút ra (lập luận ra) các thông tin/tri thức từ những điều ta không chắc chắn đó mặc dù các thông tin/tri thức rút ra cũng là những cái không chắc chắn. Một ví dụ về việc lập luận với các thông tin không chắc đúng và với kết luận cũng không chắc đúng như sau. Giả sử chúng ta đã biết (qua quan sát 100 ngày gần đây) về các hoạt động của anh A với các điều kiện thời tiết khác nhau. Trong số 100 ngày, có 70 ngày trời nắng và không có gió. Anh ấy không đi chơi golf vào các ngày có gió hoặc không nắng. Trong 70 ngày nắng và không có gió thì anh ấy chỉ đi chơi golf trong 50 ngày. Việc đi chơi golf hay không phụ thuộc vào thời tiết, đôi khi đơn giản cũng chỉ vì hôm đó anh có thích hay không. Bây giờ dựa vào nhiều điều đã biết này, chúng ta phải trả lời các câu hỏi như: “ngày mai anh ấy có đi chơi golf không nếu biết rằng dự báo thời thiết ngày mai trời có thể có mưa?”, hoặc “khả năng ngày mai anh ấy đi chơi golf là bao nhiêu?”, hoặc là nếu biết anh ấy không đi chơi golf thì thời tiết hôm đó thế nào?”, v.v. Rõ rang các thông tin/tri thức đã biết là không chắc chắn và câu truy vấn thì trả lời cũng có thể không phải là dạng chắc chắc. Vậy làm thế nào mà máy tính có thể biểu diễn được các thông tin/tri thức không chắc chắn và lập luận để trả lời các câu truy vấn như trên. Có ba cách tiếp cận để giải quyết vấn đề biểu diễn và suy diễn các thông tin và tri thức không chắc chắn: logic mờ, lý thuyết khả năng và lý thuyết xác suất. Trong chương này, chúng ta chỉ tìm hiểu về lý thuyết xác suất, một ngôn ngữ để biểu diễn các thông tin, tri thức không chắc chắn và lý thuyết xác suất cho phép chúng ta lập luận để rút ra các thông tin và tri thức mới. Chương 10 – Học mạng nơron nhân tạo Hệ thống được gọi là có khả năng học (có dáng vẻ học như con người) là hệ thống có khả năng tìm ra một sự khái quát hoặc mô hình cho các dữ liệu huấn luyện (dữ liệu có gán nhãn nhận diện hoặc phân loại). Đặc trưng khái quát hoặc mô hình đó có thể được sử dụng để nhận diện hoặc phân loại dữ liệu mới. Hệ thống học thông minh là hệ thống có dáng vẻ ứng xử (hoặc kết quả nhận diện hoặc kết quả dự đoán) như đứa trẻ con học; chúng quan sát các hình ảnh của các ký tự đã được phân loại (thông qua việc nói với chúng đấy là ký tự gì - dữ liệu huấn luyện), và khái quát các đặc trưng của các loại ký tự; khi đưa hình ảnh của ký tự mới (dữ liệu kiểm tra) vào thì chúng nhận diện hoặc phân loại được ký tự đó thuộc loại nào. Hệ thống thông minh là hệ thống nhận diện đúng hoặc phân loại đúng dữ liệu kiểm tra, và khi đó hệ thống được gọi là có khả năng học (hay có dáng vẻ học).
File đính kèm:
- Giáo trình Trí tuệ nhân tạo (Artificial Intelligence).pdf