1. Trang chủ
  2. » Công Nghệ Thông Tin

Lec 11 13 prologh DANH SACH

18 224 0

Đ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

Thông tin cơ bản

Định dạng
Số trang 18
Dung lượng 382,5 KB

Nội dung

S ROLOG WI • Hiện có nhiều hệ lập trình logic đời mà tiêu biểu Prolog Prolog viết tắt cụm từ tiếng Pháp ”Programmation en Logique” • Hệ Prolog đời vào năm 1973 Alain Colmerauer 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 hệ dịch ngôn ngữ tự nhiên • Điều khác 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 đề câu logic • • Hệ sử dụng lập luận logic để tìm câu trả lời cho vấn đề • Một chương trình Prolog gồm dãy luật có dạng: A :- B1, , Bm • đó, m ≥ 0, A Bi (i = 1, , m) câu phân tử Luật đọc “A B1 • Bm” Nó cách viết Prolog logic mênh đề sau: • A B B m ⇒ ∧ ∧… • Trong luật trên, A gọi đầu, danh sách câu Bi (B1, , Bm) gọi thân luật • Nếu m=0, ký hiệu “:-” bỏ đi, ta có câu phân tử A gọi kiện Ví dụ • Giả sử biết thông tin sau An Ba: • An yêu thích môn thể thao mà cậu chơi • Bóng đá môn thể thao • Bóng bàn môn thể thao • An chơi bóng đá • Ba yêu thích thứ mà An yêu thích => Các câu chuyển thành chương trình Prolog sau : • likes(an, X) :- sport(X), plays(an, X) • sport(football) • sport(tennis) • plays(an, football) • likes(ba, Y) :- likes(an, Y) => Câu hỏi : “An yêu thích ?”: ? - likes(an, X) S ROLOG WI Ti ết 3: TRÚC DANH CẤU TRÚC DANH SÁCH Giáo sinh thực hiện: Đặng Thị Mỹ Bình NỘI DUNG I Biễu diễn cấu trúc danh sách II Một số vị từ xử lí danh sách III Các thao tác danh sách I Biễu diễn cấu trúc danh sách - Danh sách kiểu liệu có cấu trúc sử dụng rộng rãi ngôn ngữ lập trình phi số - Một danh sách (list) dãy phần tử kiểu Ví dụ: [ann, tennis, tom, skiing] list viết Prolog - Chú ý list diễn tả Prolog nhị phân - List rỗng diễn tả [ ] Một list khác rỗng gồm có hai thành phần:  Phần tử (head)  Phần đuôi list (tail) - Head ann tennis tom skiing Tail [] Các phần tử list loại đối tượng nào, kể list • Prolog cung cấp ba cách viết danh sách – [Item1, Item2, ] – [Head | Tail] – [Item1, Item2, | others] Prolog dùng dấu | (split) để tách biệt phần head tail list L= [ann, tennis, tom, skiing] L= [ann | [tennis, tom, skiing]] L= [ann, tennis, tom, skiing | []] HOẶC: L= [ann | tennis | [tom, skiing]] … ann tennis tom skiing [] 10 II Một số vị từ xử lí danh sách: có sẵn Prolog VỊ TỪ member(X,L) Ý NGHĨA Kiểm tra xem X có phải phần tử danh sách L không append(L1,L2,L) Ghép danh sách L1 L2 vào thành L nextto(X,Y,L) select(X,L,L1) Kiểm tra xem Y có đứng sau X L không Lấy X khỏi L để trả phần tử lại L1 - Có thể dùng để chèn thêm phần tử vào danh sách VÍ DỤ ?- member(a,[a,b,c]) Yes ?- append([a,b,c],[1,2],L) L = [a, b, c, 1, 2] Yes ?- nextto(b,a,[a,b,c]) No ?- select(3,[3,4,2],L) L=[4,2] Yes 11 VỊ TỪ Ý NGHĨA VÍ DỤ nth0(Index,L,X) Kiểm tra xem phần tử thứ Index (tính từ 0) L có phải X không ?- nth0(1,[a,b,c],a) No nth1(Index,L,X) Kiểm tra xem phần tử thứ Index (tính từ 1) L có phải X không ?- nth1(1,[a,b,c],a) Yes last(L,X) Kiểm tra xem X có đứng cuối L không ?- last([a,b,c,d],d) Yes reverse(L1,L2) Nghịch đảo danh sách L1, kết trả L2 ?- reverse([a,b,c],L) L=[c,b,a] 9.Permutation(L1,L2).Danh sách L2 hoán vị ?- Permutation([a,b ,c], L) danh sách L1 12 III Các thao tác danh sách Kiểm tra phần tử X có mặt danh sách L: * Xây dựng lại số vị từ có sẵn member (X , L) Ví dụ: => tử X thuộc danh sách L nếu: ?-Phần member(a,[a,b,c,d]) Yes X đầu L, ?- X member(d,[a,b,[c,d phần tử của]]) đuôi L a b c d [] No Xây dựng lại hai điều kiện thành hai mệnh đề: ⇒ ?- member([c,d],[a,b,[c,d]]) Sự kiện: member (X, [X | Tail]) Yes Luật: member (X, [Head | Tail]) :- member(X,Tail) 13 Ghép hai danh sách append (L1, L2, L) - Xây dựng lại vị từ này: - Có thể dùng append để phân tách danh sách cho thành danh Xmới ét hai hợp:L1 L2, kết trả L sách -Ghép haitrường danh sách VíVí dụ1 : 1: Nếu ?- append (L1, L2, [a,b,c] ) b], L1 = rỗng thì([a, viết append ([], L, L) dụ ?append [c,sau: d], L) = [] L1Nếu L1 ≠[a, rỗng thìd] gồm đầu đuôi L= b, c, L2 = [a, b, c]; sau: [X | L1] L1 = [a] Yes Kết phép ghép danh sách là: L2 = [b, c]; L1 = [a, b([X ]; | L1], L2, [X | L3]) :- append (L1, L2, L3) append … X L2 L1 L3 14 Nghịch đảo danh sách reverse (L1, L2) - Nghịch đảo danh sách L1, kết trả danh sách L2 - Ví dụ: ?- reverse([a, b, c, d], L) L = [d, c, b, a] Yes a b c d [] - Thủ tục nghịch đảo viết sau: Reverse ([], []) Reverse ([X | Tail], L) :- Reverse (Tail, L1), append (L1, [X], L) Trong đó: L1 danh sách nghịch đảo trung gian 15 Hoán vị danh sách permutation (L1, L2) - Danh sách L2 hoán vị danh sách L1 - Ví dụ: ?- permutation([a, b, c], L) L = [a,b,c] ; L = [a,c,b] ; L = [c,b,a] ; … - Thủ tục hoán vị viết Prolog sau: permutation ([], []) permutation ([X | L], P) :- permutation(L, L1), insert(X, L1, P) 16 H·y nhí! [Item 1, Item 2,… ] [Head | Tail ] [Item 1, Item 2,… | Others ]  Danh sách cấu trúc rỗng gồm hai phần: Head Tail  Prolog quản lí danh sách theo cấu trúc nhị phân có nhiều cách biểu diễn DS  Các thao tác thường dùng với danh với Tail, Others danh sách sách là: kiểm tra xem phần tử có thuộc DS không, nghịch đảo danh sách, hoán vị danh sách,… 17 Bài tập nhà Bổ sung phần tử vào danh sách Loại bỏ phần tử khỏi danh sách 18 [...]... Item 2,… | Others ]  Danh sách là một cấu trúc hoặc rỗng hoặc gồm hai phần: Head và Tail  Prolog quản lí danh sách theo cấu trúc cây nhị phân và có nhiều cách biểu diễn DS  Các thao tác thường dùng với danh với Tail, Others là các danh sách sách là: kiểm tra xem một phần tử có thuộc DS không, nghịch đảo danh sách, hoán vị danh sách,… 17 Bài tập về nhà 1 Bổ sung một phần tử vào danh sách 2 Loại bỏ... sách L1, kết quả trả về L2 4 ?- reverse([a,b,c],L) L=[c,b,a] 9.Permutation(L1,L2) .Danh sách L2 là hoán vị của 5 ?- Permutation([a,b ,c], L) danh sách L1 12 III Các thao tác cơ bản trên danh sách 1 Kiểm tra một phần tử X có mặt trong danh sách L: * Xây dựng lại một số vị từ có sẵn member (X , L) Ví dụ: => tử X thuộc danh sách L nếu: 1 ?-Phần member(a,[a,b,c,d]) 1 Yes X là đầu của L, hoặc nếu 2 ?- X... member([c,d],[a,b,[c,d]]) Sự kiện: member (X, [X | Tail]) Yes Luật: member (X, [Head | Tail]) :- member(X,Tail) 13 2 Ghép hai danh sách append (L1, L2, L) - Xây dựng lại vị từ này: - Có thể dùng append để phân tách danh sách đã cho thành danh Xmới ét hai hợp:L1 và L2, kết quả trả về L sách -Ghép haitrường danh sách VíVí dụ1 : 1: Nếu ?- append (L1, L2, [a,b,c] ) b], L1 = rỗng thì([a, viết như append ([], L,...II Một số vị từ xử lí danh sách: có sẵn trong Prolog VỊ TỪ 1 member(X,L) Ý NGHĨA Kiểm tra xem X có phải là một phần tử của danh sách L không 2 append(L1,L2,L) Ghép danh sách L1 và L2 vào thành L 3 nextto(X,Y,L) 4 select(X,L,L1) Kiểm tra xem Y có đứng ngay sau X trong L không Lấy X ra khỏi L để trả về phần tử còn lại trong L1 - Có thể dùng để chèn thêm 1 phần tử vào danh sách VÍ DỤ 1 ?- member(a,[a,b,c])... c d [] - Thủ tục nghịch đảo được viết như sau: Reverse ([], []) Reverse ([X | Tail], L) :- Reverse (Tail, L1), append (L1, [X], L) Trong đó: L1 là danh sách nghịch đảo trung gian 15 4 Hoán vị danh sách permutation (L1, L2) - Danh sách L2 là hoán vị của danh sách L1 - Ví dụ: 1 ?- permutation([a, b, c], L) L = [a,b,c] ; L = [a,c,b] ; L = [c,b,a] ; … - Thủ tục hoán vị được viết trong Prolog như sau:... thìd] nó gồm một đầu và một đuôi L= b, c, L2 = [a, b, c]; như sau: [X | L1] L1 = [a] Yes Kết phép ghép danh sách là: L2 quả = [b, c]; L1 = [a, b([X ]; | L1], L2, [X | L3]) :- append (L1, L2, L3) append … X L2 L1 L3 14 3 Nghịch đảo danh sách reverse (L1, L2) - Nghịch đảo danh sách L1, kết quả trả về danh sách L2 - Ví dụ: 1 ?- reverse([a, b, c, d], L) L = [d, c, b, a] Yes a b c d [] - Thủ tục nghịch... 4 ?- select(3,[3,4,2],L) L=[4,2] Yes 11 VỊ TỪ Ý NGHĨA VÍ DỤ 5 nth0(Index,L,X) Kiểm tra xem phần tử thứ Index (tính từ 0) của L có phải là X không 1 ?- nth0(1,[a,b,c],a) No 6 nth1(Index,L,X) Kiểm tra xem phần tử thứ Index (tính từ 1) của L có phải là X không 2 ?- nth1(1,[a,b,c],a) Yes 7 last(L,X) Kiểm tra xem X có đứng cuối trong L không 3 ?- last([a,b,c,d],d) Yes 8 reverse(L1,L2) Nghịch đảo danh sách... Others là các danh sách sách là: kiểm tra xem một phần tử có thuộc DS không, nghịch đảo danh sách, hoán vị danh sách,… 17 Bài tập về nhà 1 Bổ sung một phần tử vào danh sách 2 Loại bỏ một phần tử ra khỏi danh sách 18 ... TRÚC DANH CẤU TRÚC DANH SÁCH Giáo sinh thực hiện: Đặng Thị Mỹ Bình NỘI DUNG I Biễu diễn cấu trúc danh sách II Một số vị từ xử lí danh sách III Các thao tác danh sách I Biễu diễn cấu trúc danh. .. số vị từ xử lí danh sách: có sẵn Prolog VỊ TỪ member(X,L) Ý NGHĨA Kiểm tra xem X có phải phần tử danh sách L không append(L1,L2,L) Ghép danh sách L1 L2 vào thành L nextto(X,Y,L) select(X,L,L1)... reverse(L1,L2) Nghịch đảo danh sách L1, kết trả L2 ?- reverse([a,b,c],L) L=[c,b,a] 9.Permutation(L1,L2) .Danh sách L2 hoán vị ?- Permutation([a,b ,c], L) danh sách L1 12 III Các thao tác danh sách Kiểm

Ngày đăng: 22/12/2016, 12:50

TỪ KHÓA LIÊN QUAN

w