Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 104 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
104
Dung lượng
1,27 MB
Nội dung
Giáo trình TRÍ TUỆ NHÂN TẠO ARTIFICIAL INTELLIGENCE Phạm Thọ Hồn, Phạm Thị Anh Lê Khoa Cơng nghệ thơng tin Trường Đại học Sư phạm Hà Nội Hà nội, 2011 MỤC LỤC Chương – Giới thiệu .5 Trí tuệ nhân tạo gì? Lịch sử .6 Các lĩnh vực AI Nội dung môn học .9 Chương – Bài tốn phương pháp tìm kiếm lời giải .10 Bài toán thành phần toán 10 Giải thuật tổng quát tìm kiếm lời giải 14 Đánh giá giải thuật tìm kiếm 17 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 –Các phương pháp tìm kiếm heuristic 25 Giải thuật tìm kiếm tốt (best first search) 25 Các biến thể giải thuật best first search .28 Các giải thuật khác 31 Chương – Các giải thuật tìm kiếm lời giải cho trị chơi .37 Cây trò chơi đầy đủ 37 Giải thuật Minimax 39 Giải thuật Minimax với độ sâu hạn chế 41 Giải thuật Minimax với cắt tỉa alpha-beta .44 Chương – Các phương pháp tìm kiếm lời giải thỏa mãn ràng buộc 47 Các toán thỏa mãn ràng buộc 47 Giải thuật quay lui vét cạn .48 Các cải tiến giải thuật quay lui 49 Các giải thuật tối ưu địa phương 49 Chương – Các phương pháp lập luận logic mệnh đề 50 Lập luận Logic 50 Logic mệnh đề: cú pháp, ngữ nghĩa 50 Bài toán lập luận giải thuật lập luận logic mệnh đề 53 Câu dạng chuẩn hội luật phân giải 55 Câu dạng Horn tam đoạn luận 58 Thuật toán suy diễn dựa bảng giá trị chân lý 60 Thuật toán suy diễn dựa luật phân giải .60 Thuật toán suy diễn tiến, lùi dựa câu Horn 62 Kết chương .65 Chương – Các phương pháp lập luận logic cấp 67 Chương – Các phương pháp lập luận logic cấp 67 Cú pháp – ngữ nghĩa 69 Lập luận logic vị từ cấp 73 Phép đồng hai vị từ, thuật giải đồng 75 Câu dạng chuẩn hội, luật phân giải tổng quát 77 Câu dạng Horn tam đoạn luận tổng quát logic cấp 79 Giải thuật suy diễn phân giải 81 Thuật toán suy diễn tiến dựa câu Horn .84 Thuật toán suy diễn lùi dựa câu Horn .86 Chương – Prolog 87 Lập trình logic, mơi trường lập trình SWI Prolog 87 Ngôn ngữ Prolog bản, chương trình Prolog 90 Câu truy vấn .92 Vị từ phi logic (câu phi logic) 92 Trả lời truy vấn, quay lui, cắt, phủ định 93 Vị từ đệ qui 99 Cấu trúc liệu Prolog 100 Thuật toán suy diễn Prolog 101 Chương – Lập luận với tri thức không chắn 102 Chương 10 – Học mạng nơron nhân tạo .103 Chương – Giới thiệu Trí tuệ nhân tạo gì? Để hiểu trí tuệ nhân tạo (artificial intelligence) bắt đầu với khái niệm bay nhân tạo (flying machines), tức máy bay Đã từ lâu, loài người mong muốn làm máy mà di chuyển khơng trung mà khơng phụ thuộc vào địa hình mặt đất, hay nói cách khác máy bay Khơng có ngạc nhiên ý tưởng làm máy bay từ nghiên cứu cách chim bay Những máy biết bay thiết kế theo nguyên lý “vỗ cánh” chim bay quãng đường ngắn lịch sử hàng không thực sang trang kể từ anh em nhà Wright thiết kế máy bay dựa nguyên lý khí động lực học (aerodynamics) Các máy bay nay, thấy, có sức trở lớn bay quãng đường vịng quanh giới Nó khơng thiết phải có nguyên lý bay chim bay chim (dáng vẻ), tốt chim Quay lại câu hỏi Trí tuệ nhân tạo Trí tuệ nhân tạo trí thơng minh máy người tạo Ngay từ máy tính điện tử đời, nhà khoa học máy tính hướng đến phát hiển hệ thống máy tính (gồm phần cứng phần mềm) cho có khả thơng minh loài người Mặc dù nay, theo quan niệm người viết, ước mơ xa thành thực, thành tựu đạt không nhỏ: làm hệ thống (phần mềm chơi cờ vua chạy siêu máy tinh GeneBlue) thắng vua cờ giới; làm phần mềm chứng minh tốn hình học; v.v Hay nói cách khác, số lĩnh vực, máy tính thực tốt tương đương người (tất nhiên tất lĩnh vực) Đó hệ thống thơng minh Có nhiều cách tiếp cận để làm trí thơng minh máy (hay trí tuệ nhân tạo), chẳng hạn nghiên cứu cách não người sản sinh trí thơng minh lồi người ta bắt chước nguyên lý đó, có cách khác sử dụng nguyên lý hoàn toàn khác với cách sản sinh trí thơng minh lồi người mà làm máy thông minh người; giống máy bay bay tốt chim có chế bay giống chế bay chim Như vậy, trí tuệ nhân tạo nói đến khả máy thực công việc mà người thường phải xử lý; dáng vẻ ứng xử kết thực máy tốt tương đương với người ta gọi máy thơng minh hay máy có trí thơng minh Hay nói cách khác, đánh giá thông minh máy dựa nguyên lý thực nhiệm vụ có giống cách người thực hay không mà dựa kết dáng vẻ ứng xử bên có giống với kết dáng vẻ ứng xử người hay không Các nhiệm vụ người thường xuyên phải thực là: giải tốn (tìm kiếm, chứng minh, lập luận), học, giao tiếp, thể cảm xúc, thích nghi với mơi trường xung quanh, v.v., dựa kết thực nhiệm vụ để kết luận có thơng minh hay khơng Mơn học Trí tuệ nhân tạo nhằm cung cấp phương pháp luận để làm hệ thống có khả thực nhiệm vụ đó: giải tốn, học, giao tiếp, v.v cách làm có người hay không mà kết đạt dáng vẻ bên ngồi người Trong mơn học này, tìm hiểu phương pháp để làm cho máy tính biết cách giải tốn, biết cách lập luận, biết cách học, v.v Lịch sử Vào năm 1943, Warren McCulioch Walter Pitts bắt đầu thực nghiên cứu ba sở lý thuyết bản: triết học chức noron thần kinh; phân tích mệnh đề logic; lý thuyết dự đoán Turing Các tác giả nghiên cứu đề xt mơ hình noron nhân tạo, noron đặc trưng hai trạng thái “bật”, “tắt” phát mạng noron có khả học Thuật ngữ “Trí tuệ nhân tạo” (Artificial Intelligence - AI) thiết lập John McCarthy Hội thảo chủ đề vào mùa hè năm 1956 Đồng thời, ông đề xuất ngơn ngữ lập trình Lisp – ngơn ngữ lập trình hàm tiêu biểu, sử dụng lĩnh vực AI Sau đó, Alan Turing đưa "Turing test" phương pháp kiểm chứng hành vi thông minh Thập kỷ 60, 70 Joel Moses viết chương trình Macsyma - chương trình tốn học sử dụng sở tri thức thành công Marvin Minsky Seymour Papert đưa chứng minh giới hạn mạng nơ-ron đơn giản Ngơn ngữ lập trình logic Prolog đời phát triển Alain Colmerauer Ted Shortliffe xây dựng thành công số hệ chuyên gia trợ giúp chẩn đoán y học, hệ thống sử dụng ngôn ngữ luật để biểu diễn tri thức suy diễn Vào đầu năm 1980, nghiên cứu thành công liên quan đến AI hệ chuyên gia (expert systems) – dạng chương trình AI mô tri thức kỹ phân tích nhiều chuyên gia người Vào năm 1990 đầu kỷ 21, AI đạt thành tựu to lớn nhất, AI áp dụng logic, khai phá liệu, chẩn đoán y học nhiều lĩnh vực ứng dụng khác công nghiệp Sự thành công dựa vào nhiều yếu tố: tăng khả tính tốn máy tính, tập trung giải toán cụ thể, xây dựng mối quan hệ AI lĩnh vực khác giải toán tương tự, chuyển giao nhà nghiên cứu cho phương pháp toán học vững chuẩn khoa học xác Các lĩnh vực AI Lập luận, suy diễn tự động: Khái niệm lập luận (reasoning), suy diễn (reference) sử dụng phổ biến lĩnh vực AI Lập luận suy diễn logic, dùng để tiến trình rút kết luận (tri thức mới) từ giả thiết cho (được biểu diễn dạng sở tri thức) Như vậy, để thực lập luận người ta cần có phương pháp lưu trữ sở tri thức thủ tục lập luận sở tri thức Biểu diễn tri thức: Muốn máy tính lưu trữ xử lý tri thức cần có phương pháp biểu diễn tri thức Các phương pháp biểu diễn tri thức bao gồm ngôn ngữ biểu diễn kỹ thuật xử lý tri thức Một ngôn ngữ biểu diễn tri thức đánh giá “tốt” có tính biểu đạt cao tính hiệu thuật tốn lập luận ngơn ngữ Tính biểu đạt ngôn ngữ thể khả biểu diễn phạm vi rộng lớn thông tin miền ứng dụng Tính hiệu thuật tốn lập luận thể chi phí thời gian khơng gian dành cho việc lập luận Tuy nhiên, hai yếu tố dường đối nghịch nhau, tức ngôn ngữ có tính biểu đạt cao thuật tốn lập luận có độ phức tạp lớn (tính hiệu thấp) ngược lại (ngôn ngữ đơn giản, có tính biểu đạt thấp thuật tốn lập luận có hiệu cao) Do đó, thách thức lớn lĩnh vực AI xây dựng ngơn ngữ biểu diễn tri thức mà cân hai yếu tố này, tức ngôn ngữ có tính biểu đạt đủ tốt (tùy theo ứng dụng) lập luận hiệu Lập kế hoạch: khả suy mục đích cần đạt nhiệm vụ đưa ra, xác định dãy hành động cần thực để đạt mục đích Học máy: lĩnh vực nghiên cứu AI phát triển mạnh mẽ có nhiều ứng dụng lĩnh vực khác khai phá liệu, khám phá tri thức, … Xử lý ngôn ngữ tự nhiên: nhánh AI, tập trung vào ứng dụng ngôn ngữ người Các ứng dụng nhận dạng tiếng nói, nhận dạng chữ viết, dịch tự động, tìm kiếm thơng tin,… Hệ chun gia: cung cấp hệ thống có khả suy luận để đưa kết luận Các hệ chuyên gia có khả xử lý lượng thơng tin lớn cung cấp kết luận dựa thông tin Có nhiều hệ chuyên gia tiếng hệ chuyên gia y học MYCIN, đoán nhận cấu trúc phân tử từ cơng thức hóa học DENDRAL, … Robotics … Nội dung môn học Giáo trình viết với nội dung nhập mơn AI cho sinh viên chuyên ngành Tin học Cơng nghệ thơng tin Các tác giả có tham khảo số tài liệu, giáo trình trường Đại học Quốc gia Hà nội, Đại học Bách khoa Hà nội, … Nội dung gồm phần sau: Chương Giới thiệu: trình bày tổng quan AI, lịch sử đời phát triển lính vực ứng dụng AI Chương Các phương pháp tìm kiếm lời giải: trình bày kỹ thuật tìm kiếm áp dụng để giải vấn đề áp dụng rộng rãi lĩnh vực trí tuệ nhân tạo Chương Các giải thuật tìm kiếm lời giải cho trị chơi: trình bày số kỹ thuật tìm kiếm trị chơi có đối thủ Chương Các phương pháp lập luận logic mệnh đề: trình bày cú pháp, ngữ nghĩa logic mệnh đề số thuật toán lập luận logic mệnh đề Chương Các phương pháp lập luận logic vị từ cấp một: trình bày cú pháp, ngữ nghĩa logic vị từ cấp số thuật toán lập luận logic vị từ cấp Chương Prolog: Giới thiệu chung ngôn ngữ Prolog, cú pháp, ngữ nghĩa cấu trúc chương trình Prolog, số phiên Prolog SWI Prolog,… Chương Lập luận với tri thức không chắn: Giới thiệu tri thức không chắn số cách tiếp cận biểu diễn xử lý tri thức không chắn Chương Học mạng noron nhân tạo: Giới thiệu phương pháp kỹ thuật lập luận sử dụng mạng noron nhân tạo Chương – Bài tốn phương pháp tìm kiếm lời giải Bài toán thành phần toán Chương giới thiệu giải thuật máy tính giải tốn mà thơng thường địi hỏi trí thơng minh người, tốn đong nước, tốn sơ bàn cờ, tốn tìm đường mơ tả bên Để thiết kế giải thuật chung giải toán này, nên phát biểu toán theo dạng thành phần: Trạng thái toán, trạng thái đầu, trạng thái đích, phép chuyển trạng thái, lược đồ chi phí phép chuyển trạng thái (viết gọn chi phí) a Bài toán đong nước 9l 3l 5l Sử dụng ba can lít, lít lít, làm để đong lít nước Bài tốn phát biểu lại theo thành phần sau: - Trạng thái: Gọi số nước có can a, b, c (a ≤ 3, b ≤ 5, c ≤ 9), ba (a, b, c) trạng thái toán - Trạng thái đầu: (0, 0, 0) // ba can rỗng - Trạng thái đích (-, -, 7) // can thứ chứa lít nước - Phép chuyển trạng thái: từ trạng thái (a,b,c) chuyển sang trạng thái (x,y,z) thông qua thao tác làm rỗng can, chuyển từ can sang can đến can nguồn can đích bị đầy - Chi phí phép chuyển trạng thái: phép chuyển trạng thái có chi phí tính hạn chế ngơn ngữ biểu diễn tri thức dạng câu Horn Trong tài liệu này, tìm hiểu cài đặt miễn phí, SWI Prolog Mơi trường lập trình SWI Prolog: SWI Prolog cài đặt thủ tục suy diễn hỗ trợ câu Horn có bổ sung thêm số thành phần phi logic (các phép toán input/output, phép toán tăng sức mạnh biểu diễn tăng tính hiệu thuật toán suy diễn) Bộ suy diễn SWI Prolog sử dụng giải thuật phân giải SLD (Selective Linear Definite clause resolution), ý tưởng biểu diễn câu Horn dạng câu tuyển (clause) có literal dương, áp dụng giải thuật phân giải lùi Giải thuật phân giải SLD mô tả chi tiết phần cuối Chương SWI Prolog download miễn phí địa sau: http://www.swi-prolog.org/download/stable Sauk cài đặt chạy chương trình SW Prolog, Hệ thống hiển thị dấu nhắc yêu cầu nhập vào câu truy vấn sau: 1?- | Tất nhiên, trước nhập câu truy vấn, phải cho Hệ thống biết truy vấn sở tri thức Một sở tri thức khai báo kiện luật lĩnh vực đó, lưu file Để load file sở tri thức, ta sử dụng menu File Consult Chọn file Các mô tả kiện luật (các câu Horn) file sở tri thức gọi chương trình prolog Nhiệm vụ người lập trình logic viết chương trình prolog câu truy vấn Ví dụ, ta soạn thảo file chương trình prolog (cơ sở tri thức) có tên file giapha.pl (có thể sử dụng soạn thảo văn nào, sử soạn thảo SWI Prolog cung cấp cách sử dụng menu File New/Edit Nhập tên file), nội dung file sau: cha( hoan, nam ) % cha cua hoan la nam cha( duong, hoan ) me( duong, hoa ) chame( X, Y ) :- cha( X, Y ) chame( X, Y ) :- me( X, Y ) ongba( X, Y ) :- chame( X, Z ), chame( Z, Y ) Trong mơi trường SWI, load file chương trình (File Consult giapha.pl), sau nhập câu truy vấn từ dấu nhắc SWI Prolog Ví dụ câu truy vấn trả lời truy vấn sau: 1?-chame(duong,hoa) true 2?-ongba(X,nam) X=duong Trong phần tiếp theo, tìm hiểu câu khai báo file chương trình loại câu truy vấn Ngơn ngữ Prolog bản, chương trình Prolog Qui ước đặt tên biến tên hằng: Prolog ngơn ngữ cho máy tính, cần qui ước quan trọng việc đặt tên biến tên hằng, theo đó, tên biến phải bắt đầu ký tự in hoa (chẳng hạn X, Sinhvien, v.v.), tên phải bắt đầu ký tự in thường (ví dụ: an, binh, lasinhvien, v.v.) Vì Prolog ngôn ngữ câu Horn logic vị từ cấp nên biến xuất hạng thức tham số vị từ Chương trình Prolog, câu Horn dương: Chương trình prolog dãy (hội) câu Horn dương (câu tuyển có literal dương) Các câu có dạng Horn dương prolog có dạng tổng quát sau: head:- p1, p2, …, pn {nghĩa là: if (p1 and p2 and … and pn) then head} Ở head, P1, p2, …, pn vị từ (có thể có tham số); vị từ head gọi phần đầu luật, P1, p2, …, pn gọi phần thân (phần điều kiện) luật Nếu n>0 câu Horn dương câu dạng luật; n=0 câu khơng có phần điều kiện, ta có câu mơ tả kiện viết đơn giản là: head Chú ý: câu chương trình prolog kết thúc dấu chấm (“.”) Tất câu câu đóng, có ký hiệu biến xuất câu ta ngầm hiểu biến biến buộc, đặt lượng từ , trừ biến xuất phần điều kiện câu biến hiểu đặt lượng từ (thực chất chuyển dạng câu tuyển chuyển sang chuyển vế lấy phủ định) Vị từ, hạng thức: Như giới thiệu trên, chương trình prolog bao gồm hai loại câu: câu kiện (câu đơn) câu luật (câu phức) Các câu xây dựng từ vị từ (head, P1, p2, …, pn), vị từ có cú pháp sau: tên _vi_tu(hang_thuc1, hang_thuc2, …, hang_thucn) tên_vị_từ tuân theo qui tắc đặt tên hằng; hạng_thứci là: Giá trị: o tên ký hiệu, ví dụ an, x, mauxanh, v.v o xâu, ví dụ ‘Xin chao’ o số nguyên số thực, ví dụ 5, 3.1416, v.v tên biến, ví dụ X, Sinhvien, v.v (chú ý: tên biến bắt đầu ký tự viết hoa; biến khơng có kiểu biến, nhận giá trị nào; tất biến biến địa phương câu xuất hiện) cấu trúc (nhóm hạng thức lại thành cấu trúc), ví dụ như: mau[red, green, blue], [march, 17, 2011], v.v Hai trường hợp đặc biệt cấu trúc list string tìm hiểu sâu phần sau Chương Ví dụ chương trình Prolog: chương trình lưu file giapha.pl ví dụ trước bao gồm ba câu đầu câu kiện câu cuối câu luật; có ký hiệu vị từ là: cha, me, chame, ongba; có tên hằng: nam, hoan, hoa, duong; có biến: X,Y,Z Câu truy vấn Câu truy vấn tổng quát có dạng tổng quát sau: p1, p2, …, pn Chúng ta chia câu truy vấn thành hai loại: Câu truy vấn không chứa biến: câu truy vấn có nghĩa “biểu thức logic (p1 and p2 and …and pn) có (có giá trị true) sở tri thức (chương trình prolog) cho hay khơng?” Chẳng hạn, câu truy vấn chame(duong, hoa) ví dụ Phần hỏi: “có phải hoa chame duong khơng?” Trong trường hợp này, SWI Prolog trả lời true false Câu truy vấn có chứa tập biến (ví dụ X,Y, …): khác với câu sở tri thức (chương trình prolog) mà mặc định hiểu biến với lượng từ , biến câu truy vấn lại ngầm định với lượng từ , câu truy vấn có nghĩa là: “có X, Y, … cho biểu thức logic (p1 and p2 and …and pn) có (có giá trị true) khơng?” Chẳng hạn, câu truy vấn ongba(X,nam) ví dụ Phần hỏi: “có tồn X mà có nam ongba X khơng?” Trong trường hợp SWI Prolog tìm giá trị X cho ongba(X,nam) có giá trị true Nếu muốn SWI Prolog tìm tất giá trị X thỏa mãn ongba(X,nam), sau trả lời Hệ thống, ấn phím “;” thay ấn phím “enter” Chú ý: câu truy vấn q Prolog có dạng tương đương q câu dạng Horn âm x,y,… (p1 p2 … pn) (câu tuyển khơng có literal dương nào) Vị từ phi logic (câu phi logic) Chương trình dãy (thứ tự quan trọng!) câu kiện câu luật có cú pháp định nghĩa Ngoài câu chuẩn Horn logic vị từ cấp (các câu khai báo tri thức), Prolog cịn có vị từ phi logic để điều khiển việc thực suy diễn để vào/ra liệu ngơn ngữ thủ tục Ví dụ câu phi logic (mặc dù câu phi logic, Prolog gán giá trị cho chúng): write(hang_thuc) % lệnh in hang_thuc hình nl % đưa trỏ hình xuống dịng read(ten_bien) % nhập giá trị từ bàn phím vào biến X is bieu-thuc % gán giá trị bieu-thuc cho biến X Ví dụ, chương trình Hello.pl có nội dung sau: xinchao:-write('What is your name?'), nl, read(X), write('Hello '), write(X) Sau load chương trình Hello.pl chạy chương trình (câu truy vấn) kết sau: ?- xinchao What is your name? |: hoan % ý: kết thúc nhập liệu dấu chấm (“.”) Hello hoan true Trong phần sau Chương này, gặp thêm số câu phi logic khác câu lệnh cắt (!) Trả lời truy vấn, quay lui, cắt, phủ định Trả lời truy vấn – quay lui: Để tìm hiểu chương trình Prolog đuợc thực thi (trình biên dịch Prolog trả lời câu truy vấn nào), tìm hiểu ví dụ sau: Bài tốn viết chương trình Prolog tìm số lớn hai số Chúng ta soạn thảo file chương trình timsolonnhat.pl với vị từ bigger(N,M) để in số lớn sau: bigger(N,M):- N < M, write(‘The bigger number is ‘), write(M) bigger(N,M):- N > M, write(‘The bigger number is ‘), write(N) bigger(N,M):- N =:= M, write(‘Numbers are the same‘) Sau load chương trình, nhập câu truy vấn sau (câu trả lời truy vấn xuất sau truy vấn): ?- bigger(3,5) The bigger is true.b ?- bigger(8,7) The bigger is true ?- bigger(10,10) Numbers are the same true Để trả lời câu truy vấn trên, SWI Prolog thực đồng câu truy vấn với vị từ phần đầu luật theo thứ tự từ xuống Khi gặp luật đồng được, SWI Prolog thực đồng câu truy vấn với phần đầu luật thực lệnh phần thân luật Nếu tất biến luật (sau đồng nhất) xác định giá trị SWI Prolog trả cho người dùng kết true đợi tương tác với người dùng Khi người dung muốn tìm kết tiếp theo, nhấn phím “;”, SWI Prolog chuyển sang tìm, đồng thực luật Khi câu truy vấn đồng với luật mà có biến cịn chưa xác định giá trị, SWI Prolog hình thành câu truy vấn vị từ chứa biến; sau thực đệ qui việc tìm, đồng thực luật sở tri thức theo thứ tự từ câu truy vấn trung gian (đích trung gian) Việc thực suy diễn lùi gọi quay lui Một điểm lưu ý nữa, sau tìm luật đồng với câu truy vấn, SWI Prolog thực phần thân luật theo thứ tự từ trái qua phải Vì phần thân luật có dạng hội vị từ, nên thực hiện, gặp vị từ mà có giá trị chân lý false SWI Prolog khơng thực vị từ sau Vị từ Cắt (!): Khi thực chương trình, SWI Prolog thực từ xuống, từ trái qua phải, chứng minh câu truy vấn quay lui (lùi) Khi tìm lời giải câu truy vấn, SWI Prolog thực quay lui vét cạn để tìm lời giải Trong trường hợp cần tìm lời giải, trường hợp biết chắn khơng có lời giải thực quay lui, ta đặt vị từ cắt (!) sau danh sách vị từ mong muốn Khi có vị từ cắt xuất câu SWI Prolog khơng thực quay lui vị từ đặt trước Để hiểu chế ngắt quay lui vị từ cắt (!), ta lấy ví dụ sau: a(X, Y) :- b(X), c(Y) a(X,Y) a(4,4) b(1) b(X) b(2) b(3) {X| c(1) 1} c(2) b(1) c(Y) c(1) b(2) b(3) c(3) a(X, Y) :- b(X), c(Y) a(4,4) a(4,4) c(2) c(3) Khi thực truy vấn: ?- a(X,Y) kết sau: ?- 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 = Bây thay câu lệnh chương trình a(X, Y) :- b(X), c(Y) câu lệnh (chèn vị từ ngắt ! vào vị trí khác nhau): a(X, Y) :- !, b(X), c(Y) % không quay lui vị từ a a(X, Y) :- b(X),!, c(Y) % không quay lui vị từ a,b a(X, Y) :- b(X), c(Y),! % không quay lui vị từ a,b,c Và thực lại câu truy vấn ta kết khác hình vẽ sau a(X,Y) b(X) {X| c(Y) c(1) 1} b(1) b(2) a(4,4) c(2) c(3) b(3) a(X, Y) :- !, b(X), c(Y) a(4,4) a(X,Y) b(X) {X| c(1) 1} b(1) c(Y) b(2) b(3) a(X, Y) :- b(X),!, c(Y) a(4,4) a(4,4) c(2) c(3) a(X,Y) b(X) {X| c(1) 1} b(1) c(Y) b(2) a(4,4) c(2) c(3) b(3) a(X, Y) :- b(X), c(Y), ! a(4,4) Vị từ phủ định: Trong SWI Prolog, vị từ not(X) có giá trị true SWI khơng chứng minh X Hay nói cách khác, kiện mà SWI khơng chứng minh true SWI cho kiện false (giả thuyết đóng) Ví dụ, cho chương trình logic sau: lacontrai( binh) % binh la trai lacontrai( an) khonglacontrai( X) :- not (lacontrai(X)) Nếu ta thực câu truy vấn: ? - khonglacontrai(X) false SWI khơng tìm đối tượng làm cho vị từ khonglacontrai(X) Nhưng thực truy vấn sau: ? - khonglacontrai(thanh) true kết cho true SWI khơng chứng minh lacontrai( thanh) Vị từ not có tác dụng số trường hợp, chẳng hạn tốn kiểm tra xem số có số nguyên tố không, tức số mà không chia hết cho số nhỏ (trừ số nó) Bài tốn độc giả xem phần cuối chương Vị từ đệ qui Vị từ đệ quy vị từ xuất phần đầu phần than luật, hay nói cách khác, vị từ gọi Định nghĩa vị từ đệ qui có phần, phần kiện 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 dãy fibonaci, kết đưa vào biến X (dãy Fibonaci dãy có phần tử thứ 0, phần tử thứ hai 1, phần tử thứ ba trở tổng hai phần tử liền trước) fibonaci( 1,0) % phần tử fibonaci( 2,1) % phần tử thứ 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 với tham số N khác ta kết lưu biến F phần tử thứ N dãy Ví dụ: ? - fibonaci(3,F) F=1 ? - fibonaci(4,F) F=2 ? - fibonaci(10,F) F=34 Chú ý: Vị từ fibonaci(N,F) để định nghĩa phần tử thứ N dãy Fibonaci kết lưu F, mà SWI thực câu truy vấn mà tham số thứ số, ví dụ câu truy vấn fibonaci(10,F) để tìm phần tử thứ 10 dãy; câu truy vấn fibonaci(10,34) để kiểm tra xem phần tử thứ 10 dãy có 34 khơng; câu truy vấn fibonaci(N,34) không thực SWI! Cấu trúc liệu Prolog Danh sách: Danh sách cấu trúc liệu tạo dựng sẵn SWI Prolog có sẵn phép tốn để lấy phần tử đầu phần đuôi danh sách Danh sách nhóm hạng thức với dấu “[“ “]” phân cách dấu “,” Ví dụ [a,b,c,d] danh sách gồm phần tử Thao tác để thao tác với danh sách tách phần tử đầu danh sách Ví dụ: ? – [X|Y]=[a,b,c,d] X=a, Y=[b,c,d] ? – [X,Y|Z]=[a,b,c,d] X=a, Y=b, Z=[c,d] ? – [X,[Y|Z]]=[a,b,c,d] X=a, Y=b, Z=[c,d] Ngoài thao tác trên, SWI xây dựng số thao tác khác, ví dụ: ? – member(b,[a,b,c,d]) % b có phải phần tử danh sách [a,b,c,d] không? true ? – 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 danh sách, xét ví dụ sau: 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 là: ? – my_reverse([a,b,c,d],Y) Y=[d,c,b,a] Ví dụ xếp danh sách theo thứ tự tăng dần Để giải toán này, xây dựng vị từ có hai tham số sapxep(X,Y), với X danh sách cần xếp, Y kết danh sách xếp Trong ví dụ đây, ta sử dụng giải thuật 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=