TRÍ TUỆ NHÂN TẠO ARTIFICIAL INTELLIGENCE

58 398 1
TRÍ TUỆ NHÂN TẠO ARTIFICIAL INTELLIGENCE

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Giáo trình TRÍ TUỆ NHÂN TẠO ARTIFICIAL INTELLIGENCE Phạm Thọ Hoà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 Error! Bookmark not defined.  1.  Trí tuệ nhân tạo gì? Error! Bookmark not defined.  2.  Lịch sử Error! Bookmark not defined.  3.  Các lĩnh vực AI Error! Bookmark not defined.  4.  Nội dung môn học .Error! Bookmark not defined.  Chương – Các phương pháp tìm kiếm lời giải Error! Bookmark not defined.  1.  Hình thành toán .Error! Bookmark not defined.  2.  Tìm kiếm có hệ thống Error! Bookmark not defined.  3.  Tìm kiếm có sử dụng hàm đánh giá Error! Bookmark not defined.  Chương – Các giải thuật tìm kiếm lời giải cho trò chơi Error! Bookmark not defined.  1.  Cây trò chơi đầy đủ .Error! Bookmark not defined.  2.  Giải thuật Minimax .Error! Bookmark not defined.  3.  Giải thuật Minimax với độ sâu hạn chế Error! Bookmark not defined.  4.  Hàm đánh giá Error! Bookmark not defined.  5.  Giải thuật Minimax với cắt tỉa alpha-beta Error! Bookmark not defined.  Chương – Các phương pháp lập luận logic mệnh đề 5  1.  Lập luận Logic 5  2.  Logic mệnh đề: cú pháp, ngữ nghĩa 5  3.  Bài toán lập luận giải thuật lập luận logic mệnh đề 8  4.  Câu dạng chuẩn hội luật phân giải 10  5.  Câu dạng Horn tam đoạn luận 13  6.  Thuật toán suy diễn dựa bảng giá trị chân lý 14  7.  Thuật toán suy diễn dựa luật phân giải 15  8.  Thuật toán suy diễn tiến, lùi dựa câu Horn 17  9.  Kết chương 20  Chương – Các phương pháp lập luận logic cấp .22  Chương – Các phương pháp lập luận logic cấp .22  1.  Cú pháp – ngữ nghĩa 24  2.  Lập luận logic vị từ cấp 28  3.  Phép đồng hai vị từ, thuật giải đồng 30  4.  Câu dạng chuẩn hội, luật phân giải tổng quát 32  5.  Câu dạng Horn tam đoạn luận tổng quát logic cấp 34  6.  Giải thuật suy diễn phân giải 36  7.  Thuật toán suy diễn tiến dựa câu Horn 39  8.  Thuật toán suy diễn lùi dựa câu Horn 41  Chương – Prolog 42  1.  Lập trình logic, môi trường lập trình SWI Prolog 42  2.  Ngôn ngữ Prolog bản, chương trình Prolog 45  3.  Câu truy vấn 46  4.  Vị từ phi logic (câu phi logic) 47  5.  Trả lời truy vấn, quay lui, cắt, phủ định 48  6.  Vị từ đệ qui 54  7.  Cấu trúc liệu Prolog 55  8.  Thuật toán suy diễn Prolog 56  Chương – Lập luận với tri thức không chắn .57  Chương – Học mạng nơron nhân tạo 58  Chương – Các phương pháp lập luận logic mệnh đề Lập luận Logic Loài người thông minh biết lập luận Liệu máy tính có khả lập luận (như người) không? Để trả lời câu hỏi này, trước hết cho biết lập luận Lập luận hành động sinh phát biểu từ phát biểu có trước Hay nói cách khác, người hệ thống gọi biết lập luận phát biểu có (true) cho trước tập phát biểu hay không? Các phát biểu phải tuân theo tập qui tắc định (ngữ pháp) cách xác định phát biểu (true) sai (false) Một tập qui tắc qui định ngữ pháp cách xác định ngữ nghĩa đúng/sai phát biểu gọi logic Như logic ngôn ngữ mà câu ngôn ngữ có ngữ nghĩa (giá trị) sai, cho phép lập luận, tức câu có giá trị không cho câu trước hay không Các câu cho trước gọi sở tri thức (Knowledge base - KB), câu cần chứng minh biết KB gọi câu truy vấn (query - q) Nếu q KB ta nói KB suy diễn q (ký hiệu KB ╞ q) Trong chương chương tiếp theo, xây dựng thuật giải cho phép lập luận tự động logic khác Các thuật giải giúp máy tính lập luận, rút phát biểu từ phát biểu cho trước Logic mệnh đề: cú pháp, ngữ nghĩa Logic đơn giản logic mệnh đề Các phát biểu (câu) logic mệnh đề hình thành từ ký hiệu mệnh đề (mỗi ký hiệu có nghĩa mệnh đề nhận giá trị sai tùy theo mệnh đề hay sai giới thực) ký hiệu liên kết ¬ (với ngữ nghĩa phủ định), ∧ (và), ∨ (hoặc), ⇒ (kéo theo), ⇔ (tương đương) Cú pháp ngữ nghĩa logic mệnh đề sau: 2.1 Cú pháp: ¾ Các ký hiệu: Hằng: true, false Ký hiệu: P, Q, … Mỗi ký hiệu gọi ký hiệu mệnh đề mệnh đề Các kết nối logic: ¬, ∧, ∨ Các ký hiệu “(“ ”)” ¾ Qui tắc xây dựng câu: Có hai loại câu: câu đơn câu phức true false câu (true câu đơn đúng, false câu sai) Mỗi ký hiệu mệnh đề câu, ví dụ P, Q câu (Câu đơn) Nếu A B câu công thức sau câu (các câu phức): ¬A (A ∧ B) (A ∨ B) (A ⇒ B) (A ⇔ B) ¾ Các khái niệm qui ước khác: Sau này, gọn, ta bỏ dấu “(“, “)” không cần thiết Nếu câu có ký hiệu mệnh đề ta gọi câu câu đơn câu phân tử Các câu câu đơn gọi câu phức Nếu P ký hiệu mệnh đề P ¬P gọi literal, P literal dương ¬P literal âm Các câu phức dạng A1 ∨ A2 ∨…∨An, Ai literal, gọi câu tuyển (clause) 2.2 Ngữ nghĩa: Qui định cách diễn dịch cách xác định tính (true) hay sai (false) cho câu ¾ true câu có giá trị đúng, false câu có giá trị sai ¾ Mỗi ký hiệu biểu diễn (ánh xạ với) phát biểu/mệnh đề giới thực; ký hiệu mệnh đề có giá trị (true) phát biểu/mệnh đề đúng, có giá trị sai (false) phát biểu/mệnh đề sai, có giá trị chưa xác định (true false) ¾ Các câu phức biểu diễn (ánh xạ với) phủ định, mối quan hệ mối liên kết mệnh đề/phát biểu/câu phức giới thực Ngữ nghĩa giá trị câu phức xác định dựa câu thành phần nó, chẳng hạn: ¬A có nghĩa phủ định mệnh đề/ câu A, nhận giá trị true A false ngược lại A ∧ B có nghĩa mối liên kết “A B”, nhận giá trị true A B true, nhận giá trị false trường hợp lại A ∨ B biểu diễn mối liên kết “A B”, nhận giá trị true A B true, nhận giá trị false A B false (A ⇒ B) biểu diễn mối quan hệ “A kéo theo B”, nhận giá trị false A true B false; nhận giá trị true trường hợp khác (A ⇔ B) biểu diễn mối quan hệ “A kéo theo B” “B kéo theo A” Như vậy, việc xác định tính đúng/sai ký hiệu mệnh đề (mệnh đề đơn) dựa tính sai kiện thông tin mà ám chỉ, việc xác định tính sai mệnh đề phức phải tuân theo qui tắc Trong nhiều trường hợp, (cần chỉ) biết tính đúng/sai câu phức, tính đúng/sai câu đơn không cần biết lập luận từ các câu phức biết đúng/sai qui tắc chuyển đổi tính đúng/sai câu đơn câu phức theo qui tắc 2.3 Các ví dụ: Gọi A mệnh đề “tôi chăm học”, B mệnh đề “tôi thông minh”, C mệnh đề “tôi thi đạt điểm cao môn Trí tuệ nhân tao”; Ta biểu diễn câu sau logic mệnh đề: - “Nếu chăm học thi đạt điểm cao môn Trí tuệ nhân tạo”: A ⇒ C - “Tôi vừa chăm học lại vừa thông minh”: A ∧ B - “Nếu chăm học thông minh thi đạt điểm cao môn Trí tuệ nhân tạo”: A ∨ B ⇒ C 2.4 Các câu đúng: Trong logic mệnh đề, ta có: ¬¬A ⇔ A (luật phủ định kép) A ∨ ¬A (luật loại trừ) (A ⇔ B) ⇔ (A⇒B) ∧ (B⇒A) (A⇒B) ⇔ ¬A ∨ B ¬ (A∨B) ⇔ ¬A ∧ ¬B (luật DeMorgan phép ∨) ¬ (A∧B) ⇔ ¬A ∨ ¬B (luật DeMorgan phép ∧) C ∨ (A∧B) ⇔ (C∨A) ∧ (C∨B) (luật phân phối phép ∨ phép ∧) C ∧ (A∨B) ⇔ (C∧A) ∨ (C∧B) (luật phân phối phép ∧ phép ∨) (A ∧ (A⇒B)) ⇒B (Tam đoạn luận) Luật phân giải (xem mục 4) Bài toán lập luận giải thuật lập luận logic mệnh đề Như nói phần Chương này, lập luận trả lời câu hỏi câu q có cho sở tri thức (là câu phức hội tập câu cho trước) hay không (KB╞ q)? Một cách đơn giản lập bảng giá trị chân lý cho KB cho q kiểm tra xem tất trường hợp làm cho KB nhận giá trị true làm cho q nhận giá trị true không? Nếu có ta kết luận KB╞ q, ngược lại kết luận không Phương pháp suy luận gọi phương pháp liệt kê thuật toán hóa (chi tiết xem mục Chương này) Một cách tiếp cận khác để trả lời cho câu hỏi KB╞ q sử dụng luật logic mệnh đề (xem mục 2.4) Ban đầu KB bao gồm tập câu (hội câu), áp dụng luật logic mệnh đề tập câu để sinh câu mới, bổ sung câu vào KB, lặp lại áp dụng luật logic sinh câu mới, v.v., đến xuất câu q KB dừng lại (khi KB╞ q) sinh câu từ KB (khi ta kết luận KB không suy q) Lời giải cho toán suy diễn theo cách đường từ trạng thái đầu đến trạng thái đích toán tìm đường sau: Trạng thái đầu: KB Các phép chuyển trạng thái: luật logic mệnh đề, luật x áp dụng cho KB sinh câu x(KB), bổ sung câu vào KB trạng thái KB ∧ x(KB) Trạng thái đích: trạng thái KB chứa q Chi phí cho phép chuyển: Vì số luật logic mệnh tương đối lớn nên nhân tố nhánh toán lớn (tất cách áp dụng luật tập tất câu KB), không gian tìm kiếm lời giải toán lớn Để hạn chế không gian tìm kiếm lời giải toán, biểu diễn KB q câu dạng chuẩn hội (xem mục 4), cần áp dụng loại luật luật phân giải KB phép chuyển phép phân giải hai câu có chứa literal phủ định KB, kết phép phân giải hai câu dạng chuẩn hội lại câu dạng chuẩn hội bổ sung vào KB, lặp lại áp dụng luật phân giải KB đến KB chứa câu q dừng Chi tiết thuật toán suy diễn dựa luật phân giải KB╞ q trình bày mục Chương (thực tế thuật toán suy diễn phân giải trả lời toán tương đương (KB ∧ ¬q)╞ [].) Giải thuật suy diễn phân giải giải thuật đầy đủ logic mệnh đề, tức với câu q mà kéo theo từ KB (q KB đúng) sử dụng giải thuật suy diễn phân giải suy diễn KB ╞ q (tức câu kéo từ KB không suy diễn phân giải được); câu logic mệnh đề biểu diễn câu dạng chuẩn hội (xem mục 4) Do liên tục phải bổ sung câu vào KB lặp lại tìm kiếm cặp câu phân giải với nên nhân tố nhánh tìm kiếm lời giải tăng dần theo độ sâu tìm kiếm Vì không gian thời gian giải thuật tăng nhanh, giải thuật phân giải làm việc không hiệu Để khắc phục nhược điểm này, người ta tìm cách biểu diễn KB dạng câu Horn áp dụng loại luật (tam đoạn luận, xem mục 5) để suy diễn (tam đoạn luận áp dụng câu dạng Horn sinh câu câu dạng Horn) Thuật giải suy diễn tiến/lùi sở tri thức dạng Horn trình bày chi tiết mục 8, có độ phức tạp tuyến tính số câu KB Tuy nhiên thuật giải suy diễn tiến/lùi lại không đầy đủ logic mệnh đề, có câu logic mệnh đề biểu diễn dạng Horn để áp dụng giải thuật suy diến tiến/lùi Câu dạng chuẩn hội luật phân giải ¾ Câu dạng chuẩn hội câu hội câu tuyển (clause) Như nói, câu tuyển câu dạng A1 ∨ A2 ∨…∨An, Ai ký hiệu mệnh đề phủ định ký hiệu mệnh đề Vậy câu dạng chuẩn hội có dạng: (A11 ∨ A12 ∨…∨A1n) ∧ (A21 ∨ A22 ∨…∨A2m) ∧ …∧ (Ak1 ∨ Ak2 ∨…∨Akr) clause clause clause 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( duong, hoan ).  me( duong, hoa ).  chame( X, Y ) :‐ cha( X, Y ).  chame( X, Y ) :‐ me( X, Y ).  % cha cua hoan la nam  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 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 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 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ó 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 mới      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: 1 ?‐ xinchao.      What is your name?      |: hoan.      % chú ý: 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 toá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(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):      1 ?‐ bigger(3,5).      The bigger is 5      true.b      2 ?‐ bigger(8,7).      The bigger is 8      true.       3 ?‐ 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 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 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(4,4) a(X,Y) b(1) b(X) b(2) b(3) {X|1 c(1) c(1) c(2) b(1) c(Y) b(2) b(3) c(3) Khi thực truy vấn: ?- a(X,Y) kết sau: ?- a(X,Y) X = 1, a(X, Y) :- b(X), c(Y) a(4,4) a(4,4) c(2) c(3) 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|1 c(Y) c(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|1 b(1) c(Y) c(1) 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|1 c(Y) c(1) b(1) 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 con trai  lacontrai( an).  khonglacontrai( X) :‐ not (lacontrai(X)).           Nếu ta thực câu truy vấn: 1 ? ‐ 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: 2 ? ‐ 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 toá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 toá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ử 0   fibonaci( 2,1).    % phần tử thứ 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 với tham số N khác ta kết lưu biến F phần tử thứ N 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) để đị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 toá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ụ: 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 trên, SWI xây dựng số thao tác khác, ví dụ: 4 ? – member(b,[a,b,c,d]).  % b có phải phần tử 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 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à: 1 ? – 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=[...]... để phân biệt với suy diễn phân giải tiến ở trên) Chi tiết giải thuật cho trong bảng ở phía dưới Giải thuật sử dụng danh sách các ký hiệu mệnh đề được xác định là true, true_symbols , danh sách này khởi tạo từ các ký hiệu độc lập trong KB, sau đó bổ sung khi một ký hiệu mệnh đề được suy diễn ra là true, đến khi nào danh sách chưa ký hiệu truy vấn q thì dừng hoặc không bổ sung được ký hiệu nào nữa vào... n], count[i] là số ký hiệu xuất hiện trong phần điều kiện của clausei - Bool proved[danhsach_kyhieu]: proved[kyhieu]=1 nếu kyhieu đã được chứng minh là suy diễn được từ KB, ngược lại =0; ban đầu khởi tạo= 0 với mọi ký hiệu - working_symbols: danh sách ký hiệu đang xem xét, khởi đầu bằng danh sách các ký hiệu độc lập trong KB while working_symbols is not empty p= pop(working_symbols); if (!proved[p])

Ngày đăng: 17/05/2016, 22:39

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan