Tải bản đầy đủ (.pdf) (17 trang)

Lập trình symbolic và trí tuệ nhân tạo

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 (765.12 KB, 17 trang )

Bài thu hoạch: Lập trình symbolic và trí tuệ nhân tạo
1

MỤC LỤC

MỤC LỤC 1
LỜI NÓI ĐẦU 2
1. Giới thiệu về Maple 3
2. Lập trình trong Maple 3
2.1. Các lệnh điều khiển 3
2.1.1. Lệnh điều kiện if 3
2.1.2. Vòng lặp While 4
2.1.3. Vòng lặp for 4
2.1.4. Lệnh break 5
2.1.5. Lệnh next 5
2.1.6. Sử dụng các hàm RETURN, ERROR 6
2.2. Cách thiết lập một thủ tục 6
2.2.1. Giới thiệu 6
2.2.2. Khai báo thủ tục 7
2.2.3. Tham biến 7
2.2.4. Phạm vi các biến (biến toàn cục, biến cục bộ và tham biến) 7
2.2.5. Định giá trên các biến 8
2.2.6. Các chức năng khác 8
3. Áp dụng giải một số bài toán 10
3.1. Giải và biện luận phương trình bậc 2 theo tham số m 10
3.2. Suy diễn tiến trên “hệ luật dẫn cơ bản” 11
3.3. Giải tam giác 12
TÀI LIỆU THAM KHẢO 17

Bài thu hoạch: Lập trình symbolic và trí tuệ nhân tạo
2



LỜI NÓI ĐẦU

Maple là một công cụ hỗ trợ trong việc học tập, giảng dạy toán rất tốt và rất phổ
biến. Ngoài những hàm cung cấp sẵn, Maple còn hỗ trợ cho người dùng tự tạo ra các
đoạn chương trình để giải quyết bài toán cụ thể theo yêu cầu. Bài thu hoạch này sử dụng
công cụ Maple để minh họa giải một số bài toán của môn học “Lập trình Symbolic & trí
tuệ nhân tạo”.
Xin chân thành cảm ơn các thầy cô trường Đại học Công nghệ Thông tin
Tp.HCM, đặc biệt thầy Đỗ Văn Nhơn, đã trực tiếp giảng dạy môn Lập trình Symbolic &
trí tuệ nhân tạo, truyền đạt kiến thức về lập trình Symbolic, trí tuệ nhân tạo cho em. Nhờ
đó mà em đã hoàn thành được bài thu hoạch này. Đồng thời cũng xin cảm ơn bạn bè,
đồng nghiệp đã hỗ trợ tôi trong suốt thời gian làm bài thu hoạch.
Bài thu hoạch: Lập trình symbolic và trí tuệ nhân tạo
3

1. Giới thiệu về Maple
- Maple là một phần mềm tính toán do hãng Maple Soft, một bộ phận chủ yếu của
liên hợp công ty Waterloo Maple phát triển.
- Cho đến nay Maple đã được phát triển qua nhiều phiên bản khác nhau và ngày
càng hoàn thiện.
- Với phần mềm Maple, chúng ta có thể:
o Thực hiện các tính toán với khối lượng lớn, với thời gian nhanh và độ chính
xác cao.
o Sử dụng các gói chuyên dụng của Maple để giải quyết các bài toán cụ thể
như: vẽ đồ thị (gói plot), hình học giải tích (gói geometry), đại số tuyến tính
(gói linalg),
o Thiết kế các đối tượng 3 chiều.
o Lập trình giải các bài toán trí tuệ nhân tạo.
o …

2. Lập trình trong Maple
2.1. Các lệnh điều khiển
2.1.1. Lệnh điều kiện if
- Cấu trúc cú pháp:
if condition then
statement sequence
| elif condition then statement sequence |
| else statement sequence |
fi;
- Ghi chú: Các câu lệnh trong cặp dấu ngoặc đứng là các lệnh tuỳ chọn. Thí dụ: biểu
thức | statement | cho biết rằng statement là một câu lệnh tuỳ chọn.
- Chức năng: Nếu bạn muốn một dãy biểu thức được thực hiện khi điều kiện nào đó
được thoả mãn và một dãy biểu thức khác được thực hiện nếu trái lại thì có thể
dùng câu lệnh if- then- else- fi. Trong câu lệnh trên, nếu điều kiện condition là
đúng thì chuỗi biểu thức đứng sau then được thực hiện, nếu trái lại thì điều kiện
condition sau từ khoá elif sẽ được kiểm tra, nếu nó đúng thì chuỗi lệnh tương ứng
sau then được thực hiện, cứ tiếp tục cho đến khi các điều kiện condition đều không
thỏa mãn, thì các biểu thức sau lệnh else được thực hiện.
- Lưu ý rằng cấu trúc lệnh (tuỳ chọn) elif then được lặp lại với số lần tuỳ ý. Từ
khoá elif là dạng viết tắt của else if.
- Các biểu thức điều kiện condition được sử dụng trong câu lệnh if phải được tạo
thành từ các bất đẳng thức, các đẳng thức (các phép toán quan hệ), các biến số, các
Bài thu hoạch: Lập trình symbolic và trí tuệ nhân tạo
4

phép toán logic, các hàm có giá trị trả lại là giá trị logic. Nếu trái lại thì sẽ gây ra
lỗi.
2.1.2. Vòng lặp While
- Cấu trúc cú pháp:
While <điều kiện> do <dãy lệnh> od;

- Chức năng:
o Vòng lặp while cho phép lặp chuỗi các câu lệnh giữa do và od khi mà điều
kiện condition vẫn còn đúng (tức là biểu thức điều kiện cho giá trị true).
Điều kiện condition được kiểm tra ngay tại đầu mỗi vòng lặp, nếu nó thỏa
mãn (giá trị của nó là đúng) thì các câu lệnh bên trong được thực hiện, sau
đó lại tiếp tục kiểm tra điều kiện condition cho đến khi điều kiện không còn
thỏa mãn nữa. Vòng lặp while thường được sử dụng khi số lần lặp một hay
một chuỗi biểu thức là không xác định rõ, đồng thời ta muốn các biểu thức
đó cần được lặp trong khi một điều kiện nào đó còn được thỏa mãn.
o Điều kiện condition trong vòng lặp phải là một biểu thức boolean, tức là giá
trị của nó chỉ có thể là đúng hoặc sai, nếu không thì sẽ sinh ra lỗi.
o Trong trường hợp muốn thoát ra khỏi vòng lặp ngay từ trong giữa vòng lặp,
ta có thể thực hiện bằng cách dùng câu lệnh RETURN, break hoặc quit.
- Chú ý rằng vòng lặp while- do- od; không bắt buộc phải nằm trên nhiều dòng lệnh
nhưng người ta thường viết trên nhiều dòng để câu lệnh dễ đọc và dễ hiểu hơn.
- Vòng lặp While cho phép lặp chuỗi các câu lệnh nằm giữa do và od khi mà điều
kiện vẫn còn đúng.
2.1.3. Vòng lặp for
- Cấu trúc cú pháp:
for name from start by change to finish
do
statement sequence
od;
Hoặc dạng phát biểu khác:
for name in expression
do
statement sequence
od;
- Chức năng:
Bài thu hoạch: Lập trình symbolic và trí tuệ nhân tạo

5

o Vòng lặp for được dùng để lặp một chuỗi các biểu thức được đặt giữa do và
od, mỗi lần lặp tưng ứng với một giá trị phân biệt của biến chỉ số name
đứng sau từ khoá for. Ban đầu, giá trị start được gán cho biến chỉ số. Nếu
giá trị của biến name nhỏ hơn hay bằng giá trị finish thì chuỗi lệnh nằm
giữa do và od được thực hiện, sau đó biến name được gán giá trị tiếp theo
bằng cách cộng thêm vào nó giá trị change (name:=name+change). Sau đó,
biến name được so sánh với finish để quyết định xem việc thực hiện chuỗi
lệnh có được tiếp tục nữa không. Quá trình so sánh biến chỉ số name và
thực hiện chuỗi lệnh được lặp liên tiếp cho đến khi giá trị của biến name
lớn hơn giá trị finish. Giá trị cuối cùng của biến name sẽ là giá trị vư ợt quá
finish đầu tiên. Chú ý. Nếu các từ khóa from start hoặc by change bị bỏ qua
thì mặc định from 1 và by 1 được dùng.
o Vòng lặp for- in- do- od thực hiện việc lặp với mỗi giá trị mà biến chỉ số
name lấy từ biểu thức expression đã cho. Chẳng hạn vòng lặp này được sử
dụng hiệu quả khi mà giá trị của biến name là một phần tử của một tập hợp
hoặc danh sách.
o Trong trường hợp muốn thoát khỏi từ giữa vòng lặp, ta có thể dùng các câu
lệnh break, quit, RETURN giống như trong vòng lặp while.
2.1.4. Lệnh break
- Cấu trúc cú pháp:
break
- Chức năng:
o Trong lúc vòng lặp while/for đang được thực hiện, nếu lệnh break được gọi
thì chương trình sẽ thoát ngay lập tức ra khỏi vòng lặp while/for tận trong
cùng nhất mà có chứa lệnh break (vì cũng có thể có nhiều vòng lặp
while/for được lồng nhau). Một ví dụ khá điển hình trong việc sử dụng lệnh
break là trong quá trình tìm kiếm search, rõ ràng là bạn sẽ muốn dừng quá
trình quét lại ngay khi bạn tìm thấy đối tượng cần tìm. Khi đó, ngay tại thời

điểm tìm thấy, bạn dùng lệnh break để nhảy ra khỏi vòng lặp tìm kiếm.
Trước lệnh break thường có một câu lệnh điều kiện if then
o Nếu lệnh break dùng ngoài các vòng lặp while/for thì sẽ sinh ra lỗi. Chú ý:
break không phải là từ khoá (từ dành riêng cho Maple), vì vậy ta có thể gán
giá trị cho biến có tên là break mà không hề sinh ra lỗi (mặc dù điều này là
không nên).
2.1.5. Lệnh next
Bài thu hoạch: Lập trình symbolic và trí tuệ nhân tạo
6

- Cấu trúc cú pháp:
next
- Chức năng:
o Cũng giống như câu lệnh break, lệnh next được thực hiện trong vòng lặp
while/for với mục đích bỏ qua một số lệnh bên trong vòng lặp để nhảy qua
lần lặp tiếp theo. Khi gặp lệnh next trong vòng lặp, chương trình bỏ qua các
lệnh tiếp theo của vòng lặp tận cùng nhất chứa next cho đến khi gặp từ
khoá xác định kết thúc vòng lặp (ở đây là lệnh od). Đến đây vòng lặp tiếp
tục nhảy qua lần lặp tiếp theo (nếu có thể) bằng cách tăng chỉ số hoặc kiểm
tra điều kiện để quyết định xem có nên thực hiện vòng lặp tiếp theo.
o Lệnh next sinh ra lỗi nếu nó được gọi ngoài vòng lặp while/for. Tương tự
như break, next cũng không phải là từ khóa, do đó ta hoàn toàn có thể gán
cho next một giá trị (xem như next là một biến). Ngay trước lệnh next cũng
thường là một câu lệnh điều kiện if then
2.1.6. Sử dụng các hàm RETURN, ERROR
- Hàm RETURN được sử dụng để cho giá trị hàm trước khi thoát khỏi thủ tục. Nếu
không có lệnh RETURN, thủ tục tự động cho kết quả của phép tính cuối cùng
trong thủ tục.
- Hàm ERROR được sử dụng để đưa thông điệp lỗi ra màn hình từ bên trong thủ
tục.

2.2. Cách thiết lập một thủ tục
2.2.1. Giới thi ệu
- Maple là một ngôn ngữ lập trình hướng thủ tục (procedure). Chúng ta có thể làm
việc với Maple bằng hai chế độ khác nhau: Chế độ tương tác trực tiếp thông qua
việc nhập từng lệnh đơn lẻ ngay tại dấu nhắc lệnh của Maple và nhận được ngay
kết quả của lệnh đó. Chế độ thủ tục được thực hiện bằng cách đóng gói một dãy
các lệnh xử lí cùng một công việc vào trong một thủ tục (procedure) duy nhất, sau
đó ta chỉ cần gọi thủ tục này và Maple tự động thực hiện các lệnh có trong thủ tục
đó một cách tuần tự và sau đó trả lại kết quả cuối cùng.
- Maple chứa một lượng rất lớn các hàm tạo sẵn đáp ứng cho những yêu cầu tính
toán khác nhau trong nhiều lĩnh vực. Các hàm này được lưu trữ trong các gói thủ
tục (package) và người sử dụng có thể dễ dàng gọi đến mỗi khi cần thiết. Tuy
nhiên, người dùng Maple có thể tự tạo cho riêng mình những gói thủ tục cũng như
có thể trao đổi dùng chung những gói thủ tục nào đấy, phục vụ cho công việc
mang tính đặc thù riêng của mình.
Bài thu hoạch: Lập trình symbolic và trí tuệ nhân tạo
7

- Các khái niệm cơ bản cần phải nắm vững để tạo ra một thủ tục (procedure) là: Cấu
trúc proc() end; cùng với các khai báo trong cấu trúc này (global, local, option, ).
- Các cấu trúc dữ liệu và các hàm có liên quan (dãy-sequence, tập hợp-set, danh
sách-list, mảng-array, bảng-table).
- Các hàm lập trình cơ bản (đã nêu ở trên) và các hàm liên quan đến việc xử lí dữ
liệu (eval, evalf, subs, map, convert, ).
2.2.2. Khai báo thủ tục
- Lời gọi khai báo một thủ tục:
procedure_name:=proc(parameter_sequence)
[local local_sequence]
[global global_sequence]
[options options_sequence]

statements_sequence;
end;
- Giải thích các khai báo:
o parameter_name: Là một dãy các kí hiệu, ngăn cách nhau bởi các dấu phẩy,
chứa tên các tham biến truyền cho thủ tục.
o local_sequence: Là một dãy các tên được khai báo là biến cục bộ trong thủ
tục, nó chỉ có giá trị sử dụng trong phạm vi thủ tục đang xét (local được sử
dụng để khai báo cho các biến chỉ sử dụng bên trong một thủ tục).
o global_sequen: Dãy các tên biến toàn cục có giá trị sử dụng ngay cả bên
ngoài thủ tục.
o options_sequence: Dãy các tuỳ chọn cho một thủ tục.
o statements_sequence: Dãy các câu lệnh do người lập trình đưa vào.
2.2.3. Tham biến
- Tham biến (parameter) là các biến được đặt giữa hai dấu ngoặc trong biểu thức
proc( ). Tham biến được dùng để nhận dữ liệu truyền cho thủ tục khi gọi thủ tục
đó. Ví dụ ta có thể khai báo thủ tục tính tổng của 2 số [tong:=proc(x,y) x+y; end.]
thì khi gọi thủ tục này để tính tổng của hai số 10 và 5 ta phải truyền các dữ liệu
này cho các tham biến (cho x nhận giá trị là 10, y nhận giá trị là 5), tức là tại dấu
nhắc lệnh ta phải viết tong(10, 5); và sau khi thực hiện thủ tục trả lại kết quả là 15.
- Tham biến có tính cục bộ: chúng chỉ được sử dụng bên trong thủ tục đã được khai
báo, bên ngoài thủ tục này chúng không mang ý nghĩa gì.
- Kiểu của tham biến có thể được khai báo trực tiếp.
2.2.4. Phạm vi các biến (biến toàn cục, biến cục bộ và tham biến)
- Biến toàn cục
Bài thu hoạch: Lập trình symbolic và trí tuệ nhân tạo
8

o Biến toàn cục được khai báo sau từ khoá global trong khai báo thủ tục.
o Biến toàn cục được khai báo bên trong một thủ tục, nhưng có phạm vi giá
trị trong toàn bộ chương trình, tức là bên ngoài phạm vi của thủ tục mà nó

được khai báo trong đó.
- Biến cục bộ
o Biến cục bộ được khai báo sau từ khoá local trong khai báo thủ tục.
o Biến cục bộ chỉ có giá trị bên trong thủ tục mà nó được khai báo. Ngoài thủ
tục này nó không mang ý nghĩa gì.
- Tham biến
o Cũng giống như biến cục bộ, các tham biến chỉ có giá trị bên trong phạm vi
của thủ tục mà nó được khai báo. Sau khi thủ tục kết thúc, chúng không còn
giá trị.
o Tham biến còn được sử dụng để trả lại kết quả, như các ngôn ngữ lập trình
truyền thống. Ngoài ra, do Maple có những hàm có khả năng trả lại nhiều
hơn một giá trị. Ta có thể gộp các giá trị này vào một danh sách để trả lại
như một phần tử.
2.2.5. Định giá trên các biến
- Định giá tên hàm và tham biến
o Như đã đề cập trước đây, các tên biến trong một biểu thức được Maple định
giá trước khi thực hiện các phép tính trên chúng. Đối với việc thực hiện các
hàm cũng tương tự như vậy. Trước tiên là tên thủ tục được định giá. Sau đó
lần lượt đến các đối số trong danh sách các đối số truyền cho thủ tục (được
định giá từ trái sang phải). Nếu tên thủ tục được định giá trỏ đến một thủ
tục, thì thủ tục ấy được thực thi trên các đối số đã được định giá. Tuy nhiên
vẫn có một số thủ tục ngoại lệ: đó là các hàm eval, assigned, seq.
- Định giá biến cục bộ và biến toàn cục
o Các biến cục bộ và tham biến truyền cho thủ tục được định giá một cấp
(định giá một lần), còn các biến toàn cục thì được định giá hoàn toàn (full
evaluation). Hàm eval( ) được dùng để ép định giá hoàn toàn cho biến cục
bộ và tham biến, và định giá một mức cho các biến toàn cục.
2.2.6. Các chức năng khác
- Muốn in ra màn hình các "vòng lệnh ẩn" ta sử dụng biến printlevel. Đây là cách
đơn giản nhất để xem xét các quá trình thực hiện lệnh. Khi printlevel được gán giá

trị âm thì không hiện gì cả, nếu được gán giá trị 0 thì chỉ có kết quả của các câu
lệnh được hiện ra.
- Dò từng lệnh trong thủ tục:
Bài thu hoạch: Lập trình symbolic và trí tuệ nhân tạo
9

trace(f)
trace(f, g, h, . . .)
o Tham số: Các hàm f, g, h, là các hàm cần chạy từng bước.
o Lệnh trace cho in cách thức hiện từng lệnh của một thủ tục ra màn hình.
o Lệnh dò trace() hoạt động tương tự như khi ta gán cho biến printlevel một
số đủ lớn để có thể hiện ra màn hình tất cả các câu lệnh cũng như điểm vào
và điểm ra của hàm mà ta đang thực hiện.
o Trong suốt quá trình thực hiện, các điểm vào, các kết quả của các câu lệnh,
các điểm ra của hàm cần dò được hiện ra màn hình. Các tham biến được
hiện ra ở điểm vào thủ tục, giá trị trả lại của hàm được hiện ra ở điểm cuối
thủ tục.
o Chú ý: Không thể dò từng bước một số hàm có quy tắc định giá đặc biệt,
bao gồm: assigned, eval, evalhf, evalf, evaln, traperror, seq, userinfo.
- Xem mã nguồn một thủ tục:
showstat(procName)
showstat(procName, statRange)
Tham số:
o procName: Tên của thủ tục cần hiển thị mã nguồn.
o statRange: Phạm vi các dòng lệnh cần được hiển thị (từ dòng nào đến dòng
nào).
- Phần lớn các lệnh trong Maple đều được viết bằng ngôn ngữ Maple, do đó chúng
ta có thể đọc được mã nguồn của những lệnh này. Maple cung cấp hàm showstat()
để hiện đoạn chương trình là mã nguồn của các lệnh trên. Nhờ có hàm này mà
người học lập trình trên Maple có thể dễ dàng học được cách thức cũng như đặc

trưng ngôn ngữ bằng cách nghiên cứu phương thức mà các lệnh của Maple thực
hiện (thông qua việc xem mã nguồn của chúng). Ta có thể hiển thị một phần mã
nguồn của các thủ tục bằng cách định rõ phạm vi của các dòng cần thể hiện.
- Chúng ta cũng có thể sử dụng các hàm print() và interface() để đọc mã nguồn của
các hàm trong Maple. Thông thường thì Maple không hiển thị phần thân của các
thủ tục đó nếu ta cho hiển thị chúng. Muốn làm điều này, ta phải gọi lệnh
interface() với tham số verbosepro =2 trước, sau đó dùng lệnh print thì ta có thể
xem được thân của thủ tục.
- Chặn bắt lỗi
traperror(expr1, expr2, )
o Tham số: expr1, expr2, là các biểu thức.
Bài thu hoạch: Lập trình symbolic và trí tuệ nhân tạo
10

o Maple sử dụng biến lasterror để lưu thông báo lỗi của lỗi xảy ra mới nhất
trong quá trình tính toán. Ta có thể sử dụng biến này giống như bất cứ biến
nào khác trong Maple, cụ thể là ta có thể gán giá trị bất kì nào đó cho nó,
tính toán trên biến này và ghi giá trị nó đang lưu trữ ra màn hình. Tuy nhiên
khi xảy ra lỗi, Maple tự động gán cho biến này xâu kí tự thông báo lỗi mà
hàm ERROR() sẽ hiển thị ra màn hình.
o Cùng với biến lasterror, hàm traperror() được sử dụng để chặn bắt một lỗi
nào đó trong một biểu thức trước khi lỗi đó được thông báo ra màn hình.
Nếu có lỗi nào đó xảy ra trong lúc định giá trị hoặc đơn giản biểu thức,
hàm traperror() sẽ trả lại xâu kí tự thông báo lỗi của lỗi đầu tiên gặp phải
khi tính toán biểu thức đó. Nếu không có lỗi, hàm traperror() trả lại kết quả
tính toán biểu thức. Mỗi lần gọi đến hàm traperror(), Maple tự động xoá đi
giá trị cũ có trong bốn lần tính toán trước.

3. Áp dụng giải một số bài toán
3.1. Giải và biện luận phương trình bậc 2 theo tham số m

- Yêu cầu bài toán:
o Input: Phương trình ax
2
+ bx + c = 0 (a≠0; a,b,c là đa thức bậc nhất theo m
tùy ý)
o Output: Kết luận nghiệm của phương trình trong Input
- Cấu trúc dữ liệu:
o Lệnh giải phương trình: >solve(equations, variables)
o Lệnh lấy vế trái, vế phải của biểu thức: >lhs(expr) và rhs(expr)
o Lệnh lấy hệ số một đa thức: > coeff(p,x)
o Lệnh khai triển một biểu thức đại số: > expand(expr)
o Lệnh chuyển đổi dạng biểu thức: >convert(expr,form)
o Lệnh hiển thị giá trị của biểu thức: >print(expr)
o Lệnh xuất một biểu thức theo một định dạng: >printf(fmt,expr)
- Thuật giải:
Đặt
2
b 4ac  

+
0:
phương trình vô nghiệm.
+
0
: phương trình có nghiệm kép
b
x
2a

.

+
0
: phương trình có 2 nghiệm phân biệt
b
x
2a
  

;
b
x
2a
  


Bài thu hoạch: Lập trình symbolic và trí tuệ nhân tạo
11

Kết luận: liệt kê từng trường hợp của tham số ứng với nghiệm của phương
trình.
- Viết thủ tục: Kèm theo trong tập tin maple
- Dữ liệu thử nghiệm:
Giải và biện luận phương trình sau: x
2
+ mx + 3m-8 = 0
Kết quả chạy trong Maple:


3.2. Suy diễn tiến trên “hệ luật dẫn cơ bản”
- Yêu cầu bài toán:

Giả sử có tập giả thiết cho trước H (H là tập con F), ta muốn suy ra 1 tập mục tiêu
G (G là tập con của F). Tìm dãy các luật để từ H suy ra được G (hay còn gọi là tìm
lời giải cho bài toán suy diễn)
- Cấu trúc dữ liệu:
o (F, R)
o Tập sự kiện F: tập hợp các sự kiện
F = {A, B, C, }
o Tập luật dẫn:
R = {các luật dẫn có dạng: if gt then kl;
gt và kl là các tập con của F}
- Thuật giải:
o Ý tưởng: xuất phát từ H tìm luật áp dụng.
Bài thu hoạch: Lập trình symbolic và trí tuệ nhân tạo
12

o Luật để áp dụng được:
o Giả thiết phải nằm trong H
o Phần kết luận không nằm trong H
o Mỗi khi tìm được luật áp dụng ghi nhớ luật đó, đồng thời ghi nhận sự kiện
mới áp dụng suy ra từ đó. Cứ lặp lại cho đến khi tập sự kiện ta có trùng với
tập G. Có trường hợp dừng khi tìm luật không có.
o Biến (với kiểu dữ liệu nhất định): giả thiết F(Facts), R(Rules), H(GT),
G(KL)
o Biến tìm lời giải solution(Sol): danh sách các luật được áp dụng
o Biến Facts_known(Known): lưu lại tập sự kiện đã biết, kiểu dữ liệu là tập
sự kiện
Bước 1: Khởi tạo các biến
Solution:=[];
Facts_known:=H;
Bước 2:

while (chưa đạt được mục tiêu G) do
2.1. Tìm luật r thuộc R có thể áp dụng trên Facts_known
2.2. if (không tìm được r) then
Dừng: không tìm được lời giải
2.3. Thêm r vào Solution; Thêm phần kết luận của luật r vào Facts_known;
end do;
Bước 3: Cho kết quả tìm được lời giải Solution nếu có, list rỗng nếu không tìm
thấy
- Viết thủ tục: Kèm theo trong tập tin maple
- Dữ liệu thử nghiệm:
F={x1, x2, x3, x4, x5, x6}
R={[{x1,x2}, x3], [{x1,x2}, {x3,x4}], }
H = {x1, x2}
G = {x3}

3.3. Giải tam giác
- Yêu cầu bài toán:
o Giả sử ta có một tập các công thức:
Fomula:={A+B+C=pi, S=a*b*sin(C)/2, }
o Ý tưởng: Trong tam giác, biết 1 số thuộc tính tam giác, tính 1 hoặc các
thuộc tính còn lại của tam giác.
Bài thu hoạch: Lập trình symbolic và trí tuệ nhân tạo
13

o Mẫu: giả thiết H: H={a=5, b=4, c=3}
mục tiêu G: G={S, R} (R: bán kính vòng tròng ngoại tiếp);
- Cấu trúc dữ liệu:
 Tập các biến trong tam giác gồm :
o a, b, c : 3 cạnh của tam giác.
o , ,  : 3 góc đối diện với 3 cạnh tương ứng trong tam giác.

o ha, hb, hc : 3 đường cao tương ứng với 3 cạnh của tam giác.
o ma, mb, mc : 3 đường trung tuyến tương ứng với 3 cạnh của tam giác.
o pa, pb, pc : 3 đường phân giác trong tương ứng với 3 cạnh của tam giác.
o S : diện tích tam giác.
o p : nửa chu vi của tam giác.
o R : bán kính đường tròn ngoại tiếp tam giác.
o r : bán kính đường tròn nội tiếp tam giác.
o ra, rb, rc : các bán kính của các đường tròn bàng tiếp tam giác.
 Các hệ thức cơ bản giữa các yếu tố của tam giác :

o Liên hệ giữa 3 góc :
f1 :  +  +  =  (radian).

o Định lý cosin :
f2 : a2 = b2 + c2 - 2.b.c.cos
f3 : b2 = a2 + c2 - 2.a.c.cos
f4 : c2 = a2 + b2 - 2.a.b.cos

o Định lý Sin :
f5 :
a
sin
b
sin
 


f6 :
c
sin

b
sin
 


f7 :
a
sin
c
sin
 


f8 :
a
sin
2R



Bài thu hoạch: Lập trình symbolic và trí tuệ nhân tạo
14

f9 :
b
sin
2R




f10 :
c
sin
2R




o Liên hệ giữa nửa chu vi và 3 cạnh :
f11 : 2.p = a + b + c

o Các công thức tính diện tích :
f12 : S = a.ha/2
f13 : S = b.hb/2
f14 : S = c.hc/2
f15 : S = p.r
f16 : S =
p(p a)(p b)(p c)  

f17 : S = b.c.sin / 2
f18 : S = c.a.sin / 2
f19 : S = a.b.sin / 2

o Các công thức tính đường cao theo cạnh và góc :
f20 : ha = b.sin
f21 : ha = c.sin
f22 : hb = a.sin
f23 : hb = c.sin
f24 : hc = a.sin
f25 : hc = b.sin


o Các công thức tính các đường trung tuyến :
f26 : 4.ma2 = 2.b2 + 2.c2 - a2
f27 : 4.mb2 = 2.a2 + 2.c2 - b2
f28 : 4.mc2 = 2.a2 + 2.b2 - c2

o Các công thức tính các đường phân giác trong :
Bài thu hoạch: Lập trình symbolic và trí tuệ nhân tạo
15

f29 : pa =
2
b c
b.c.p.(p a)



f30 : pb =
2
a c
a.c.p.(p b)



f31 : pc =
2
b a
b.a.p.(p c)





o Một số công thức khác liên quan đến bán kính đường tròn ngoại tiếp,
đường tròn nội tiếp, và các đường tròn bàng tiếp :
f32 : R =
a.b.c
4.S

f33 : ra =
S
p - a

f34 : rb =
S
p - b

f35 : rc =
S
p - c

f36 : 4.R = ra + rb + rc - r

- Thuật giải:
o Biến tìm lời giải Solution: danh sách các công thức được áp dụng
o Biến Facts_known: lưu lại tập sự kiện đã biết
Bước 1: Khởi tạo các biến
Solution:=[];
Facts_known:=H; // Tập những đẳng thức mà cho ta biết biến có giá trị
bằng bao nhiêu như a=5
Bước 2:

while (G không nằm trong map(x->lhs(x), Facts_known)) do
2.1. Tìm 1 công thức f thuộc tập Fomula có thể áp dụng trên tập
Facts_known
2.2. if (không tìm được f) then
Dừng: không tìm được lời giải
2.3. Từ công thức f, thay thế và giải phương trình để tính ra biến mới
(thủ tục subs và solve)
Thêm f vào Solution;
Bài thu hoạch: Lập trình symbolic và trí tuệ nhân tạo
16

Xác định biến mới sẽ tính ra: Vnew=V(f) - V(Facts_known);
Thay thế và giải: Newfact:=solve (subs(Facts_known, f), Vnew));
Facts_known := Facts_known union Newfact;
end do;
Bước 3: Cho kết quả tìm được lời giải Solution nếu có, list rỗng nếu không tìm
thấy
- Viết thủ tục:
- Dữ liệu thử nghiệm:

Bài thu hoạch: Lập trình symbolic và trí tuệ nhân tạo
17

TÀI LIỆU THAM KHẢO

1. PGS.TS. Đỗ Văn Nhơn, Bài giảng môn Lập trình Symbolic & Trí tuệ nhân tạo.
2. Nguyễn Ngọc Trung, Giáo trình Maple, ĐHSP Tp.HCM.

×