1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Lập trình logic và ràng buộc (Logic Programming and Constraint)

30 445 0
Tài liệu đã được kiểm tra trùng lặp

Đ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 30
Dung lượng 224,5 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Đệ quy• Một mệnh đề đệ quy là mệnh đề đệ quy là mệnh đề sử dụng chính nó để định nghĩa nó.. Các đĩa đặt theo thứ tự từ lớn đến nhỏ từ thấp lên cao; tạo nên một Tòa tháp.. Trò chơi đòi hỏ

Trang 1

Lập trình logic và ràng buộc

( Logic Programming and Constraint)

Ts Lê Mạnh Hải Khoa CNTT,

ĐH Kỹ thuật Công nghệ TP HCM

Trang 3

Xử lý danh sách

Danh sách (list) là cấu trúc dữ liệu quan trọng

•Biểu diễn danh sách [X], [a,b,c], [], [Head|Tail].

•Các vị từ build-in (/doc/Manual/lists.html‘)

– member(?Elem, ?List), delete(+List1, @Elem, -List2)

– append(?List1, ?List2, ?List1AndList2),

– select(?Elem, ?List1, ?List2)

– nextto(?X, ?Y, ?List), last(?List, ?Last)

– nth0(?Index, ?List, ?Elem), nth1(?Index, ?List, ?Elem)

– max_member(-Max, +List), min_member(-Max, +List),

– sum_list(+List, -Sum)

Trang 4

Kiểm tra hoạt động

Trang 5

Kiểm tra hoạt động

Trang 8

Suy diễn lùi (BackTracking)

Chẳng hạn ta có định nghĩa vi từ bigger sau

bigger(N,M):-N =:= M, write(‘bigger(N,M):-Numbers are the same‘).

Bây giờ ta truy vấn

?- bigger(5,4)

Prolog làm gì?

Trang 9

bigger(N,M):-N =:= M, write(‘Numbers are the same‘).

Trang 11

bigger(5,4):-5 > 4,  succeeds, go on with body.

write(‘The bigger number is ‘), write(N) bigger(N,M):-

N =:= M, write(‘Numbers are the same‘)

Đến dấu chấm

= thành công

Trang 12

Backtracking – Suy diễn lùi

?- bigger(5,5)  If our query only matches the final clause

bigger(5,5):-5 =:= bigger(5,5):-5,

write(‘Numbers are the same‘).

 Đã biết trước là không xảy ra

Clauses should be ordered according to specificity Most specific at top Universally applicable at bottom

Trang 14

Đệ quy

• Một mệnh đề đệ quy là mệnh đề đệ quy là mệnh đề sử dụng

chính nó để định nghĩa nó

• Một mệnh đề đệ quy sẽ bị lặp vô hạn nếu không có điều kiện

thoát Vì vậy phải có định nghĩa trường hợp cụ thể không

đệ quy ngay trước mô tả đệ quy

Trang 15

Ví dụ 2: Bài toán tháp Hà nội

Đế đặt nằm ngang; các cột thẳng đứng Các đĩa đặt theo thứ tự từ lớn đến nhỏ từ thấp lên cao; tạo nên một Tòa

tháp Trò chơi đòi hỏi di chuyển các đĩa, bằng cách đặt chúng vào cột bên cạnh, một đĩa trong một di chuyển,

theo luật sau:

I Sau mỗi di chuyển, các đĩa đều nằm trên một, hai, hoặc ba cột, theo thứ tự từ lớn đến nhỏ từ thấp đến cao

II Đĩa trên cùng của một trong ba cột đĩa được đặt vào cột rỗng

III Đĩa trên cùng của một trong ba cột đĩa được đặt lên một cột đĩa khác, nếu đĩa này nhỏ hơn các đĩa của cột

này

Trang 16

Lưu đoạn code sau vao file hanoi.pl

move(1,X,Y,_)

:-write('chuyen dia tren cung tu '),

write(X), write(' sang '),write(Y), nl.

chuyen dia tren cung tu giua sang trai

chuyen dia tren cung tu giua sang phai

chuyen dia tren cung tu trai sang phai

Trang 19

Cắt “!”

• Cắt không làm thay đổi kết quả truy vấn

• Cắt chỉ giới hạn số phép quay lui khi điều kiện ngay trước đó đã được thỏa mãn.

– Nhanh hơn

– Chống đệ quy vô hạn

Trang 20

Bài tập 2

Sắp xếp một danh sách theo thứ tự tăng dần

• Bubble sort? QuickSort? MergeSort?

•Prolog “ưa” các giải thuật đệ quy => QS và MS dễ viết hơn!

Trang 23

Bài tập

1 Viêt một chương trình để bỏ ba phần tử đầu của một danh

sách

2 Định nghĩa hai vị từ :

even_length( List ) và odd_length( List ) để kiểm tra số các

phần tử của một danh sách là chẵn hay lẻ

Ví dụ danh sách :

even_length([ a, b, c, d ]) là true

even_length([ a, b, c]) là false

Trang 24

3 Viêt chương trình Prolog kiểm tra một danh sách có phải

là một tap hợp con của một danh sách khác không ?

Trang 25

5 Viết chương trình Prolog kiểm tra hai danh

sách có rời nhau không

Trang 26

Bài kế tiếp

Cơ sở dữ liệu

Xuất nhập

Trang 27

Cơ sở dữ liệu

• Tổ chức cơ sở dữ liệu dưới dạng bảng

• Các bảng có mối liên kết (quan hệ ràng buộc)

Trang 28

• ‘bảng’ family

family(individual(…), individual(…), [individual(…)]) Với ám chỉ ngôi

1 là chồng, ngôi 2 là vợ, ngôi 3 là danh sách các con.

family(individual( tom, smith, date(7, may, 1960),

work(microsoft, 30000) ),

individual( ann, smith, date(9, avril, 1962),inactive),

[ individual( roze, smith, date(16, june, 1991), inactive),

individual( eric, smith, date(23, march, 1993), inactive) ] ).

husban( X ) :- % X là chồng

family( X , _ , _ ).

wife( X ) :- % X là vợ

family( _, X , _ ).

children( X ) :- % X là một người con,

family( _, _ , Children ), member( X, Children )

Trang 29

Ta định nghĩa một số vị từ để tiện truy vấn

exist( Individual ) :- % mọi thành viên của gia dình

husban( Individual ) ;

wife( Individual ) ;

chidren( Individual ) % dấu ; là hoặc, dấu , là và!!!

dateofbirth( individual( _ , _, Date , _ ), Date )

salary( individual( _ , _, _ , work( _ , S ) ), S )

salary( individual( _ , _, _ , inactive ), 0 )

Tại sao phải có 2 định nghĩa salary?

Trang 30

Truy vấn dữ liệu

Các lệnh truy vấn sau đây sẽ trả lại những thông tin gì?

?- exist( individual( Firstname, Lastname, _ , _ ) ).

?- chidren( X ), dateofbirth( X, date( _ , _ , 1991 )).

?- wife( individual( Firstname, Lastname, _ , work( _, _ ) ) ).

Hãy viết các lệnh truy vấn các thông tin sau:

1.Tìm những người sinh trước 1975 không có việc làm

2.Tìm những người sinh trước 1970 có thu nhập trên 10000 3.Tìm những gia đình có trên 3 người con.

Ngày đăng: 25/08/2017, 09:17

TỪ KHÓA LIÊN QUAN

w