Tải bản đầy đủ (.docx) (31 trang)

LẬP TRÌNH TÍNH TOÁN HÌNH THỨC CHO MỘT SỐ GIẢI THUẬT TRONG MẠNG TÍNH TOÁ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 (1.05 MB, 31 trang )

LỜI CẢM ƠN
Em xin gửi lời cảm ơn chân thành đến PGS.TS. Đỗ Văn Nhơn, người đã truyền
đạt những kiến thức quý báu không chỉ là lý thuyết mà Thầy còn hướng dẫn cách thức
tìm hiểu, phân tích và vận dụng lý thuyết về phương thức lập trình hình thức, công cụ lập
trình Maple, biểu diễn tri thức để xây dựng các mô hình và tạo các ứng dụng hữu ích dựa
trên các miền tri thức cụ thể. Em xin chân thành cảm ơn Thầy vì sự hướng dẫn của Thầy
trong quá trình thực hiện báo cáo này.
Em xin chân thành cảm ơn Phòng Đào tạo sau Đại học đã tạo mọi điều kiện để em
hoàn thành báo cáo này.
Xin chân thành cảm ơn sự giúp đỡ của các anh chị, bạn bè và những người đã
thường xuyên trao đổi, thảo luận và đóng góp ý kiến cho tôi về các vấn đề liên quan trong
thời gian qua.
Học viên thực hiện
Lê Thanh Trọng
1
MỤC LỤC
2
CHƯƠNG 1: CƠ SỞ LẬP TRÌNH TÍNH TOÁN HÌNH THỨC TRONG
MAPLE
1.1. Giới thiệu
Như chúng ta đã biết, trong những năm gần đây, với sự phát triển của Công nghệ
thông tin (CNTT), nhiều phần mềm hỗ trợ cho việc tính toán đã xuất hiện và càng ngày
càng được hoàn thiện. Tại nước ta, mặc dù chưa trở thành một hiện trạng phổ biến, nhưng
trong rất nhiều trường Đại học và Cao đẳng, nhiều cô giáo, thầy giáo đã thực hiện “một
cách tự phát” việc sử dụng CNTT nói chung và phần mềm tính toán nói riêng trong việc
giảng dạy Toán.
Nhiều người đã sử dụng phần mềm STATA, SPSS để xử lý các số liệu thống kê,
EVIEWS, MFIT để xử lý các số liệu trong các bài toán Kinh tế lượng,
MATHEMATICA, MATLAB, MAPLE trong các bài toán về Toán cao cấp, Toán tài
chính.
Việc sử dụng các phần mềm tính toán đã đặt ra cho các nhà quản lý giáo dục, các


cô giáo, thầy giáo một vấn đề cấp thiết là sử dụng chúng như thế nào trong công tác đổi
mới phương pháp dạy và học Toán ở các trường Đại học, Cao đẳng và Phổ thông.
Một vấn đề còn đang gây nhiều tranh luận quanh việc sử dụng một số phần mềm
khác như MATLAB, MATHEMATICA, MAPLE… trong việc dạy và học môn Toán cao
cấp. Các câu hỏi thường đặt ra là: Nên hay không nên sử dụng chúng? Nếu sử dụng thì sử
dụng đến mức nào và nhằm mục đích gì? Các phần mềm nêu trên ngoài việc tính toán
trên số, còn có một khả năng rất mạnh là tính toán trên ký hiệu (symbolic). Không phải
phần mềm tính toán nào cũng có thể cộng 2X với 3X cho kết quả 5X, hay lấy đạo hàm
một biểu thức giải tích. Trong EXCEL, ta có thể tính được ma trận nghịch đảo của một
ma trận không suy biến với các phần tử là các số, song với các phần tử bằng chữ thì máy
không làm được việc đó.
3
Trong khuôn khổ báo cáo này, chúng tôi xin đề cập đến một trong các phần mềm
mà chúng tôi đang khai thác là MAPLE. Cho đến cuối năm 2009, trên thị trường nước ta
đã có phiên bản MAPLE 13. Theo chúng tôi, MAPLE đủ đáp ứng cho các tính toán trên
số và trên các ký hiệu.
Kết hợp với công cụ toán giải MAPLE là mô hình mạng tính toán, một mô hình
“thông minh” cho phép giải một số bài toán một cách tự động trong toán học, hóa học,
vật lý,… dựa trên tập các sự kiện và các luật dẫn. Một số giải thuật hình thức sẽ được
MAPLE hiện thực và đóng gói để tạo thành các thư viện hỗ trợ cho ứng dụng trong báo
cáo này. Gói này là thành phần cốt lõi của chương trình và được MapleEngine nằm trong
thành phần giao diện (C#) triệu gọi các phương thức cần thiết để giải toán.
1.2. Sơ lược về lập trình Maple
Maple là một hệ thống tính toán trên các biểu thức đại số và minh hoạ
toán học mạnh mẽ của công tyWarterloo Maple Inc (maplesoft.com). Maple ra đời
năm 1991 đến nay đã phát triển đến phiên bản 16. Maple có cách cài đặt đơn
giản, chạy được trên nhiều hệ điều hành, có cấu trúc linh ho ạt để sử dụng tối
ưu cấu hình máy và có trình trợ giúp (help) rất dễ sử dụng. Từ phiên bản 7,
Maple cung cấp ngày càng nhiều các công cụ trực quan, các gói lệnh tự học gắn
liền với toán học phổ thông và đại học. Ưu điểm đó làm cho nhi ều người trên

thế giới lựa chọn sử dụng Maple cùng các phần mềm toán học khác áp dụng trong
dạy học toánvà các công việc tính toán đòi hỏi của thực tiễn và sự phát triển của
giáo dục.
C ó thể nhận thấy rằng ngoài các tính năng tính toán và minh hoạ rất mạnh
mẽ bằng các câu lệnh riêng biệt (thường chỉ cho ta kết quả cuối cùng), Maple còn
là một ngôn ngữ lập trình hướng thủ tục (procedure). Thủ tục là một dãy các
lệnh của Maple theo th ứ tự mà người lập trình định sẵn để xử lí một công việc
nào đó, khi thực hiện thủ tục này Maple sẽ 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.
4
Mapple có các chức năng cơ bản sau:
• Là một hệ thống tính toán trên các biểu thức đại số.
• Có thể thực hiện được hầu hết các phép toán cơ bản trong chương trình toán đại học và
sau đại học
• Cung cấp các công cụ minh họa hình học thuận tiện gồm: vẽ đồ thị động và tĩnh của các
đường và mặt được cho bởi các hàm tùy ý và trong các hệ tọa độ khác nhau.
• Là một ngôn ngữ lập trình đơn giản và mạnh mẽ, có khả năng tương tác với các ngôn ngữ
lập trình khác.
• Cho phép trích xuất ra các định dạng khác nhau như word, HTML…
• Một công cụ biên soạn giáo án và bài giảng điện tử, thích hợp với các lớp học tương tác
trực tiếp.
• Một trợ giáo hữu ích cho học sinh sinh viên trong việc tự học.
1.2.1. Các lệnh lập trình cơ bản
1.2.1.1. Vòng lặp While
a Cú pháp.
While <điều kiện> do <dãy lệnh> od;
b Chức năng.
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.
Đ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.
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.
5
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.
1.2.1.2. Vòng lặp for
a 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;
b Chức năng.
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
6
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.
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.
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.
1.2.1.3. Lệnh điều kiện if
a 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).
b 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
7
đế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 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.
1.2.1.4. Lệnh break
a Cú pháp.
break
b Chức năng.
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
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).
1.2.1.5. Lệnh next
a Cú pháp.
Next.
8
b Chức năng.
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.
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 Sử dụng các hàm RETURN, ERROR.
1.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 chu trình.
Nếu không có lệnh RETURN, chu trình tự động cho kết quả của phép tính cuối cùng
trong chu trình.
Hàm ERROR được sử dụng để đưa thông điệp lỗi ra màn hình từ bên trong chu
trình.
1.2.2. Cách thiết lập chu trình
1.2.2.1. Giới thiệu
Maple là một ngôn ngữ lập trình hướng chu trình (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ế độ chu trình đượ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 chu trình (procedure) duy nhất, sau đó ta chỉ cần gọi chu
trình này và Maple tự động thực hiện các lệnh có trong chu trình đó một cách tuần tự và
sau đó trả lại kết quả cuối cùng.
9
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 chu trình
(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 chu trình cũng như có thể trao đổi
dùng chung những gói chu trình nào đấy, phục vụ cho công việc mang tính đặc thù riêng
của mình.
Các khái niệm cơ bản cần phải nắm vững để tạo ra một chu trình (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, ).
1.2.2.2. Khai báo chu trình
Lời gọi khai báo một chu trình:
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:
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 chu trình.
10
local_sequence: Là một dãy các tên được khai báo là biến cục bộ trong chu trình,
nó chỉ có giá trị sử dụng trong phạm vi chu trình đ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 chu trình).
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
chu trình.
options_sequence: Dãy các tuỳ chọn cho một chu trình.
statements_sequence: Dãy các câu lệnh do người lập trình đưa vào.
1.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 chu trình khi gọi chu trình đó.
Ví dụ ta có thể khai báo chu trình tính tổng của 2 số [tong:=proc(x,y) x+y; end.] thì khi
gọi chu trình 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 chu trình 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 chu trình đã được

khai báo, bên ngoài chu trình 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.
1.2.2.4. Phạm vi các biến
Biến toàn cục:
 Biến toàn cục được khai báo sau từ khoá global trong khai báo chu trình.
 Biến toàn cục được khai báo bên trong một chu trình, 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 chu trình mà nó được khai báo trong đó.
Biến cục bộ:
11
 Biến cục bộ được khai báo sau từ khoá local trong khai báo chu trình.
 Biến cục bộ chỉ có giá trị bên trong chu trình mà nó được khai báo. Ngoài chu trình này
nó không mang ý nghĩa gì.
Tham biến:
 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 chu trình
mà nó được khai báo. Sau khi chu trình kết thúc, chúng không còn giá trị.
 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ử.
1.2.2.5. Định giá các biến
Định giá tên hàm và tham biến: 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 chu trình được định giá. Sau
đó lần lượt đến các đối số trong danh sách các đối số truyền cho chu trình (được định giá
từ trái sang phải). Nếu tên chu trình được định giá trỏ đến một chu trình, thì chu trình ấy
được thực thi trên các đối số đã được định giá. Tuy nhiên vẫn có một số chu trình 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: Các biến cục bộ và tham biến truyền cho
chu trình đượ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.

1.2.3. 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.
12
- Dò từng lệnh trong chu trình:
trace(f)
trace(f, g, h, . . .)
Tham số: Các hàm f, g, h, là các hàm cần chạy từng bước.
Lệnh trace cho in cách thức hiện từng lệnh của một chu trình ra màn hình.
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.
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
chu trình, giá trị trả lại của hàm được hiện ra ở điểm cuối chu trình.
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 chu trình:
showstat(procName)
showstat(procName, statRange)
Tham số: procName: Tên của chu trình cần hiển thị mã nguồn.
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ã
13
nguồn của chúng). Ta có thể hiển thị một phần mã nguồn của các chu trình 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 chu
trình đó 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 chu
trình.
- Chặn bắt lỗi:
traperror(expr1, expr2, )
Tham số: expr1, expr2, là các biểu thức.
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.
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.
14
CHƯƠNG 2: LẬP TRÌNH TÍNH TOÁN HÌNH THỨC CHO MỘT SỐ GIẢI
THUẬT TRONG MẠNG TÍNH TOÁN
2.1. Giới thiệu mạng tính toán
2.1.1. Giới thiệu
Nhận thấy có nhiều vấn đề trong các lĩnh vực khác nhau đặt ra dưới dạng một
“mạng” của các yếu tố, trong đó giữa các yếu tố có những mối liên hệ (hay quan hệ) cho
phép ta suy ra được một số yếu tố này từ một số yếu tố khác.
Mô hình mạng suy diễn – tính toán là một sự khái quát dạng tri thức trên có thể
dùng để biểu diễn tri thức và thiết kế các chương trình giải toán tự động.

2.1.2. Các định nghĩa
2.1.2.1. Quan hệ suy diễn
Cho M = {x
1
,x
2
, ,x
m
} là một tập hợp các biến có thể lấy giá trị trong các miền xác
định D
1
, D
2
, ,D
m
. Mỗi quan hệ suy diễn R trên M được xác định bởi một (hay một số)
ánh xạ có dạng:
f
R,u,v
: D
u
→ D
v
,
trong đó u,v là các bộ biến được phân chia từ bộ biến x = <x
1
,x
2
, ,x
m

>; D
u
và D
v
là tích của các miền xác định tương ứng của các biến trong u và trong v.
Quan hệ suy diễn R(x) có thể được biểu diễn bởi một (hay một số) ánh xạ f
R,u,v

ta viết vắn tắt là:
f : u ⇒ v.
Cách ký hiệu trên bao hàm ý nghĩa như một luật suy diễn: ta có thể xác định hay
suy ra được các biến thuộc v khi biết các biến thuộc u.
Quan hệ là đối xứng và có hạng k khi quan hệ đó giúp ta có thể tính được k biến
bất kỳ từ m-k biến kia (ở đây x là bộ gồm m biến < x1,x2, ,xm >).
2.1.2.2. Mạng suy diễn
Mạng suy diễn, viết tắt là MSD, là một cấu trúc (M,F) gồm 2 tập hợp:
M = {x
1
,x
2
, ,x
n
}, là tập hợp các thuộc tính hay các biến lấy giá trị trong các miền
xác định nào đó.
F = {f
1
,f
2
, ,f
m

}, là tập hợp các luật suy diễn có dạng:
15
f : u(f) → v(f)
trong đó u(f) và v(f) là các tập hợp con khác rỗng của M sao cho
u(f) ∩ v(f) = ∅.
Ký hiệu: M(f) = u(f) ∪ v(f).
2.1.3. Một số khái niệm và kí hiệu
2.1.3.1. Định nghĩa tính áp dụng được của luật
Một luật suy diễn u → v được được gọi là áp dụng được trên A khi
u ⊂ A.
Một quan hệ suy diễn được gọi là áp dụng được trên A khi nó xác định một luật
suy diễn áp dụng được trên A.
Dãy D = [f
1
, f
2
, , f
k
] các quan hệ suy diễn (hay luật suy diễn) của mạng suy diễn
(M,F) được nói là áp dụng được trên tập A khi và chỉ khi ta có thể lần lượt áp dụng được
các quan hệ f
1
, f
2
, , f
k
xuất phát từ giả thiết A.
Ký hiệu:
Với D = {f
1

, f
2
, , f
k
}
Đặt: A
0
= A, A
1
= A
0
∪ M(f
1
), . . . , A
k
= A
k-1
∪ M(f
k
), và ký hiệu A
k
là D(A). Có
thể nói rằng D(A) là sự mở rộng của tập A nhờ áp dụng dãy quan hệ D.
2.1.3.2. Định nghĩa lời giải
D = {f
1
, f
2
, , f
k

} là một lời giải của bài toán A → B khi lần lượt áp dụng các quan
hệ fi (i=1, ,k) xuất phát từ giả thiết A thì sẽ suy ra được các biến thuộc B. Nói cách khác
D là một lời giải của bài toán khi
D(A) ⊃ B.
Bài toán A → B là giải được khi nó có một lời giải.
Lời giải {f
1
, f
2
, , f
k
} được gọi là lời giải tốt nếu không thể bỏ bớt một số bước
tính toán trong quá trình giải, tức là không thể bỏ bớt một số quan hệ trong lời giải.
Lời giải ngắn nhất: có số bước suy diễn thấp nhất.
2.1.4. Quá trình đi tìm lời giải
16
Dãy quan hệ suy diễn D là một lời giải của bài toán A → B khi và chỉ khi D áp
dụng được trên A và D(A) ⊇ B.
⇒ Để tìm một lời giải ta có thể làm như sau: xuất phát từ giả thiết A, ta thử áp
dụng các quan hệ để mở rộng dần tập các biến được xác định (được biết); và quá trình
nầy tạo ra một sự lan truyền tính xác định trên tập các biến cho đến khi đạt đến tập biến
B.
- Thuật toán tìm một lời giải của bài toán A -> B.
1. Solution ¬ empty;
// Solution là dãy các quan hệ sẽ áp dụng
2. if B ⊆ A then
begin
Solution_found ¬ true;
// biến Solution_found = true khi
// bài toán là giải được

goto bước 4;
end
else
Solution_found ¬ false;
3. Repeat
Aold ¬ A; Chọn ra một f ∈ F chưa xem xét;
while not Solution_found and (chọn được f) do
begin
if ( f đối xứng and 0 < Card (M(f) \ A) ≤ r(f) ) or
(f không đối xứng and ∅ ≠ M(f) \ A ⊆ v(f)) then
begin
A ¬ A ∪ M(f);
Solution ¬ Solution ∪ {f};
end;
if B ⊆ A then
Solution_found ¬ true;
17
Chọn ra một f ∈ F chưa xem xét;
end;{ while }
Until Solution_found or (A = Aold);
4. if not Solution_found then
Bài toán không có lời giải;
else
Solution là một lời giải;
2.1.5. Thuật toán tìm một lời giải tốt
Giả sử {f
1
, f
2
, , f

m
} là một lời giải của bài toán A→ B. Tìm một lời giải tốt cho
bài toán.
1. D


{
f
1
, f
2
, , f
m
}
;
2. for i=m downto 1 do
if D \
{
f
i
}
là một lời giải then
D

D \
{
f
i
}
;

3. D là một lời giải tốt.
Lưu ý: Ta có thể tìm một lời giải tốt từ một lời giải biết trước bằng cách lần lượt
xem xét các quan hệ trong tập lời giải đã biết và chọn ra các quan hệ để đưa vào một lời
giải mới sao cho trong lời giải mới nầy không thể bớt ra bất kỳ một quan hệ nào.
Mô hình mạng tính toán cho bài toán cần giải quyết trong mạng ngữ nghĩa bao
gồm một số giải thuật cần có như: giải thuật tìm lời giải, giải thuật tìm bao đóng, giải
thuật tìm lời giải tối ưu, giải thuật bổ sung dữ kiện khi dữ kiện thiếu,…
2.2. Hiện thực một số thuật giải trong Maple
2.2.1. Tìm lời giải từ giả thuyết ban đầu
Bằng thủ thuật lan truyền, ta mở rộng tập biến A có thể tính toán được nhờ
vào giả thuyết ban đầu và sau đó thêm biểu thức tính f vào lời giải ban đầu là rỗng S:=[].
Minh họa bằng thủ tục trong Maple: Tìm lời giải cho bài toán A->B trên tập luật
Q.
18
2.2.2. Tìm bao đóng cho tập biến A trên tập luật Q
Là phép mở rộng tập biến ban đầu trên tập luật có sẵn bằng cách duyệt tuần
tự các luật trong Q. Kết thúc một lượt duyệt trên Q thì tập biến sẽ được cập nhật mới và
các luật đóng góp biến mới cho tập biến sẽ bị loại bỏ. kết thúc ta được tập biến rông hơn
là tất cả các yếu tố có thể tìm được lời giải từ tập biến ban đầu.
Tìm bao đóng có ý nghĩa lớn trong mô hình Mang Tinh Toán, nó được áp
dụng trong phép kiểm tra và thu thập lời giải trong các bước sau.
Minh họa bằng thủ tục trong Maple: Tìm lời giải cho bài toán A->B trên tập luật
Q.
Minh họa bằng thủ tục trong Maple: Tìm lời giải cho bài toán A->B trên tập luật
Q.
Minh họa bằng thủ tục trong Maple: Tìm bao dong cho tập biến A trên tập
luật Q.
19
2.2.3. Kiểm tra lời giải
Để kiểm tra lời giải ban cho trước K có là lời giải đầy đủ cho bài toán A-

>B không, ta mở rộng tập biến A trên các luật trong K hay nói cách khác là tìm bao đóng
của A trên tập luật K. Sau khi tìm được tập bao đóng, nếu B thuộc tập bao đóng này thì
bài toán là khả giải trên K hay K là một lời giải của bài toán A->B.
Minh họa bằng thủ tục trong Maple: Kiểm tra K có là lời giải cho bài tóa A-
>B không?
20
2.2.4. Tìm lời giải tối ưu
Trong bước trên lời giải chỉ là lời giải thô chưa tối ưu, chúng ta cần tối ưu
lời giải hơn cho bài toán. Ý tưởng tìm lời giải tối ưu là loại bỏ các bước thừa vừa tìm
được như trên. Duyệt qua từng biểu thức trong lời giải đã có, ta thử bỏ đi biểu thức đó và
kiểm tra lời giải đã bỏ biểu thức trên có giải được bài toán A->B không, nếu giải được
thì lời giải mới là lời giải cũ bỏ đi biểu thức đó.
Minh họa bằng thủ tục trong Maple: Tìm lời giải tối ưu cho bài toán A->B
trên tập luật Q.
21
2.2.5. Rút gọn lời giải
Đôi khi giả thuyết cho là thừa, chúng ta cần tối ưu giả thuyết bằng cách tìm
và bỏ đi các giả thuyết thừa.
Giống như tối ưu lời giải, qua từng biến trong tập biến và tìm bao đóng cho tập
biến vừa bỏ một biến vaa2 kiểm tra xem yếu tố cần tìm có nằm trong bao đóng này hay
không. Nếu nằm trong thì giả thuyết mới có thể bỏ đi biến này và ta được tập biến gọn
hơn, tối ưu hơn.
Minh họa bằng thủ tục trong Maple: Đơn giản giả thuyết hay lọa giả thuyết
thừa cho bài toán A->B trên tập luật Q.
22
2.2.6. Bổ sung lời giải
Ngược lại nếu thiếu giả thuyết, ta cũng tuần tự xét qua các biến trong tập M
và không có trong giả thuyết, xem khi thêm biến này thì bài có có giải được không. Thực
hiện điều này đến khi bài toán là giải được thì kết thúc.
Minh họa bằng thủ tục trong Maple: Bổ sung lời giải cho bài toán A-> B

trên tập luật Q, và tập biến M.
23
24
CHƯƠNG 3: CHƯƠNG TRÌNH ỨNG DỤNG
Trong phần này báo cáo sẽ trình bày ứng dụng lập trình tính toán hình thức cùng
với mạng tính toán đã trình bày ở chương 2 trong giải bài toán tam giác, hình chữ nhật và
bài toán điện một chiều. Đây là các bài toán điển hình nhằm mang lại các ví dụ minh họa
phương thức lập trình tính toán hình thức một cách rõ nét và dễ hiểu.
3.1. Mô hình bài toán
3.1.1. Tập sự kiện
Là những thuộc tính về tam giác, hình chữ nhật và điện một chiều, các biến này có
giá trị thuộc tập các số thực dương.
 Đường tròn
- Tâm I(a, b).
- r : bán kính
- d : đường kính.
- S : diện tích.
- P : chu vi.
- X(x, y) : một điểm nằm trên đường tròn.
 M = {a, b, r, d, S, P, x, y}
 Hình chữ nhật
- d : chiều dài.
- r : chiều rộng.
- ch : chiều dài đường chéo.
- S : diện tích.
- C : chu vi.
 M = {d, r, ch, S, C}
 Điện một chiều ((r1//r2) nt (n3//r4))
- U: hiệu điện thế toàn mạch
- I: cường độ dòng điện toàn mạch

- R: điện trở tổng
- U1: hiệu điện thế hai đầu điện trở thứ nhất
- U2: hiệu điện thế hai đầu điện trở thứ hai
- I1: cường độ dòng điện của điện trở thứ nhất
- I2: cường độ dòng điện của điện trở thứ hai
- R1: độ lớn điện trở thứ nhất
- R2: độ lớn điện trở thứ hai
- U12: hiệu điện thế mạch chứa điện trở thứ nhất và thứ hai
- I12: cường độ dòng điện của mạch chứa điện trở thứ nhất và hai
- R12: độ lớn điện trở toàn mạch chứa điện trở thứ nhất và hai
25

×