1. Trang chủ
  2. » Luận Văn - Báo Cáo

Biểu diễn logic vị từ bằng ngôn ngữ prolog

30 1,7K 5

Đ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 755,57 KB

Nội dung

Các tham số có thể là các hằng hoặc biến có kiểu tương thích với các kiểu tương ứng đã được khai báo trong các vị từ ở trong phần predicates; các tham số được viết cách nhau bởi dấu phẩy

Trang 1

ic vị từ b

n

CM, Tháng

NGHỆ TH GIA TPHCM

ôn ngữ P

N

C DỤNG

Prolog

G

Trang 2

Mục lục

Lời nói đầu 3

Phần 1: Ngôn ngữ Prolog 4

1.1 Giới thiệu 4

1.2 Các thuật ngữ 4

1.3 Các kiểu dữ liệu 5

1.4 Chú thích 6

1.5 Biến 6

1.6 Phép toán số học 6

1.7 Sự kiện và luật 7

1.8 Chương trình Prolog 9

1.9 Phép hợp nhất 13

1.10 Cơ chế tìm câu trả lời của Prolog 14

1.11 Sự quay lui (back-tracing) 16

1.12 Nhát cắt 18

1.13 Cấu trúc danh sách 19

Phần 2: Một số chương trình minh họa bằng Prolog 21

2.1 Bài toán Tháp Hà Nội 22

2.2 Bài toán Tính giai thừa 24

2.3 Bài toán gia hệ 25

Tài liệu tham khảo 30

Trang 3

Lời nói đầu

Trong thời đại của công nghệ thông tin, ngày càng có nhiều ứng dụng thông minh hơn hỗ trợ con người trong nhiều lĩnh vực như giáo dục, kinh doanh, Các chương trình dạy học, ôn tập, tư vấn chiến lược kinh doanh ngày càng phổ biến Hầu hết các phần mềm, trang web như thế đều phải dựa trên những tri thức nhất định về một lĩnh vực nào

đó và chúng được chọn lọc, mô hình hóa và biểu diễn lại dưới dạng mà máy có thể hiểu

và cũng gần gũi với con người Có nhiều mô hình biểu diễn tri thức cơ bản, phổ biến là dùng logic vị từ, mạng ngữ nghĩa, hệ luật dẫn, …Đã từ lâu, sử dụng logic vị từ và sự suy luận logic giúp giải quyết các vấn đề nhanh hơn và ngắn gọn hơn Trong lĩnh vực lập trình, cũng đã có nhiều trình biên dịch ra đời hỗ trợ ngôn ngữ lập trình cho lập trình logic Trong số đó nổi bật là Prolog

Tiểu luận này trình bày khái quát về ngôn ngữ Prolog, đồng thời trình bày một vài ví

dụ minh họa cho việc biểu diễn tri thức dùng logic vị từ thông qua ngôn ngữ Prolog

Em xin chân thành cảm ơn PGS.TS Đỗ Văn Nhơn – Giảng viên môn học Biểu Diễn Tri Thức và Ứng Dụng đã truyền đạt cho em những kiến thức vô cùng quý báu Em cũng xin chân thành cảm ơn quý Thầy Cô thuộc phòng đào tạo Sau đại học và các bạn về tài liệu tham khảo để em có thể hoàn thành môn học này

Chân thành cảm ơn!

Trang 4

Phần 1: Ngôn ngữ Prolog

1.1 Giới thiệu

Prolog là một ngôn ngữ lập trình Tên gọi Prolog được xuất phát từ cụm từ tiếng

Pháp Programmation en logique, nghĩa là "lập trình theo lô-gích" Xuất hiện từ năm 1972

(do Alain Colmerauer và Robert Kowalski thiết kế), mục tiêu của Prolog là giúp người dùng mô tả lại bài toán trên ngôn ngữ của logic, dựa trên đó, máy tính sẽ tiến hành suy diễn tự động dựa vào những cơ chế suy diễn có sẵn (hợp nhất, quay lui và tìm kiếm theo chiều sâu) để tìm câu trả lời cho người dùng

Prolog được sử dụng nhiều trong các ứng dụng của trí tuệ nhân tạo và ngôn ngữ học trong khoa học máy tính (đặc biệt là trong ngành xử lý ngôn ngữ tự nhiên vì đây là mục tiêu thiết kế ban đầu của nó) Cú pháp và ngữ nghĩa của Prolog đơn giản và sáng sủa, nó được người Nhật coi là một trong những nền tảng để xây dựng máy tính thế hệ thứ năm

mà ở đó, thay vì phải mô tả cách giải quyết một bài toán trên máy tính, con người chỉ cần

mô tả bài toán và máy tính sẽ hỗ trợ họ phần còn lại

Nguyên lý của lập trình theo lô-gích dựa trên các mệnh đề Horn Một mệnh đề Horn biểu diễn một sự kiện nào đó là đúng hoặc không đúng, xảy ra hay không xảy ra

Một chương trình Prolog là một cơ sở dữ liệu gồm các mệnh đề (clause) Mỗi mệnh

đề được xây dựng từ các vị từ Một vị từ có thể có một hoặc nhiều nguyên tử logic (logic atom) Mỗi logic atom biểu diễn quan hệ giữa các hạng (term) Term có thể sơ cấp (elementary term) như các hằng, các biến và phức hợp (compound term)

Trang 5

Các term phức hợp biểu diễn các đối tượng phức tạp của bài toán đang xét Term phức hợp là một hàm tử (functor) có đối số (argument), các functor này có dạng:

Tên_functor(Đối_1, Đối_2,…, Đối_n)

Tên_functor là một chuỗi gồm các chữ cái và chữ số, và được bắt đầu bằng một chữ cái

thường ; các đối có thể là biến, term sơ cấp hoặc phức hợp

Mệnh đề có thể là một sự kiện, một luật hay một câu hỏi Prolog quy ước sau mỗi mệnh đề cần có một dấu chấm để kết thúc

1.3 Các kiểu dữ liệu

Trong Prolog, có hai dạng kiểu dữ liệu, một là “kiểu sơ cấp”, hai là “kiểu có cấu trúc” Kiểu dữ liệu sơ cấp bao gồm một số kiểu dữ liệu được định nghĩa sẵn trong Prolog, bao gồm:

9 char: kiểu ký tự, khi sử dụng đặt trong cặp dấu nháy đơn Ví dụ: ‘a’, ‘b’, …

9 string: kiểu chuỗi, khi sử dụng đặt trong cặp dấu nháy đôi Ví dụ: “day la chuoi”

Trang 6

Tên các biến sau là không hợp lệ: so_nguyen, 1n, 123, …

Tên các biến sau là hợp lệ: X, Ten, _, _Nam, So_nguyen, …

Trong Prolog, có một biến đặc biệt, không cần chỉ định kiểu khi sử dụng, đó là dấu gạch dưới _ Dấu này được xem như một biến có thể sử dụng cho trường hợp một vị từ nào đó có một đối mà với bất kỳ giá trị nào của đối này cũng nhận được một giá trị duy nhất

1.6 Phép toán số học

Prolog chủ yếu hỗ trợ xử lý các ký hiệu, tuy nhiên, nó cũng hỗ trợ một số phép toán hai ngôi chuẩn như sau:

Trang 7

Với toán tử logic, Prolog sử dụng dấu phẩy , thay cho toán tử and (và) và dấu chấm phẩy ; thay cho or (hoặc)

1.7 Sự kiện và luật

Sự kiện là một vị từ diễn tả một sự thật Để hiểu rõ hơn về sự kiện, xét các ví dụ sau:

Ví dụ 4: “2 là một số nguyên tố” là một sự kiện vì nó diễn tả sự thật “2 là một số nguyên tố” Và diễn đạt nó dưới một vị từ trong Prolog như sau: nguyen_to(2)

Ví dụ 5: Xét cây phả hệ như sau:

Trang 8

nt có hai đối

parent(“marparent(“tomparent(“tomparent(“bil”

parent(“bil”

parent(“sue

từ diễn tả qmệnh đề Tr

u để hiểu rõđịnh nghĩa

t như sau:

(X,Y):-pareiểu là: X làdiễn số nguy

õ hơn về luậthêm vị từ

nt(Y,X)

à con của Yyên N bất k

ể diễn đạt ch

ợc công nhậnghĩa cho m

) với hai đố

cha mẹ của X

ố nguyên tố

tên thể hiệnđạt bằng m

ho cây phả

ận đúng Lumột luật, sử

ối số, mang

X

ta viết:

n cho mối qmột vị từ n

hệ trên thì

uật được trdụng cặp k

g ý nghĩa: X

quan hệ như sau:

cần 6 vị

rình bày

ký tự :-

X là con

Trang 9

“N là một số nguyên tố nếu N>0, M là số nguyên tố nào đó, M<N và N không chia hết cho M” Khi biểu diễn bằng Prolog, có thể viết như sau:

nguyen_to(N):-N>0, nguyen_to(M), M<N, N mod M <> 0

Ví dụ 8: để diễn tả luật: ai là người đều phải chết, ta viết như sau

chet(X):-nguoi(X)

Ở đây, có sự khác nhau cơ bản giữa sự kiện và luật Sự kiện là một điều gì đó luôn đúng và không có ràng buộc Trong khi đó, các luật thì phải phụ thuộc vào các biến hay thuộc tính và khi thoả mãn điều kiện nào đó thì là đúng Một luật thường gồm hai phần: phần bên trái dấu :- được gọi là kết luận hay phần đầu (head) của luật, và phần bên phải được gọi là điều kiện hay phần thân (body) của luật Nếu điều kiện đúng thì phần kết luận cũng đúng và đây là hậu quả logic của phép suy luận (inference)

1.8 Chương trình Prolog

Một chương trình Prolog thường gồm 3 hoặc 4 phần cơ bản như sau: domains, predicates, clauses và goal

Phần domains

Đây là phần định nghĩa kiểu dữ liệu mới dựa vào các kiểu dữ liệu đã biết Các kiểu

dữ liệu được định nghĩa ở đây sẽ được sử dụng cho các đối số trong các vị từ Nếu các vị

từ sử dụng đối số có kiểu cơ bản thì có thể không cần phải định nghĩa lại các kiểu đó Tuy nhiên để cho chương trình sáng sủa, người ta sẽ định nghĩa lại cả các kiểu cơ bản

Cú pháp:

<danh sách kiểu mới> = <kiểu đã biết>

hoặc <danh sách kiểu mới> = <danh sách kiểu đã biết>

<kiểu đã biết>: có thể là kiểu cơ bản (như số nguyên, số thực, …) hoặc các kiểu đã được định nghĩa trước

Trong đó các kiểu mới phân cách nhau bởi dấu phẩy, còn các kiểu đã biết phân cách nhau bởi dấu chấm phẩy

Ví dụ 9:

Trang 10

domains

ten, tac_gia, nha_xb, dia_chi = string

nam, thang, so_luong = integer

dien_tich = real

nam_xb = nxb(thang, nam)

do_vat = sach(tac_gia, ten, nha_xb, nam_xb); xe(ten, so_luong); nha(dia_chi, dien_tich)

Trong ví dụ trên, các kiểu mới đã được định nghĩa, trong đó các kiểu mới ten, tac_gia, nha_xb, dia_chi dựa vào cùng một kiểu cơ bản đã biết là string; các kiểu mới nam, thang, so_luong dựa vào cùng một kiểu đã biết là integer; kiểu mới dien_tich dựa vào kiểu đã biết là real; kiểu mới năm_xb dựa vào kiểu nxb được xây dựng từ các kiểu đã biết là thang, nam; còn kiểu do_vat lại dựa vào các kiểu sach, xe, nha mà các kiểu này lại dựa vào các kiểu đã biết

Phần predicates

Đây là phần bắt buộc phải có Trong phần này, cần phải khai báo đầy đủ các vị từ sử dụng trong phần clauses, ngoại trừ các vị từ mà trình biên dịch Prolog đã xây dựng sẵn

Cú pháp:

<Tên vị từ> (<danh sách các kiểu>)

<danh sách các kiểu> là các kiểu cơ bản hoặc là các kiểu đã được định nghĩa trong phần domains và được viết phân cách nhau bởi dấu phẩy

Trang 11

Trong ví dụ trên ta khai báo năm vị từ Trong đó vị từ so_huu (ten, do_vat) để chỉ một người có tên là ten sẽ sở hữu môt do_vat nào đó Còn vị từ nguyen_to(integer) để xét xem một số nguyên nào đó có phải là số nguyên tố hay không Vị từ thứ ba để xét xem một cái tên ten nào đó có là người không, còn vị từ chet(ten) sẽ xét xem có phải chết hay không

Vị từ cuối cùng đã được xét trong ví dụ bên trên, xét xem một người có tên là ten (đối thứ nhất) có là cha/mẹ của người có tên là ten (đối thứ hai) hay không

Phần clauses

Đây là phần bắt buộc phải có dùng để mô tả các sự kiện và các luật, sử dụng các vị

từ đã khai báo trong phần predicates

Cú pháp:

<Tên vị từ>(<danh sách các tham số>) <kí hiệu>

<Tên vị từ 1>(<danh sách các tham số 1>) <kí hiệu>

………

<Tên vị từ N>(<danh sách các tham số N>) <kí hiệu>

Trong đó: Tên vị từ phải là các tên vị từ đã được khai báo trong phần predicates Các tham số có thể là các hằng hoặc biến có kiểu tương thích với các kiểu tương ứng đã được khai báo trong các vị từ ở trong phần predicates; các tham số được viết cách nhau bởi dấu phẩy Các kí hiệu bao gồm:

:- (điều kiện nếu)

Trang 12

Ví dụ 12: Để diễn tả sự kiện: Tổ hợp chập 0 của N (N bất kỳ) bằng 1, không thể viết Tohop(N,0,1) vì biến N chỉ xuất hiện đúng một lần trong vị từ này, do đó phải viết Tohop(_,0,1)

Phần goal

Trong phần này, người dùng sẽ đưa ra các mục tiêu cần tìm kết quả Đây thực chất

là các câu hỏi mà người dùng muốn Prolog trả lời dựa vào các sự kiện và luật đã được khai báo và định nghĩa ở trên

Cú pháp phần goal giống như cú pháp phần clauses Tức là đưa vào một hoặc một số các vị từ Nếu tất cả các tham số của vị từ là hằng thì kết quả nhận được là true (hoặc Yes

- đúng) hoặc false (hoặc No - sai) Nếu trong các tham số của vị từ có biến thì kết quả trả

về sẽ là các giá trị của biến

Ví dụ 13: muốn biết 4 có phải là số nguyên tố không, trong phần goal sẽ nhập vị từ sau:

nguyen_to(4)

Kết quả nhận được sẽ là true

Nếu phần goal được nhập là nguyen_to(X) thì câu trả lời là X=2

Ngoài các phần chủ yếu nói trên, có thể đưa vào các phần liên quan đến khai báo hằng, các tập tin liên quan hoặc chỉ thị dịch

Ví dụ 14: khai báo hằng

Trang 13

constants

Pi = 3.141592653

Thể hiện phần goal cũng khác nhau tùy theo trình biên dịch, có một số trình biên dịch sẽ cho người dùng nhập phần goal sau dấu nhắc ?- (như B-Prolog hay SWI-Prolog) Tuy nhiên, cũng có trình biên dịch như Turbo-Prolog hay Visual Prolog thì các mục tiêu viết sau từ khóa goal

Ví dụ 15:

7 = 7 Æ true

7 = 8 Æ false

“abc” = “abc” Æ true

“abcd” = “abc” Æ false

2 = 1 +1 Æ false

1+1 = 1+1 Æ true

Một trong hai vế là hằng hoặc trong biểu thức chứa toàn hằng, vế kia là biến hoặc biểu thức có chứa biến

Trường hợp 1: Nếu tất cả các biến đều có giá trị (gọi là các biến ở tình trạng

bound), quay về trường hợp a

7 = X Æ false nếu X đã có giá trị là 6

7 = X +1 Æ true nếu X đã có giá trị là 6

Trang 14

Y = “Socrates”Æ true nếy Y đã có giá trị là “Socrates”

Trường hợp 2: Nếu có biến chưa có giá trị (gọi là biến ở tình trạng unbound), Prolog

sẽ gán giá trị cho biến sao cho hai vế có giá trị như nhau và trả về kết quả là true Nếu không tìm giá trị như vậy, phép hợp nhất sẽ cho kết quả là false

7 = X Æ true nếu X chưa có giá trị, sau phép hợp nhất này, X sẽ có giá trị là 7

-1 = X*X Æ false vì không thể tìm cho X giá trị nào làm cho giá trị hai vế là như nhau b) Cả hai vế đều là biến hoặc các biểu thức có chứa biến

Trường hợp 1: tất cả các biến đều có chứa giá trị, quay về trường hợp a

X = Y Æ true nếu cả X và Y đều đã có giá trị và những giá trị này bằng nhau

X -1 = Y Æ false nếu X và Y đều đã có giá trị và X nhỏ hơn Y

Trường hợp 2: tất cả các biến của một vế đều đã có giá trị, quay về về trường hợp b

X = Y Æ true nếu X chưa có giá trị và Y đã có giá trị, sau phép hợp nhất, X sẽ nhận giá trị của Y

X - 1 = Y Æ true nếu X chưa có giá trị, Y đã có giá trị Sau phép hợp nhất, X sẽ có giá trị bằng Y +1

Trường hợp 3: cả hai vế đều còn chứa biến ở tình trạng unbound thì hợp nhất vẫn

thành công và mỗi khi một biến nào đó trong vế phải hoặc vế trái có giá trị thì biến còn lại cũng sẽ được ràng buộc với giá trị đó

X = Y Æ true nếu cả X và Y đều chưa gán giá trị

X-1 = Y Æ true nếu cả X và Y đều chưa gán giá trị

1.10 Cơ chế tìm câu trả lời của Prolog

Khi người dùng đặt ra cho Prolog một câu hỏi (phần goal), Prolog sẽ thực hiện công việc so trùng (match), tức là tìm mệnh đề đầu tiên đề cập đến khái niệm mà người dùng muốn hỏi Nói một cách chi tiết hơn, Prolog sẽ dùng phép hợp nhất đã trình bày ở phần trên trong quá trình so trùng cấu trúc dữ liệu một mục tiêu với một mệnh đề Giả sử người dùng đặt ra câu hỏi như sau:

nguoi(“Socrates”)

Trang 15

Prolog sẽ tìm mệnh đề đầu tiên có liên quan đến khái niệm nguoi Hiển nhiên, mệnh

đề đầu tiên (và duy nhất) có liên quan đến khái niệm này là: nguoi(“Socrates”)

Như vậy, khi đã có câu hỏi (nguoi(“Socrates”).) và tìm thấy mệnh đề liên quan (nguoi(“Socrates”).), Prolog sẽ tiến hành tìm kiếm lời giải, công việc này tiến hành bằng cách tạo mối liên kết giữa các thông số ở phần câu hỏi và các thông số ở phần mệnh đề Sau khi đã tạo mối quan hệ giữa các thông số ở phần câu hỏi và phần mệnh đề, Prolog sẽ tiến hành các mệnh đề (nếu mệnh đề này một luật) Nếu tất cả các mệnh đề thành công và các biến ở phần câu hỏi đã ở tình trạng bound (tức là đã có giá trị), Prolog sẽ thông báo lời giải

Nếu là câu hỏi thuộc dạng true/false (Yes/No) như ví dụ trên, tức là câu hỏi không chứa biến, Prolog sẽ trả lời true (Yes) nếu công việc hợp nhất thành công và các mệnh đề đều thành công (nếu mệnh đề so trùng là một luật)

Với ví dụ trên, thông số của câu hỏi là một hằng (“Socrates”), và thông số của mệnh

đề tương ứng cũng là một hằng (“Socrates”), hai hằng này hợp nhất thành công, và kết quả trả lời là true(Yes)

Nếu người dùng đặt ra câu hỏi khác: nguoi(“Xeda”)

Prolog cũng chỉ tìm thấy một mệnh đề liên quan đến khái niệm này (nguoi(“Socrates”).), và vì sự hợp nhất giữa hai hằng “Socrates” và “Xeda” thất bại, đáp

số sẽ trả lời là false(No)

Xét trường hợp câu hỏi có chứa biến: nguoi(X)

Hệ thống sẽ tìm thấy mệnh đề có liên quan đến vấn đề này (nguoi(“Socrates”)) , và tiến hành hợp nhất giữa X và “Socrates”, và vì X chưa có giá trị (unbound) nên phép hợp nhất thành công, X có giá trị là ‘“Socrates”

Khi việc hợp nhất giữa các thông số giữa phần câu hỏi và phần mệnh đề đã thành công, tất cả các biến cần tìm đã có giá trị (ở đây chỉ có một biến là X), hệ thống sẽ công

bố đã tìm ra lời giải và in ra giá trị của X ( X = “Socrates”)

Xét trường hợp khi ở câu hỏi so trùng với một luật: chet(Y)

Câu hỏi được so trùng với mệnh đề sau: chet(X): - nguoi (X)

Ngày đăng: 10/04/2015, 09:58

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w