Tải bản đầy đủ (.doc) (22 trang)

Tiểu luận môn biểu diễn tri thức và suy luận GIẢI BÀI TOÁN TAM GIÁC BẰNG MÔ HÌNH HỆ LUẬT DẪN

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (538.77 KB, 22 trang )

i

Đại Học Quốc Gia TP.HCM
Trường Đại Học Công Nghệ Thông Tin
BÁO CÁO CHUYÊN ĐỀ
BIỂU DIỄN TRI THỨC VÀ ỨNG DỤNG
ĐỀ TÀI:
GIẢI BÀI TOÁN TAM GIÁC BẰNG MÔ HÌNH
HỆ LUẬT DẪN

GVHD: PGS.TS. ĐỖ VĂN NHƠN
Học viên: Trần Khánh An
Mã học viên: CH1301076
TP.HCM – 2014
ii
LỜI MỞ ĐẦU
Việc xây dựng mô hình biểu diễn tri thức để đưa tri thức lên máy tính, tổ chức lưu trữ và xử lý
tri thức, đặc biệt là suy luận giải các vấn đề, các bài toán. Biểu diễn tri thức đóng vai trò hết
sức quan trọng trong thiết kế và xây dựng một hệ giải bài toán thông minh và các hệ chuyên
gia. Các phương pháp biểu diễn tri thức thích hợp sẽ tạo nên một hệ thống chặt chẽ và hiệu quả
khi vận hành.
Hiện nay, mô hình biểu diễn tri thức thường dựa trên:
- Các cấu trúc dữ liệu cơ bản và trừu tượng đã biết.
- Các mô hình và cấu trúc toán học.
- Các mô hình biểu diễn tri thức cơ bản: logic vị từ, mạng ngữ nghĩa, hệ luật dẫn, frame
- Các ngôn ngữ đặc tả: mô hình mạng tính toán, mô hình COKB và các Ontology.
Bài thu hoạch này trình bày về phương pháp biểu diễn tri thức dùng mô hình hệ luật dẫn và
trình bày áp dụng mô hình để xây dựng chương trình giải bài toán tam giác kinh điển.
Em xin chân thành cám ơn PGS. TS. Đỗ Văn Nhơn về những tri thức và những kinh nghiệm
quý báu mà thầy đã truyền đạt lại cho lớp trong phạm vi môn học Biểu diễn tri thức và ứng
dụng thuộc chương trình đào tạo cao học ngành Khoa học máy tính tại trường.


Mục lục
Mục lục iii
1 Biểu diễn tri thức 4
1.1 Tri thức 4
1.2 Biễu diễn tri thức và xử lý tri thức 5
2 Biểu diễn tri thức bằng luật dẫn (luật sinh) 5
2.1 Khái niệm 5
2.2 Cơ chế suy luận trên các luật sinh 6
2.3 Vấn đề tối ưu luật 6
3 Bài toán tam giác 8
3.1 Phát biểu bài toán và giới hạn phạm vi 8
3.2 Biểu diễn tri thức và tổ chức lưu trữ 10
3.3 Biểu diễn thuật giải 12
1.1.1 Thuật giải Suy diễn tiến 12
1.1.2 Thuật giải Suy diễn lùi 14
3.4 Tính toán và trình bày kết quả 18
1.1.3 Tính toán 18
1.1.4 Trình bày kết quả 19
3.5 Kết quả chương trình demo 19
KẾT LUẬN 21
3.6 Tóm tắt kết quả đạt được 21
3.7 Hướng phát triển 21
Tài liệu tham khảo 22
1 Biểu diễn tri thức
1.1 Tri thức
Tri thức (knowledge): là sự hiểu biết của người trong một phạm vi, lĩnh vực nào
đó; được xem xét theo các mục tiêu hay các vấn đề nhất định.
Ví dụ:
- Kiến thức về một lĩnh vực y học và khả năng chẩn đoán bệnh là tri thức.
- Biết một tam giác có các yếu tố nào cùng với các công thức liên hệ giữa các yếu

tố là tri thức.
- Biết các dạng cấu trúc dữ liệu thường dùng trong lập trình cùng với các thuật
toán xử lý cơ bản trên các cấu trúc là tri thức.
Các dạng tri thức
- Tri thức khai báo: cho biết một vấn đề được thấy như thế nào. Loại tri thức này
bao gồm các phát biểu đơn giản, dưới dạng các khẳng định logic đúng hoặc sai. Tri
thức khai báo cũng có thể là một danh sách các khẳng định nhằm mô tả đầy đủ hơn về
đối tượng hay một khái niệm nào đó.
- Tri thức cấu trúc: mô tả tri thức theo cấu trúc. Loại tri thức này mô tả mô hình
tổng quan hệ thống theo quan điểm của chuyên gia, bao gồm khái niệm, khái niệm con
và các đối tượng; diễn tả chức năng và mối liên hệ giữa các tri thức dựa theo cấu trúc
xác định.
- Tri thức thủ tục: mô tả cách thức giải quyết một vấn đề. Loại tri thức này đưa ra
giải pháp để thực hiện một công việc nào đó. Các dạng tri thức thủ tục tiêu biểu là các
luật, chiến lược, lịch trình và thủ tục.
- Tri thức meta: mô tả tri thức về tri thức. Loại tri thức này giúp lựa chọn tri thức
thích hợp nhất trong số các tri thức khi giải quyết một vấn đề. Các chuyên gia sử dụng
tri thức này để điều chỉnh hiệu quả giải quyết vấn đề bằng cách hướng các lập luận về
miền tri thức có khả năng cao hơn.
1.2 Biễu diễn tri thức và xử lý tri thức
Biểu diễn tri thức (Kowledge Representation) là phương pháp cho phép mã hóa
tri thức trong cơ sở tri thức của hệ thống.
Biểu diễn tri thức là một vấn đề được quan tâm trong cả khoa học nhận thức lẫn
trí tuệ nhân tạo. Trong khoa học nhận thức, người ta quan tâm đến cách thức lưu trữ và
xử lý thông tin. Còn trong trí tuệ nhân tạo, mục tiêu chính là lưu trữ tri thức sao cho
các chương trình có thể xử lý chúng và đạt được sự thông minh như con người. Các
nhà nghiên cứu trí tuệ nhân tạo đã mượn các lý thuyết về biểu diễn thông tin từ khoa
học nhận thức
2 Biểu diễn tri thức bằng luật dẫn (luật sinh)
2.1 Khái niệm

Phương pháp biểu diễn tri thức bằng luật sinh được phát minh bởi Newell và
Simon trong lúc hai ông đang cố gắng xây dựng một hệ giải bài toán tổng quát. Đây là
một kiểu biểu diễn tri thức có cấu trúc. Ý tưởng cơ bản là tri thức có thể được cấu trúc
bằng một cặp điều kiện và hành động: "NẾU điều kiện xảy ra THÌ hành động sẽ được
thi hành". Chẳng hạn, NẾU đèn giao thông là đỏ THÌ bạn không được đi thẳng, NẾU
máy tính đã mở mà không khởi động được THÌ kiểm tra nguồn điện, …
Ngày nay, các luật sinh đã trở nên phổ biến và được áp dụng rộng rãi trong nhiều
hệ thống trí tuệ nhân tạo khác nhau. Luật sinh có thể là một công cụ mô tả để giải
quyết các vấn đề thực tế thay cho các kiểu phân tích vấn đề truyền thống. Trong trường
hợp này, các luật được dùng như là những chỉ dẫn (tuy có thể không hoàn chỉnh)
nhưng rất hữu ích để trợ giúp cho các quyết định trong quá trình tìm kiếm, từ đó làm
giảm không gian tìm kiếm. Một ví dụ khác là luật sinh có thể được dùng để bắt chước
hành vi của những chuyên gia. Theo cách này, luật sinh không chỉ đơn thuần là một
kiểu biểu diễn tri thức trong máy tính mà là một kiểu biễu diễn các hành vi của con
người.
Một cách tổng quát luật sinh có dạng như sau:
P
1
∧ P
2
∧ ∧ Pn  Q
Tùy vào các vấn đề đang quan tâm mà luật sinh có những ngữ nghĩa hay cấu tạo
khác nhau:
0 Trong logic vị từ: P
1
, P
2
, , Pn, Q là những biểu thức logic.
1 Trong ngôn ngữ lập trình, mỗi một luật sinh là một câu lệnh.
IF (P

1
AND P
2
AND AND Pn) THEN Q.
2 Trong lý thuyết hiểu ngôn ngữ tự nhiên, mỗi luật sinh là một phép dịch:
ONE  một.
TWO  hai.
JANUARY  tháng một.
Để biễu diễn một tập luật sinh, người ta thường phải chỉ rõ hai thành phần chính
sau:
3 Tập các sự kiện F(Facts)
F = {f
1
, f
2
, fn}
4 Tập các quy tắc R (Rules) áp dụng trên các sự kiện dạng như sau :
f
1
^ f
2
^ ^ f
i
 q
Trong đó, các f
i
, q đều thuộc F
2.2 Cơ chế suy luận trên các luật sinh
5 Suy diễn tiến: là quá trình suy luận xuất phát từ một số sự kiện ban đầu,
xác định các sự kiện có thể được "sinh" ra từ sự kiện này.

Sự kiện ban đầu: H, K
R3: H  A {A, H. K }
R1: A  E { A, E, H, K }
R5: E ∧ K  B { A, B, E, H, K }
R2: B  D { A, B, D, E, H, K }
R6: D ∧ E ∧ K  C { A, B, C, D, E, H, K }
6 Suy diễn lùi: là quá trình suy luận ngược xuất phát từ một số sự kiện ban
đầu, ta tìm kiếm các sự kiện đã "sinh" ra sự kiện này. Một ví dụ thường gặp
trong thực tế là xuất phát từ các tình trạng của máy tính, chẩn đoán xem máy
tính đã bị hỏng hóc ở đâu.
2.3 Vấn đề tối ưu luật
Tập các luật trong một cơ sở tri thức rất có khả năng thừa, trùng lắp hoặc mâu
thuẫn. Dĩ nhiên là hệ thống có thể đổ lỗi cho người dùng về việc đưa vào hệ thống
những tri thức như vậy. Tuy việc tối ưu một cơ sở tri thức về mặt tổng quát là một thao
tác khó (vì giữa các tri thức thường có quan hệ không tường minh), nhưng trong giới
hạn cơ sở tri thức dưới dạng luật, ta vẫn có một số thuật toán đơn giản để loại bỏ các
vấn đề này.
7 Rút gọn bên phải:
luật sau hiển nhiên đúng : A ∧ B  A (1)
do đó luật: A ∧ B  A ∧ C
là hoàn toàn tương đương với:A ∧ B  C
Quy tắc rút gọn : Có thể loại bỏ những sự kiện bên vế phải nếu những sự kiện
đó đã xuất hiện bên vế trái. Nếu sau khi rút gọn mà vế phải trở thành rỗng thì luật đó là
luật hiển nhiên. Ta có thể loại bỏ các luật hiển nhiên ra khỏi tri thức.
8 Rút gọn bên trái:
Xét các luật : (L1) A, B  C (L2) A  X (L3) X  C
Rõ ràng là luật A, B  C có thể được thay thế bằng luật A  C mà không làm
ảnh hưởng đến các kết luận trong mọi trường hợp. Ta nói rằng sự kiện B trong luật (1)
là dư thừa và có thể được loại bỏ khỏi luật dẫn trên.
9 Phân rã và kết hợp luật:

Luật: A ∧ B  C
Tương đương với hai luật: A  C và B  C
Với quy tắc này, ta có thể loại bỏ hoàn toàn các luật có phép nối HOẶC. Các luật
có phép nối này thường làm cho thao tác xử lý trở nên phức tạp.
10 Luật thừa:
Một luật dẫn A  B được gọi là thừa nếu có thể suy ra luật này từ những luật còn
lại.
Ví dụ : trong tập các luật gồm {A  B, B  C, A  C} thì luật thứ 3 là luật
thừa vì nó có thể được suy ra từ 2 luật còn lại.
11 Thuật toán tối ưu tập luật dẫn:
Thuật toán này sẽ tối ưu hóa tập luật đã cho bằng cách loại đi các luật có phép nối
HOẶC, các luật hiển nhiên hoặc các luật thừa.
Thuật toán bao gồm các bước chính:
B1: Rút gọn vế phải
Với mỗi luật r trong R
Với mỗi sự kiện A ∈VếPhải(r)
Nếu A ∈VếTrái(r) thì Loại A ra khỏi vế phải của R.
Nếu VếPhải(r) rỗng thì loại bỏ r ra khỏi hệ luật dẫn : R = R \{r}
B2: Phân rã các luật
Với mỗi luật r : X
1


X
2
∨ … ∨ X
n
 Y trong R
Với mỗi i từ 1 đến n R := R + { X
i

 Y }
R := R \ {r}
B3: Loại bỏ luật thừa
Với mỗi luật r thuộc R
Nếu VếPhải(r) ∈ BaoĐóng(VếTrái(r), R-{r}) thì R := R \ {r}
B4: Rút gọn vế trái
Với mỗi luật dẫn r : X : A
1


A
2
, …, A
n
 Y thuộc R
Với mỗi sự kiện A
i
∈ r
Gọi luật r
1
: X - A
i
 Y
S = (R - {r}) ∪{r
1
}
Nếu BaoĐóng (X - A
i
, S) ≡ BaoĐóng (X, R) thì loại sự kiện A ra khỏi X
3 Bài toán tam giác

3.1 Phát biểu bài toán và giới hạn phạm vi
Bài thu hoạch này sẽ trình bày cách giải bài toán tam giác dùng hệ luật dẫn gồm cả suy
diễn tiến và suy diễn lùi. Bài toán tam giác này sẽ giới thiệu cách làm với các công
thức tam giác thông dụng.
Bài toán:
- Giả thiết: Một số thông số (đối tượng, sự kiện) của tam giác cho trước.
- Mục tiêu: Xác định một thông số (đối tượng) của tam giác.
Ví dụ: Xét tam giác ABC có góc A = 30 độ, cạnh b = 6, cạnh c = 5 đơn vị độ dài. Hãy
xác định độ dài đường cao ha.
.
Phạm vi:
Ta có các đối tượng trong tam giác cần xét:
- A: Số đo góc đối diện cạnh a
- B: Số đo góc đối diện cạnh b
- C: Số đo góc đối diện cạnh c
- a: độ dài cạnh a
- b: độ dài cạnh b
- c: độ dài cạnh c
- ha: độ dài đường cao tương ứng với cạnh a
- hb: độ dài đường cao tương ứng với cạnh b
- hc: độ dài đường cao tương ứng với cạnh c
- S: diện tích của tam giác
- p: nửa chu vi
Các công thức trong tam giác (luật)
A + B + C = 180 (độ)
3.2 Biểu diễn tri thức và tổ chức lưu trữ
Tri thức gồm hai thành phần (F, R), tức là các khái niệm (phát biểu) và các luật dẫn.
Trong bài toán tam giác trên, phần tri thức theo luật dẫn (Facts, Rules) gồm:
Facts = {A, B, C, a, b, c, ha, hb, hc, p, S}
Rules = {

r1: {A, B} –> {C};
r2: {A, C} –> {B};

}
Tổ chức tri thức lưu trên bộ nhớ phụ với 2 file : Facts.txt và Rules.txt
Cấu trúc file Facts .txt :
Begin
<tên đối tượng 1> : <mô tả của đối tượng 1>
<tên đối tượng 2> : <mô tả của đối tượng 2>

End.
File Facts . txt của chương trình:
Begin
A : so do goc doi dien canh a
B : so do goc doi dien canh b
C : so do goc doi dien canh c
a : do dai canh a
b : do dai canh b
c : do dai canh c
ha : do dai duong cao tuong ung voi canh a
hb : do dai duong cao tuong ung voi canh b
hc : do dai duong cao tuong ung voi canh c
S : dien tich tam giac
p : nua chu vi
End.
Cấu trúc file Rules .txt :
<luật 1> : <công thức 1>
<luật 2> : <công thức 2>

File Rules .txt của chương trình :

a,b,c=>p.( a + b + c ) / 2
a,b,c,p=>S.sqrt ( p * ( p – a ) * ( p – b ) * ( p – c ) )
a,b,C=>S.( a * b * sin C ) / 2
a,c,B=>S.( a * c * sin B ) / 2
b,c,A=>S.( b * c * sin A ) / 2
a,ha->S.a * ha / 2
b,hb->S.b * hb / 2
c,hc->S.c * hc / 2

Sau khi lưu luật dẫn dưới dạng luật như trên, ta xây dựng cấu trúc dữ liệu phù hợp để
đọc luật vào. Mỗi luật sẽ được lưu dưới dạng mảng như sau
A B C a b c ha hb hc p S
Trong đó:
Khởi tạo mảng sẽ là một mảng 11 phần tử, mỗi phần tử mặc định là số -1. Mảng này
dùng để đánh dấu các biến trong luật.
Trong mảng này mình sẽ load các biến xuất hiện trong luật vào các dòng của bảng như
trên.
Mỗi luật được đưa vào sẽ được phân tích như sau:
Mỗi sự kiện trong mệnh đề IF sẽ được đánh dấu là 0, trong mệnh đề THEN là 1.
Ví dụ luật: A, B -> C
Ta có các giá trị trong mảng lần lượt là:
0, 0, 1, -1, -1, -1, -1, -1, -1, -1, -1.
Hay a, b, c -> p
-1, -1, -1, 0, 0, 0, -1, -1, -1, 1, -1.
3.3 Biểu diễn thuật giải
1.1.1 Thuật giải Suy diễn tiến
Tư tưởng của thuật giải Suy diễn tiến là từ những giả thiết đã biết (know) ta áp dụng
các tập luật để sinh ra thêm giả thiết mới và bổ sung vào know. Quá trình này cứ tiếp
tục cho đến khi kết luận cần tìm đã nằm trong know hoặc không thể áp dụng được luật
nào để sinh thêm giả thiết mới nữa và chương trình kết thúc.

Mô phỏng thuật giải :
Bước 1: Khởi tạo một mảng đánh dấu các luật, để đánh dấu những luật nào đã được sử
dụng để tránh trùng lặp các bước.
Bước 2: Kiểm tra xem mục tiêu đã nằm trong tập giả thiết (know) chưa?
Nếu đúng, goto Bước 6.
Nếu sai, chuyển tới bước 3.
Bước 3: Cho kiểm tra các luật, nếu luật nào chưa dùng (chưa được đánh dấu):
Kiểm tra xem các luật trong đó có đủ điểu kiện để áp dụng sinh ra giả thiết mới hay
không?
Nếu đủ điều kiện:
+ Đánh dấu luật này lại
+ Bổ sung kết luận của luật vào trong know
+ Chuyển tới Bước 2
Nếu không đủ điều kiện: tiếp tục với luật tiếp theo.
Bước 4: Nếu không còn luật nào có thể áp dụng được nữa, chuyển tới bước 6.
Bước 5: Quay lại bước 2.
Bước 6: Kết luận:
+ Nếu Bước 4 đúng: bài toán không thể giải được
+ Nếu Bước 2 đúng: dùng suy diễn lùi để loại bỏ các luật thừa, đưa ra kết luận.
Ví dụ minh họa cho thuật giải Suy diễn tiến:
Giả thiết: góc A, góc B, cạnh c
Kết luận: Tính hc
Bài giải (các luật):
Chương trình sẽ lần lượt thử chạy các luật theo tuyến tính cho đến khi kết luận hc nằm
trong Know.
- Tính góc C: A, B -> C, Known.Add(C).
- Tính hb: c, A -> hb, Known.Add(hb).
- Tính ha: c,B->ha, Known.Add(ha).
- Tính a: c,C,A->a, Known.Add(a).
- Tính b: c,C,B->b, Known.Add(b).

- Tính p: a,b,c->p, Known.Add(p).
- Tính S: a,b,c,p->S, Known.Add(S).
- Tính hc: a,B->hc, Known.Add(hc).
Vì hc đã nằm trong Known nên dừng Suy diễn.
Đó là các luật mà máy sẽ chạy để tính được hc, nhưng trong quá trình chạy suy diễn
tiến, sẽ phát sinh ra các luật thừa, lúc này ta sẽ dùng suy diễn lùi để loại bỏ các luật
thừa đó, tức là nếu kết luận của luật liền trước không có trong giả thiết của một luật thì
loại luật đó ra.
Kết quả ta được:
B1: Tính góc C: A,B->C
B2: Tính cạnh a: c,C,A->a
B3: Tính hc: a,B->hc
1.1.2 Thuật giải Suy diễn lùi
Trong thuật giải Suy diễn lùi, ta dùng kỹ thuật đệ quy để thực hiện suy diễn lùi. Để suy
ra được kết luận, ta thực hiện tìm luật để suy ra được đích là kết luận, ta phải lùi về để
tìm những thành phần còn thiếu trong luật, tiếp tục ta lại đệ quy với đích mới là thành
phần còn thiếu đó. Quá trình đệ quy cứ tiếp tục cho đến khi các hàm đệ quy được khử
hay nói cách khác là ta tìm đủ điều kiện để suy ra được đích. Nếu ta cho hàm đệ quy
thực hiện Suy diễn lùi vô hạn thì trong một số trường hợp bài toán không thể giải được
trong khi ta vẫn có thể giải được bài bằng Suy diễn tiến, do vậy ta phải đặt số lần quay
lui của hàm đệ quy. Trong bài này tôi đặt số lần quay lui của hàm đệ quy là 3. Sau 3
lần suy diễn lùi, nếu vẫn không thể đủ giả thiết để thực thi các luật, ta sẽ sử dụng suy
diễn tiến để sinh ra thêm giả thiết để giải bài toán.
Mô phỏng thuật giải:
int BackTracking(int _dest, int _levelBack, List<int> _statusOfAgr)
{
//lưu lại những luật có chứa kết luận
List<int> _listRulesContainDest ;
for i = 1 to numberOfRules
if (ListRules[i].Contain(_dest))

_listRulesContainDest.Add(i);
/*Sắp xếp các luật có chứa kết luận theo số lượng biến nằm trong know của mỗi
luật*/
SortListByNumberOfArgInKnow(_listRulesContainDest);
//Duyệt từng luật chứa kết luận
for i = 1 to numberOfRulesCotainDest:
{
bool _isLoop = false;
bool _isReady = true;
/*duyệt từng biến trong giả thiết của mỗi luật*/
foreach int j in _listHypothesisArg(_listRulesContainDest[i])
{
/*Nếu biến đó đang được tìm kiếm trong các vòng đệ quy trước
thì đánh dấu lại)*/
if(_listStatusOfArg[j] == 0)
_isLoop = true;
/*Nếu có biến đó không nằm trong know thì luật này chưa sẵn
sàng để dùng*/
if(Known.Contain(j) == 0)
_isReady = false;
}
/*Nếu trạng thái của biến này là đang được tìm kiếm ở các vòng lặp trước
thì bỏ qua (không dùng) luật này để tiếp tục với luật khác*/
if (_isLoop)
continue;
/*Nếu luật này đã sẵn sàng để dùng thì tiến hành sinh giả thiết và thêm
vào known*/
if (_isReady)
{
Known.Add(_dest);

//cập nhật trạng thái cho biến đó
_listStatusOfArg[_dest] = -1;
//trả về kết quả là đã sinh thành công
Return 1;
}
else
{
/*Nếu đây là bước lùi thứ ba và đã thử hết toàn bộ luật có thể sinh
kết luận cần tìm*/
if(_levelBack == 3 && i == numberOfRulesContainDest)
{
//tiến hành sinh thêm giả thiết
int result = generateAHypothesis();
/*Nếu không thể sinh thêm được bất kỳ giả thiết nào nữa
thì trả về kết quả là không thành công*/
if (result == -1)
return 0;
/* Nếu giả thiết được sinh ra đang được tìm kiếm ở những
vòng đệ quy ngoài thì báo kết quả ra */
if(_listStatus[result] == 0;
return 2;
/*cập nhật trạng thái của giả thiết vừa được sinh ra*/
_listStatus[i] = -1;
continue;
}
else
{
/*đánh dấu xem liệu có thể đệ quy để tìm đủ giả thiết để
sinh luật hay không*/
bool _isAble = true;

/*Duyệt từng biến trong phần giả thiết của luật */
foreach int j in
_listHypothesisArg(_listRulesContainDest[i])
{
/*lưu kết quả của việc quay lui */
int _resultBackTracking = -1;
/*Nếu không nằm trong known*/
if (!Known.Contain(j))
{
/*đánh dấu danh sách trạng thái trước khi quay lui*/
_listStatus[j] = 0;
_resultBackTracking = BackTracking(j,
_levelBack+1, _listStatus);
/*Nếu quay lui thất bại*/
if(_resultBackTracking == 0)
{
_isAble = false ;
break ;
}
else
/*Nếu quay lui thành công*/
if (_resultBackTracking == 1)
continue ;
else
/*Nếu quay lui tình cờ tìm thấy một giả thiết ở vòng
đệ quy ngoài ta kiểm tra xem nó có phải điều ta đang tìm kiếm hay không, nếu đúng,
báo thành công, nếu sai, báo ra các vòng đệ quy ngoài*/
if (Known.Contain(_dest))
return 1 ;
else

return 2 ;
}
}
//Nếu có khả năng sinh được luật
if (_isAble)
{
/*Cập nhật danh sách trạng thái và báo thành công */
_listStatus[_dest] = -1 ;
return 1 ;
}
}
}
}
return 0 ;
}
3.4 Tính toán và trình bày kết quả
Sau khi xây dựng thuật giải và tìm được các luật áp dụng, tìm được các công thức cần
áp dụng để đi đến được kết quả. Vậy là bài toán đã coi như gần hoàn tất, bây giờ công
việc cuối cùng để hoàn thành bài toán là tính toán và trình bài kết quả.
1.1.3 Tính toán
Sau khi có được các luật sẽ dùng, ta sẽ tiến hành đọc các công thức và thay số vào để
tính.
Các công thức toán học thông dụng chúng ta vẫn thường hay dùng được gọi là các
công thức ở dạng trung tố (Infix), để chuyển về dạng ký pháp nghịch đảo Ba Lan tức là
tính bằng các stack ta phải chuyển chúng về các biểu thức hậu tố (Posfix).
Thuật toán để chuyển một biểu thức Infix sang dạn Posfix:
Đọc từng token trong biểu thức infix từ trái qua phải, với mỗi token ta thực hiện các
bước sau:
- Nếu là toán hạng: cho ra output.
- Nếu là dấu mở ngoặc “(“: cho vào stack

- Nếu là dấu đóng ngoặc “)”: lấy các toán tử trong stack ra và cho vào output cho
đến khi gặp dấu mở ngoặc “(“. (Dấu mở ngoặc cũng phải được đưa ra khỏi stack)
- Nếu là toán tử:
Chừng nào ở đỉnh stack là toán tử và toán tử đó có độ ưu tiên lớn hơn hoặc bằng toán
tử hiện tại thì lấy toán tử đó ra khỏi stack và cho ra output.
Đưa toán tử hiện tại vào stack
Sau khi duyệt hết biểu thức infix, nếu trong stack còn phần tử thì lấy các token trong
đó ra và cho lần lượt vào output.
Ta có độ ưu tiên của các toán tử:
‘sqrt’ = ‘sin’ = ‘cos’ = ‘tan’ = ‘arcsin’ = ‘arccos’ > ‘*’ = ‘/’ > ‘+’ = ‘-‘ > ‘(‘
1.1.4 Trình bày kết quả
Sau khi nhận tập luật từ thuật giải suy diễn và nhận kết quả tính toán từ hàm Calculate
thì ta sẽ trình bày bài giải theo ngôn ngữ tự nhiên sau cho dễ hiểu nhất. Ta có thể trình
bày lời giải bằng ngôn ngữ tự nhiên trong file text hoặc đưa trực tiếp vào code.
3.5 Kết quả chương trình demo
Chương trình cho phép nhập liệu trên các yếu tố của tam giác, hoặc tạo mẫu bài toán theo cấu
trúc "a=3,b=4,c=5?S" nghĩa là cho biết 3 cạnh yêu cầu tính S
Mẫu 1: Áp dụng suy diễn tiến để giải bài toán với góc A=30, cạnh c=5, cạnh b=4, tính
độ dài đường cao ha.
Chương trình trình bày lời giải của bài toán.
Mẫu 2: Áp dụng suy diễn lùi để giải bài toán với cạnh a=3, cạnh b=4 và cạnh c=5, tính
diện tích tam giác S.
Chương trình trình bày lời giải của bài toán.
Mẫu 3: thiếu giả thiết cho bài toán.
KẾT LUẬN
3.6 Tóm tắt kết quả đạt được
Ứng dụng đã thành công trong việc biểu diễn tri thức về tam giác, các luật dẫn
để tính tham số của tam giác như: tính diện tích, tính cạnh khi biết góc, hay biết một
cạnh nào đó.
Hiện trên thế giới đã có rất nhiều nhà khoa học đã nghiên cứu và thành công rất

nhiều trong việc biểu diễn tri thức của con người, và thành công này đã giúp cho chúng
ta rất nhiều trong ứng dụng xã hội, kinh doanh, giáo dục… đưa con người lên một xã
hội cao hơn.
Chương trình chưa đề xuất gợi ý bổ sung yếu tố gì để bài toán có thể giải được.
3.7 Hướng phát triển
Do đề tài được thực hiện trong thời gian ngắn nên hiện tại ứng dụng cũng chỉ có
thể biểu diễn các tri thức cơ bản, đơn giản chưa giải quyết định hết các khái niệm của
một tam giác, tập luật dẫn chưa đầy đủ và chưa giải quyết được các bài toán phức tạp
trong tam giác, nhưng nó cũng cho chúng ta thấy được khả năng đưa tri thức của con
người vào lưu trữ trong hệ thống là hoàn toàn có thể.
Trong thời gian tới hy vọng có thể mở rộng ra giải quyết nhiều hơn các bài toán
về hình học hơn nữa.
Tài liệu tham khảo
[1]. GS.Hoàng Kiếm, TS.Đỗ Phúc, TS.Đỗ Văn Nhơn - Giáo trình Các Hệ Cơ Sở Tri
Thức NXB Đại Học Quốc Gia TP.HCM 2008
[2]. Hoàng Kiếm, Đỗ Phúc, Đỗ Văn Nhơn, Giáo trình các hệ cơ sở tri thức,
Nhà xuất bản, ĐHQG – HCM (2011).
[3]. Đỗ Văn Nhơn, Xây dựng hệ tính toán thông minh – xây dựng và phát triển
các mô hình biễu diễn tri thức cho các hệ giải toán tự động, Luận án tiến sĩ,
ĐHQG – HCM (2001 - 2002).

×