Cài đặt và chạy demo ứng dụng

Một phần của tài liệu (LUẬN văn THẠC sĩ) nghiên cứu lập trình logic tập trả lời và ứng dụng (Trang 49 - 64)

Demo đƣợc xây dựng từ ngôn ngữ lập trình Visual.net tích hợp công cụ sm.exe/ lp.exe để thực hiện các chƣơng trình Smodels và dlv mở rộng với các tùy chọn khác nhau. Chƣơng trình demo gồm các chức năng chính: hệ soạn thảo, truyền tham số thực thi tập tin các tập tin dạng …..sm/lp thông qua thƣ viện lệnh của lp và hiển thị kết quả.

Phần chạy demo thực hiện việc mã hóa các ví dụ trong chƣơng 1, chƣơng 2 và chƣơng 3 bằng hệ thống lập trình logic SMODELS cùng DLV mở rộng và thực thi các ví dụ này.

Hình 3.2 Giao diệnhệ thống trình biên dịch Lập trình logic tập trả lời

Bài toán 3.1 [7] Xét chƣơng trình logic mở rộng P mô tả bài toán “Giải câu đố Sudoku”, Sudoku là một trò chơi trí tuệ nổi tiếng đƣợc nhiều đối tƣợng tham gia, ra đời tại Nhật Bản. Trong phần này sẽ trình bày giải pháp biểu diễn tri thức cho các quy tắc Sudoku trong ASP. Các tập trả lời của chƣơng trình tƣơng ứng với các giải pháp của câu đố Sudoku. Ngày nay Sudoku có nhiều biến thể khác nhau 9x9, 3x3, 4x4, 6x6, 5x5, 7x7, 8x8, 16x16x 12x12, 25x25, …nhƣng biểu diễn ở đây chỉ áp dụng Sudoku dạng chuẩn 9x9 (hình 3.1). Biểu diễn trò chơi trên một mạng lƣới 9x9 đƣợc chia nhỏ thành 3x3 khu vực. Một đề Sudoku là một hình vuông, mỗi chiều có 9 ô nhỏ, hợp thành 9 cột, 9 hàng và đƣợc chia thành 9 ô lớn 3x3. Một vài ô nhỏ đƣợc đánh số, đó là những manh mối duy nhất để tìm lời giải. Tùy theo mức độ nhiều hay ít của các manh mối, các câu đố đƣợc xếp loại dễ, trung bình, khó hay cực khó.

7 1 9 3 7 2 5 6 5 6 2 9 3 4 5 6 1 2 8 8 9 4 7 5 Hình 3.3 Câu đố Sudoku

Cách chơi Sudoku là điền số từ 1 để 9 vào những ô trống sao cho mỗi cột dọc, mỗi hàng ngang, mỗi phân vùng nhỏ có đủ các số từ 1 đến 9 mà không đƣợc lập lại. Để mô tả các tên miền của câu đố Sudoku, tên cho các địa điểm và các khu vực của lƣới điện. Khi đó, sử dụng tọa độ là cặp số 1- 9 biểu diễn tên các vị trí trong lƣới. Khu vực đƣợc đánh số từ 1 đến 9 mô tả số “so(N)” vào vị trí của lƣới điện, biểu diễn mối quan hệ: vitri(N, X, Y) ← “số

N đƣợc đặt tại vị trí (X, Y)”; thuocvung(X, Y, R) ← “vị trí (X,Y) thuộc khu vực R”. Tìm tập hợp các nguyên tố từ vitri(N, X, Y) có đủ bốn điều kiện trên (mỗi vị trí là một số, mỗi dòng, mỗi cột, mỗi vùng không đƣợc có hai số giống nhau). Mỗi một vị trí (X, Y) có duy nhất một số N đƣợc đặt vào. Xét chƣơng trình logic mô tả Sudoku nhƣ sau:

r1: so(N) ←

r2: toado(X,Y) ← so(X), so (Y).

r3: vitri(1, X, Y) vitri(2, X, Y) vitri(3, X, Y) vitri(4, X, Y) vitri(5, X, Y) vitri(6, X, Y) vitri(7, X, Y) vitri(8, X, Y) vitri(9, X, Y) ← toado(X, Y).

r4: vitri(N, X, Y2) ← vitri(N, X, Y1), toado(X, Y2).

r5: vitri (N, X2, Y) ← vitri(N, X1, Y), toado(X2, Y).

thuocvung(X1, Y1, R), thuocvung(X2, Y2, R), R=((X − 1)/3) ∗ 3 + ((Y + 2)/3). r7: thuocvung(X, Y, R) ←so(X), so(Y), so(Z1), so(Z2), so(Z3), so(Z4), so(Z5), so( R), Z1 = X−1, Z2 = Z1/ 3, Z3 = Z2∗ 3, Z4 = Y+ 2, Z5 = Z4/ 3, R = Z3 + Z5.

vitri(7,2,1) ←, vitri(1,4,1) ←, vitri(9,1,2) ←, vitri(3,6,2) ←,

vitri(7,6,3) ←, vitri(2,8,3) ←, vitri(5,9,3) ←, vitri(6,2,4) ←,

vitri(5,3,5) ←, vitri(6,5,5) ←, vitri(2,7,5) ←, vitri(9,8,5) ←,

vitri(3,1,6) ←, vitri(4,4,6) ←, vitri(5,5,6) ←, vitri(6,9,6) ←,

vitri(1,1,7) ←, vitri(2,2,7) ←, vitri(8,4,7) ←, vitri(8,1,8) ←,

vitri(9,3,8) ←, vitri(4,7,8) ←, vitri(7,9,8) ←, vitri(5,1,9) ←,

Quy tắc r3 nói rằng đặt số N1 hoặc N2 hoặc N3 hoặc …tới N9 vào tọa độ(X, Y). Quy tắc r4, r5 nói rằng không có hàng Y, cột X nào có hai số giống nhau. Quy tắc r6 nói rằng không có khu vực nào chứa cùng một số hai lần và để xác định đƣợc mối quan hệ trong khu vực R, áp dụng công thức tính khu vực nhƣ trên. Quy tắc r7 nói rằng việc biểu diễn cho một vị trí ban đầu trong lƣới điện từ Hình 3.1 bởi một tập hợp các nguyên tố của vitri(N, X, Y), và tính tập câu trả lời của chƣơng trình này. Chúng chứa các giải pháp của câu đố. Các câu đố trong Hình 3.1 đƣợc mã hóa theo dữ liệu trên.

Chƣơng trình logic đƣợc cài đặt trong hệ thống tích hợp Smodels và DLV mở rộng (đƣợc lƣu với tập tin có tên caudosudoku.lp) nhƣ sau:

Vào

Lƣới điện Sudoku = (R,N).

- toado(X, Y): Lƣới điện Sudoku có kích thƣớc 9x9 và số phần tử Sudoku có trên lƣới điện (Sudoku = 9).

Ra

- Vitri(N, X, Y):vị trí 9 ô số trên vùng của lƣới điện Sudoku 9x9

Chƣơng trình

so(1..9).

toado(X,Y) :- so(X), so(Y).

 Vị trí các số từ 1-9 trên mạng lưới 9x9:

vitri(1,X,Y)|vitri(2,X,Y)|vitri(3,X,Y)|vitri(4,X,Y)| vitri(5,X,Y)|vitri(6,X,Y)|vitri(7,X,Y)|vitri(8,X,Y)| vitri(9,X,Y) :- toado(X,Y).

 Trên một dòng không có hai số giống nhau:

-vitri(N,X,Y2):- vitri(N,X,Y1), toado(X,Y2).

 Trên một cột không có hai số giống nhau:

-vitri(N,X2,Y):-vitri(N,X1,Y), toado(X2,Y).

 Trên một vùng không có hai số giống nhau:

-vitri(N,X2,Y2):- vitri(N,X1,Y1), thuocvung(X1,Y1,R), thuocvung(X2,Y2,R).

 Một vùng là 3x3 khu vực trong lưới Sudoku:

thuocvung(X,Y,R) :- so(X), so(Y), so(Z1), so(Z2), so(Z3), so(Z4), so(Z5), so(R),

Z1 = X-1, Z2 = Z1/3, Z3 = Z2*3, Z4 = Y+2, Z5 = Z4/3,

R = Z3 + Z5.

 Biểu diễn một số câu đố cụ thể.

 vitri(N,X,Y) là đúng khi N là số và (X,Y) là tọa độ trong lưới Sudoku.

vitri(7,2,1). vitri(1,4,1). vitri(9,1,2). vitri(3,6,2). vitri(7,6,3). vitri(2,8,3). vitri(5,9,3). vitri(6,2,4). vitri(5,3,5). vitri(6,5,5). vitri(2,7,5). vitri(9,8,5).

vitri(3,1,6). vitri(4,4,6). vitri(5,5,6). vitri(6,9,6). vitri(1,1,7). vitri(2,2,7). vitri(8,4,7). vitri(8,1,8). vitri(9,3,8). vitri(4,7,8). vitri(7,9,8). vitri(5,1,9). Tiến hành thực thi chƣơng trình này trong DLV mở rộng ta nhận đƣợc tập trả lời đƣợc cho ở hình sau:

Hình 3.4 Kết quả thực thi bài toán 3.1 bằng hệ thống tích hợp Smodels và DLV mở rộng

Bài toán 3.2: Xét chƣơng trình logic mở rộng P mô tả “câu đố bí ẩn”. Trong bài toán này, việc biểu diễn tri thức về một thám tử hay câu chuyện bí ẩn cũng có thể là một thử thách thú vị. Không giống nhƣ Sudoku là không đủ để biết các câu đố của "quy tắc" để tìm giải pháp của nó. Với bài toán này, chƣơng trình giải quyết các câu đố dựa vào một số tri thức thông thƣờng. Nội dung câu đố bí ẩn nhƣ sau:

tình nghi. Lễ nói rằng ông đã không làm điều đó. Ông nói rằng Nghĩa là ngƣời bạn của nạn nhân nhƣng Trí ghét nạn nhân. Nghĩa nói rằng ông đã đƣợc ra khỏi thị trấn trong ngày xảy ra án mạng, và bên cạnh đó ông cũng không biết anh chàng đó. Trí nói rằng ông vô tội và ông đã nhìn thấy NhânNghĩa với nạn nhân ngay trƣớc khi vụ án xảy ra. Giả sử tất cả mọi ngƣời - ngoại trừ kẻ sát nhân - là nói sự thật. Vậy ai là ngƣời vô tội, ai là ngƣời có tội. Chƣơng trình logic mô tả bài toán 3.2 nhƣ sau:

r1: nguoi(A) ←, nguoi(B) ←, nguoi(C) ←, nguoi(D) ←

r2: nguoi(P) ← votoi(P), cotoi(P)

r3: noi(B) ← ghet(D, A), ban(C, A), not cotoi(B, 0)

r4: noi(C) ← roithixa(C, 1), not biet(A, 1)

r5: noi(D) ← votoi(D, 1), cungnhau(B, A), cungnhau(C, A)

r6: co(S) ← noi(P, S, 1), co(cotoi(P))

r7: co(S) ← noi(P, S, 0), co(cotoi(P))

r8: cotoi(B) cotoi(C) cotoi(D)←co(S)

r9: co(cotoi((P)) ← nguoi(P), not co(cotoi(P))

r10: co(cungnhau(A, B)) ← co(cungnhau(B,A))

r11: co(cungnhau(A, B)) ← co(cungnhau(A,C)), co(cungnhau(C,B))

r12: co(ban(A, B)) ← co(cungnhau(B,A))

r13: co(cotoi(P)) ← co(votoi(P))

r14: co(ban(A, B)) ← co(roithixa(P)).

r15: co(ban(A, B) ← co(biet(A, B))

r16: co(roithixa(P) ← co(cotoi(P))

r17: cotoi(P) ← co(cotoi(P)).

nguoi(Nhan) ←, nguoi(Le) ←, nguoi(Nghia) ←, nguoi(Tri) ←

votoi(P) có nghĩa P là ngƣời vô tội, cotoi(P) có nghĩa P là ngƣời có tội,

cotoi(B, 0) có nghĩa B là ngƣời không có tội, votoi(D, 1) có nghĩa D là một ngƣời vô tội. Quy tắc r1 nói rằng có bốn ngƣời xuất hiện. Quy tắc r2 nói ngƣời

P có thể vô tội hay có tội. Quy tắc r3 đến r5 hiển thị câu nói bốn ngƣời. Quy tắc r6 nói rằng nếu ngƣời P nói S là đúng. Quy tắc r7 nói rằng ngƣời P nói S là sai. Quy tắc r8 nói rằng một trong những nghi phạm B hoặc C hoặc D là có tội, S sẽ trả lời đúng, sai. Quy tắc r9 biểu diễn các mối quan hệ của những nghi phạm theo tri thức thông thƣờng (bình thƣờng mọi ngƣời không giết ngƣời). Quy tắc r10 đến r12 biểu diễn các quy tắc theo dạng đối xứng, bắc cầu. Quy tắc r13 nói rằng ngƣời có tội không là vô tội. Quy tắc r14 đến r16 biểu diễn ngƣời ra khỏi thị trấn. Quy tắc r17 hiển thị câu trả lời mối quan hệ ngƣời có tội.

Câu trả lời của các chƣơng trình này là cotoi(Nghia), một cách chính xác kết luận rằng Nghĩa là có tội.

Chƣơng trình logic đƣợc cài đặt trong hệ thống tích hợp Smodels và DLV mở rộng (đƣợc lƣu với tập tin có tên caudobian.lp) nhƣ sau:

Vào

- Có 4 ngƣời. Vị từ nguoi(A) có nghĩa A là ngƣời. - Có hai kiểu ngƣời Có tội và vô tội.

Ra

- Xác định trong 3 ngƣời ai là ngƣời vô tội, ai là ngƣời có tội.

Chƣơng trình

 Có 4 người trong câu đố này nguoi(Nhan).

person(Le). person(Nghia). person(Tri).

noi(Le, cotoi(Le), 0). %% Ông nói rằng ông không có tội. noi(Le, ghet(Tri, Nhan), 1). %% Trí ghét Nhân.

noi(Le, ban(Nghia, Nhan), 1). %% NghĩaNhân là bạn.

%% Nghĩa nói:

noi(Nghia,roithixa(Nghia),1). %% Ông rời khỏi thị xã.

noi(Nghia,biet(Nghia,Nhan,0). %% Ông nói không biết Nhân. %% Trí nói:

noi(Tri,votoi(Tri),1). %% Ông nói ông là người vô tội. noi(Tri,cungnhau(Le,Nhan),1). %% Ông thấy Lễ cùng Nhân trước khi ông rời thị xã. noi(Tri,cungnhau(Nghia,Nhan),1). %% Thấy Nghĩa cùng với Nhân trước khi rời thị xã.

%% Tất cả mọi người, ngoại trừ người có tội là nói sự thật:

co(S):- noi(P,S,1), -noi(cotoi(P)). -co(S):- noi(P,S,0),

-noi(cotoi(P)).

%% Thông thường thì người không có tội.

-co(cotoi(P)):- nguoi(P),not co(cotoi(P)). %% Biểu diễn mối quan hệ đối xứng và bắc cầu:

co(cungnhau(A,B)) :- co(cungnhau(B,A)).

co(cungnhau(A,B)) :- co(cungnhau(A,C)),co(cungnhau(C,B)). %% Biểu diễn mối quan hệ bạn bè theo đối xứng

co(ban(A,B)) :- co(ban(B,A)). %% Có tội không là vô tội:

:- co(votoi(P)),co(cotoi(P)).

%% Biểu diễn người không ở cùng nhau mà rời khỏi thị xã: :- co(roithixa(A)),co(cungnhau(A,B)).

%% Những bạn biết nhau:

:- -co(biet(A,B)),co(ban(A,B)).

:- co(cotoi(P)),co(roithixa(P)). %% Hiển thị:

cotoi(P) :- co(cotoi(P)).

% Có tội là một trong hai Lễ, Nghĩa hoặc Trí

co(cotoi(Le)) | co(cotoi(Nghia)) | co(cotoi(Tri)). %% Để sử dụng quy tắc chọn, thay thế tuyển

%% 1{co(cotoi(Le)); co(cotoi(Nghia)); co(cotoi(Tri))}1. Tiến hành thực thi chƣơng trình này trong hệ thống tích hợp Smodels và DLV mở rộngta nhận đƣợc tập trả lời đƣợc cho ở hình sau:

Hình 3.5 Kết quả thực thi bài toán 3.2 bằng hệ thống tích hợp Smodels và DLV mở rộng

Chƣơng trình logic mở rộng mô tả bài toán nhƣ ví dụ 2.9. Chƣơng trình logic đƣợc cài đặt trong hệ thống tích hợp Smodels và DLV mở rộng (đƣợc lƣu với tập tin có tên chedohotro.lp) nhƣ sau:

Vào

- Có trẻ mồ côi và trẻ không mồ côi. Vị từ tremocoi(X), có nghĩa X là trẻ mồ côi

- Chƣơng trình hỗ trợ cho trẻ mồ côi. Vị từ chuongtrinh(N), có nghĩa N là chƣơng trình hỗ trợ cho trẻ

Ra

- Xác định trẻ mồ côi hƣởng hỗ trợ theo chƣơng trình nào, trẻ không mồ côi đƣợc chƣơng trình nào hỗ trợ.

Chƣơng trình

chuongtrinh(0). chuongtrinh(1).

%% Mặc định d1: Một đứa trẻ mồ côi được hưởng theo chương trình 1

hotro(X,1) :- ghi(X),

tremocoi(X), not ab(d1(X)),

not -hotro(X,1).

%% Mặc định d2: Một đứa trẻ sẽ được hưởng chương trình 0 hotro(X,0) :- ghi(X),

treem(X),

not ab(d2(X)),

not -hotro(X,0). %% Một trẻ không được hưởng nhiều chương trình. -hotro(X,N2) :- chuongtrinh(N1), chuongtrinh(N2), ghi(X),

%% Một đứa trẻ mồ côi không được hưởng chương trình 0: -hotro(X,0) :- ghi(X),

tremocoi(X).

%% Mặc định d2 không thể áp dụng nếu đứa trẻ là trẻ mồ côi:

ab(d2(X)) :- ghi(X),

not -tremocoi(X).

%% X không được hưởng bất kỳ chương trình nào khi X là không xác định.

-hotro(X,N) :- ghi(X),

khongxacdinh(X),

chuongtrinh(N). %% X không được hỗ trợ chương trình nào nếu X không là một đứa trẻ.

-hotro(X,N) :- ghi(X),

-treem(X),

chuongtrinh(N). %% Nếu bạn không biết hoặc biết X là trẻ mồ côi, %% Kiểm tra trạng thái.

kiemtra(X) :- ghi(X), not -tremocoi(X), not tremocoi(X). %% Dữ liệu: ghi(Hoa). cha(Phuc,Hoa). me(Lanh,Hoa). treem(Hoa). ghi(Phuc). cha(Thien,Phuc). me(Thanh,Phuc). khongxacdinh(Phuc). cho(Lanh).

khongxacdinh(Lanh). ghi(Dung).

treem(Dung). me(Lanh,Dung).

%% Mở rộng cơ sở tri thức

%% Dung có một người cha là Hạnh. %% cha(Hanh,Dung).

%% ghi(Hanh).

%% Chúng tôi có đầy đủ thông tin về một người, khongxacdinh (CWA)

-khongxacdinh(P) :- dhi(P),

not khongxacdinh(P).

%% Chúng tôi có đầy đủ thông tin về một đứa trẻ,treem (CWA):

-treem(X) :- ghi(X),

not treem(X).

%% P được coi là một đứa trẻ mồ côi nếu cha mẹ đứa trẻ là không xác định.

tremocoi(P) :- treem(P),

chakhongxacdinh(P).

%% Chúng ta biết rằng P không phải là một đứa trẻ mồ côi nếu cha mẹ của chúng không phải là không xác định

-tremocoi(P) :- ghi(P), not cothetremocoi(P). cothetremocoi(P) :- ghi(P), treem(P), not -chamekhongxacdinh(P). chame(X,P) :- cha(X,P). chame(X,P) :- me(X,P). chamekhongxacdinh(P) :- cha(X,P), khongxacdinh(X), me(Y,P),

khongxacdinh(Y). -chamekhongxacdinh(P) :- chame(X,P), -khongxacdinh(X).

Tiến hành thực thi chƣơng trình này trong hệ thống tích hợp Smodels và DLV mở rộngta nhận đƣợc tập trả lời đƣợc cho ở hình sau:

Hình 3.6 Kết quả thực thi bài toán 3.3 bằng hệ thống tích hợp Smodels và DLV mở rộng

Bài toán 3.4: Cài đặt bài toán ở ví dụ 2.8 về xác định “sinhviennhutnhat”

Chƣơng trình logic mở rộng mô tả bài toán nhƣ ví dụ 2.8 Chƣơng trình logic đƣợc cài đặt trong hệ thống tích hợp Smodels và DLV mở rộng (đƣợc lƣu với tập tin có tên sinhviennhutnhat.lp) nhƣ sau:

Vào

- Có 4 sinh viên, vị từ sinhvien(S) có nghĩa S là sinh viên - Có 3 môn học, vị từ monhoc(D) có nghĩa D là môn học

- Xác định trong 4 sinh viên ai là sinh viên sợ học môn Toán

Chƣơng trình

%% Thông thường sinh viên rất sợ học môn toán. %% Mai thì không sợ điều đó.

%% Sinh viên chuyên toán cũng không sợ

%% Sinh viên chuyên tin có thể sợ hoặc không sợ. sinhvien(duy). sinhvien(mai). sinhvien(duyen). sinhvien(dung). monhoc(ngoaingu). monhoc(tin). monhoc(toan). thuoc(duy,ngoaingu). thuoc(mai,tin). thuoc(Duy,tin). thuoc(dung,toan). -thuoc(S,D1) :- monhoc(D1), thuoc(S,D2), D1!= D2. so(S,toan) :- sinhvien(S), not ab(d(S)), not -so(S,toan). -so(mai,toan). ab(d(mai)). -so(S,toan) :- thuoc(S,toan). ab(d(S)) :- sinhvien(S), not -thuoc(S,toan). ab(d(S)) :- sinhvien(S), not -thuoc(S,tin).

tiến hành thực thi chƣơng trình này trong hệ thống Smodels và DLV mở rộng ta nhận đƣợc tập trả lời đƣợc cho ở hình sau:

Hình 3.7 Kết quả thực thi bài toán 2.8 bằng hệ thống tích hợp Smodels và DLV mở rộng

Một phần của tài liệu (LUẬN văn THẠC sĩ) nghiên cứu lập trình logic tập trả lời và ứng dụng (Trang 49 - 64)

Tải bản đầy đủ (PDF)

(73 trang)