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

các khái niệm và các hàm cơ bản trong lập trình trên maple

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 (432.6 KB, 43 trang )

85
Chơng 3
Các khái niệm và các hàm cơ
bản trong lập trình trên Maple

3.1. Các khái niệm cơ bản 85

3.1.1. Tên (name) và xâu kí tự 86

3.1.2. Biến trong Maple 87

3.1.3. Sự định giá 87

3.1.4. Ngăn cản định giá 90

3.1.5. Sự tự động đơn giản biểu thức 91

3.1.6. Các tính toán số trong Maple 92

3.2. Các hàm thờng dùng trong Maple 92

3.2.1. Ước lợng giá trị 92

3.2.2. Đơn giản biểu thức: lệnh
simplify
94

3.2.3. Tìm giá trị lớn nhất và bé nhất 96

3.2.4. Thay thế trong biểu thức: lệnh subs 97


3.2.5. Tổ chức biểu thức theo một số biến chính 99

3.2.6. Sắp xếp các số hạng 100

3.2.7. Chuyển đổi dạng cấu trúc dữ liệu (lệnh convert) 102

3.2.8. Thực hiện một phép toán trên nhiều thành phần 104

3.2.9. Xem cấu trúc và thành phần của một biểu thức 105

3.2.10. Kiểm tra một phần tử có thuộc một dữ liệu có cấu trúc nào đó 108

86
3.2.11. Kiểm tra một tên đã đợc gán hay cha 109

3.3. Cách tạo lập hàm trong Maple 111

3.3.1.Thiết lập các hàm kép (hàm hợp, hàm lồng nhau) 111

3.3.2. Định nghĩa hàm bằng toán tử mũi tên (->) 112

3.3.3. Định nghĩa hàm bằng toán tử hợp thành @ 113

3.3.4. Dùng chu trình
proc() end
để tạo hàm 114

3.4. Các cấu trúc dữ liệu cơ bản 117

3.4.1. Cấu trúc dữ liệu dãy 117


3.4.2. Cấu trúc tập hợp và danh sách 119

Tập hợp 119

Danh sách 119
Lệnh tạo danh sách và tập hợp 120
3.4.3. Cấu trúc dữ liệu bảng 122

Lệnh tạo bảng 122
3.4.4. Cấu trúc dữ liệu mảng 124

3.4.5. Sparse, symmetric, những giản đồ chỉ định đặc biệt cho mảng và
bảng 126

3.1. Các khái niệm cơ bản
3.1.1. Tên (name) và xâu kí tự
Tên là một xâu hình tự (string of letters) đợc dùng nh một chỉ mục hay một
nhãn để đại diện cho các đối tợng trong Maple có thể thay đổi đợc (nh biến, kí
hiệu toán học, các biểu thức nói chung, ) mà ta có thể gán cho nó. Tên là một
trong các thành phần không thể thiếu đợc của Maple trong việc tạo ra các biểu
thức. Chiều dài tối đa của tên phụ thuộc vào hệ máy tính mà Maple chạy trên đó
(với máy 32-bit thì chiều dài tối đa của tên là 524275).
Bất cứ biểu thức nào đều có thể đợc gán cho một cái tên. Nếu không có giá trị
nào đợc gán cho một tên thì nó sẽ nhận chính tên nó làm giá trị mặc định.
Chơng trình Maple sử dụng tên bắt đầu với một dấu gạch dới ( _ ) làm các
biến toàn cục, và vì thế chúng ta nên tránh sử dụng chúng.
Một xâu ký tự
bất kỳ (string of characters) có thể không phải là xâu hình tự (vì
có thể chứa các ký tự đặc biệt nh: khoảng trống, dấu chấm than, ) và do đó không

87
thể là một tên hợp lệ. Tuy nhiên, Maple cho phép tạo một tên từ một xâu ký tự bất
kỳ bằng cách cho nó vào trong cặp dấu nháy đơn ( ` ) (backquote), thí dụ nh xâu
kí tự `a variable!` là một tên biến hợp lệ, và ngời ta có thể gán cho nó giá trị 10
bằng lệnh
`a variable!`:=10.
Một xâu hình tự thờng là một tên hợp lệ và đợc xem là trùng với tên đợc tạo
bằng cách bao chung quanh xâu này bằng cặp dấu nháy (vì thế mà x và `x` đều chỉ
đến một tên). Tuy nhiên, nếu
xâu hình tự mà trùng với từ khóa của Maple thì
không phải là một tên hợp lệ, và muốn cho nó trở thành một tên ta lại phải cho nó
vào trong cặp dấu nháy.
Hai dấu nháy liên tiếp trong một xâu kí tự sẽ đợc hiểu nh là một dấu. Ví dụ
nh khi ta viết:
print(` I``m a student`); thì kết quả sẽ cho ta xâu: I`m a student.
3.1.2. Biến trong Maple
Biến trong Maple là những tên đợc dùng để thay thế cho một đối tợng nào
đó, thông thờng là các giá trị cần thay đổi, hoặc các biểu thức tính toán cần cho
giá trị, Có hai loại biến trong Maple: Biến lập trình và biến toán học.
Biến lập trình là những biến có thể gán bởi một giá trị nào đó và giá trị đó đợc
lu trữ cho đến tận lúc nó thực sự bị thay đổi.
Một biến toán học thể hiện cho ẩn số trong toán học, không thể đợc gán giá
trị và tất nhiên ta không thể dùng nó nh là một biến lập trình. Nếu bạn không
muốn phân biệt biến đợc gán (biến lập trình
) và biến không đợc gán (biến toán
học
) trong Maple thì bạn có thể nghĩ rằng biến toán học trong Maple là biến đợc
gán mà giá trị luôn bằng chính tên biến.
Biến cũng giống nh một tê
n, bắt đầu bởi một hình tự, theo sau là các chữ cái

khác, các chữ số, và dấu gạch dới.
3.1.3. Sự định giá
Một tên mà đợc gán một giá trị (khác tên nó) thì sẽ trở thành biến chơng
trình, còn nếu cha từng đợc gán một giá trị nào thì nó nhận chính tên nó làm giá
trị và đợc xem nh là một kí hiệu biểu thị cho ẩn số trong toán học (chẳng hạn
trong phơng trình, biến trong đa thức, ). Nh vậy, việc phân biệt một tên là một
biến chơng trình hay là một biến toán học (mang ý nghĩa là ẩn số) là rất quan
trọng đối với Maple trong lúc thực hiện các lệnh có chứa tham số. Ta xem xét chi
tiết bằng cách phân tích một ví dụ cụ thể.
Xét dãy các phép gán:
[>
restart;
[>
z:=y;
y:=t;
t:=x^2+5*x-12;
88
x;

:=
z
y

:= yt

:= t

+



x
2
5
x
12

Trên đây các tên
,,
x
yzđều đợc gán giá trị (hoặc là tên biến, hoặc là một biểu
thức, ) còn
x thì không đợc gán giá trị, do đó x là một biến toán học và tất nhiên
x không chứa giá trị nào (hay nói đúng hơn là giá trị của x chính là kí hiệu x).
Sau các phép gán, giá trị của
,,
z
yt
đều tham chiếu đến biểu thức
2
512xx+, chúng đợc xem nh là biến có thể lập trình đợc, giống nh khái
niệm biến trong các ngôn ngữ lập trình truyền thống nh C, Pascal, Còn
x thì chỉ
đợc xem là biến theo ý nghĩa toán học, tức là một kí hiệu thể hiện cho một ẩn số :
[>
z;


+



x
2
5
x
12

[>
y;

+


x
2
5
x
12

[>
t;

+


x
2
5
x
12


Biến y có thể đợc gán bởi các giá trị khác, do đó nội dung của nó hoàn toàn thay
đổi, và tất nhiên giá trị của z cũng bằng giá trị của y:
[>
y:=10;

:= y 10

[>
z;

10

Ta có thể hiểu điều này nh sau: Bất cứ khi nào Maple thực hiện việc tính toán, các
tên trong biểu thức đều đợc kiểm tra xem có phải chúng đợc dùng nh là biến
chơng trình (tức là có phải chúng đã đợc gán giá trị) hay không. Nếu đúng nh
vậy, Maple thay thế tên bằng nội dung của nó (có thể là một tên khác, biến, hằng,
hay biểu thức, ) vào trong biểu thức đang tính, rồi sau đó nó tiếp tục kiểm tra xem
liệu có còn giá trị hay biến chơng trình nào có thể đợc thay thế nữa không, còn
nếu nội dung của tên đấy chính là tên của nó thì Maple xem tên này là một biến
toán học và đợc giữ nguyên. Quá trình cứ tiếp tục nh vậy cho đến khi không còn
tên nào đợc gán nữa. Kết quả thu đợc, sau khi không còn có thể gán thêm đợc
nữa, thì đợc gọi là biểu thức đợc định giá hoàn toàn và Maple thực hiện các phép
toán trên đấy. Nh vậy, trong ví dụ trên, khi đọc đến z để in giá trị của nó, Maple
thay thế nó bởi y, sau đó thay thế y bởi 10 rồi mới in giá trị 10 ra nh là giá trị của
z. Còn biến t vẫn không thay đổi nội dung của nó:
89
[>
t;



+


x
2
5
x
12

Biến toán học chẳng qua là biến chơng trình đợc gán giá trị chính là tên của
nó. Khi ta gán cho nó một giá trị khác (so với tên của nó) thì nó trở lại thành biến
chơng trình, thí dụ:
[>
x:=10;

:=
x
10

Khi x đợc gán một giá trị số (nh trên), thì nội dung của
t đợc tính toán nh thế
nào:
[>
t;

138

Nh vậy, t đợc ớc lợng theo giá trị x=10 và do đó t đợc tính toán thành
t:=10^2+5*10-12=138.
Dĩ nhiên, ta có thể gán cho x giá trị là tên của nó (là 'x') để x lại trở thành biến

toán học nh cũ:
[>
x:='x';
[>t;

:=
x
x


+


x
2
5
x
12

Chú ý Một lỗi mà nhiều ngời sử dụng Maple thờng mắc phải là: dùng biến i
làm biến chơng trình, rồi sau đó thì lại dùng
i
nh chỉ số của tổng trong lệnh tính
toán tổng
sum
. Ví dụ dới đây minh hoạ cho vấn đề này.
[>
x:=3;

:=

x
3

[>
i:=4;

:= i 4

[>
x^i!;

282429536481

Bây giờ xem i nh là kí hiệu toán học và thực hiện lệnh sum() trong đó i là chỉ số
tính tổng:
90
[>
sum(i^2,i=1 n);

Error, (in sum) summation variable previously
assigned, second argument evaluates to, 4 = 1 n
Trong thông báo lỗi này chỉ rõ i trớc đó đã đợc dùng nh là một biến chơng
trình (vì đã đợc gán giá trị là 4). Khi lệnh sum đợc thực hiện, Maple trớc tiên
thực hiện việc định giá hoàn toàn cho các đối số của lệnh
sum. Vì thế, (i^2,i=1 n)
đợc biến đổi trở thành (16,4=1 n) trớc khi lệnh sum đợc gọi đến. Thông điệp lỗi
đợc phát sinh bởi vì "4" không là tên chỉ số tính tổng hợp lệ.
3.1.4. Ngăn cản định giá
Sự định giá biểu thức đợc Maple dùng để tính toán các công thức cũng nh
biểu diễn các công thức toán học hình thức (nh các phơng trình, ẩn số, ). Tuy

nhiên việc định giá các tên trong biểu thức trớc khi đợc tính toán đôi khi làm cho
biểu thức bị thay đổi ngoài mong muốn làm cho phép tính sai hay lệnh sinh ra lỗi
(chẳng hạn trong ví dụ ở phần trớc). Do đó Maple cung cấp cho ngời dùng khả
năng ngăn cản việc định giá với mức độ nào đó phù hợp với điều kiện của phép tính
mà ngời đó cần thực hiện.
Việc đặt các biến trong cặp dấu nháy đứng ( ' ) là một cách để chỉ rõ cho
Maple biết đó là tên của biến chơng trình, mà không phải là giá trị của chúng, và
do đó ngăn cản việc định giá các biến đợc đóng trong cặp dấu này. Tuy nhiên,
việc này không ngăn cản các phép toán số học đơn giản (nh cộng, trừ, nhân, chia,
lấy tổng sum(), lấy tích product(), ) hay hầu hết các thao tác tự động đơn giản biểu
thức khác (nh các hàm subs, simplify, ). Kết quả của việc định giá hoàn toàn một
biểu thức đã đợc đặt trong cặp dấu nháy đứng phải là biểu thức đã đợc lột bỏ lớp
dấu nháy này.
Ta sử dụng x nh là một biến chơng trình:
[>
x:=100;
:=
x
100

[>
'x'+1;

+
x
1

Mỗi lần định giá một biểu thức trong các cặp dấu nháy là lột bỏ một lớp dấu:
[>
''x'+1';



+ ''
x
1

[>
%;


+
x
1

[>
%;

101

91
[>
'(x+15)mod 20';

mo
d
()

+
x
15 20


[>
%;
15

Trong trờng hợp bạn muốn loại bỏ giá trị đã gán cho biến chơng trình, khôi phục
lại nó nh là một kí hiệu toán học, thì bạn hãy gán tên của biến cho chính nó:
Biến x đợc gán là biến chơng trình:
[>
x:=3;

:=
x
3

Khôi phục biến x trở thành kí hiệu toán học:
[>
x:='x';

:=
x
x

[>
x+1;


+
x
1


3.1.5. Sự tự động đơn giản biểu thức
Hầu hết các biểu thức đợc Maple lu trữ dới dạng mà bạn đã gõ vào, hoặc
theo cách mà chúng tạo ra trong quá trình tính toán. Tuy nhiên vẫn có những ngoại
lệ đối với cách làm này ở chỗ: những ngời thiết kế Maple tin rằng hầu hết những
ngời sử dụng đều muốn một vài phép biến đổi đợc tự động thực hiện (ví dụ nh:
việc chuyển đổi 0*x thành 0, x*2 thành 2*x, x+x thành 2*x, ). Sự biến đổi các
biểu thức này đợc gọi là sự đơn giản hóa.
Sau đây là những nét đặc trng đáng chú ý của sự tự động đơn giản trong
Maple:
Phép tính số học trên tổng, tích, và luỹ thừa của các số tự nhiên và các số hữu
tỷ đợc Maple tự động thực hiện.
Ước số chung lớn nhất của tử số và mẫu số trong số hữu tỉ đợc rút gọn.
Các thừa số chung trong tử số và mẫu số của một phân thức cũng đợc rút
gọn.
Tích của các số hạng thì đợc sắp lại sao cho số hạng là hằng số là phần tử
đứng trớc trong biểu thức tính tích đó.
Các phần tử giống nhau trong tổng hoặc tích thì đợc gộp lại, chẳng hạn x+x
đợc gộp lại thành 2*x, x*y+x*z đợc gộp lại thành x*(y+z).
92
Nếu biểu thức là tích của một số với một tổng các đơn thức thì Maple thực
hiện phân phối phép nhân với phép cộng. Ví dụ nh 1/2*(x+y) sẽ cho
x/2+y/y trong biểu thức kết quả.
3.1.6. Các tính toán số trong Maple
Maple tính toán số một cách chính xác. Các số vô tỷ cha có ký hiệu biểu diễn
đợc Maple gán tên một cách thích hợp, và Maple có thể cho giá trị xấp xỉ của các
số này (cũng nh bất kỳ số vô tỷ nào nh:

,e


, ) với độ chính xác "tuỳ thích"
(nghĩa là đủ lớn!). Trong tính toán, chúng ta thờng làm việc với các số thập phân
với dấu chấm động (là những số có chứa dấu chấm ngăn cách phần nguyên với
phần thập phân). Số lợng các chữ số trong phần thập phân càng nhiều thì độ chính
xác của số đó càng cao. Các ngôn ngữ truyền thống nh C,Pascal, cũng sử dụng
các số có dấu chấm động trong việc biểu diễn và tính toán các số thực. Số lợng các
chữ số trong phần thập phân của các số đợc biểu diễn trong các ngôn ngữ quy ớc
trên là cố định, do đó độ chính xác của các số này bị giới hạn trong một khoảng
nhất định. Dĩ nhiên, chúng chiếm ít bộ nhớ hơn các số chính xá
c đợc biểu diễn
bằng Maple và đồng thời các phép toán thực hiện trên các số này cũng nhanh hơn.
Kết quả tính toán của Maple với các số chính xác thì độc lập với sai số làm tròn,
điều mà ta không thể có đợc nếu sử dụng các số thập phân có dấu chấm động cố
định.
Đôi khi ta nhận thấy việc sử dụng các phép toán cho kết quả gần đúng là cần
thiết, chẳng hạn nh khi bạn chỉ muốn ớc lợng nhanh giá trị của một số và biết
chắc rằng sai số do việc làm tròn số không làm ảnh hởng xấu đến chất lợng tính
toán. Maple cung cấp các hàm dùng để ớc lợng các số theo dấu chấm động.
Chúng ta có thể yêu cầu Maple ớc lợng các số với độ chính xác cần thiết, chẳng
hạn bạn có thể yêu cầu Maple ớc lợng các số với 10, 20, hay hàng trăm chữ số
thập phân sau dấu chấm. Mặc định, Maple thờng thực hiện phép tính các số có dấu
chấm động chính xác đến 10 chữ số. Xem thêm về hàm
evalf để biết thêm chi
tiết.
3.2. Các hàm thờng dùng trong Maple
3.2.1. Ước lợng giá trị
Mô tả

Hàm
evalf(expression,n)

cho xấp xỉ của số có trong biểu thức
expression dới dạng số thập phân có dấu chấm động với độ chính xác
tới
n
chữ số thập phân (
n
là số tự nhiên). Tham số
expression
có thể
nhận bất cứ toán tử, biểu thức hay là các hàm tính toán khác mà những hàm
này phải cho giá trị là các số cũng nh các hằng số.

Hàm
evalf(expression)
mặc định sẽ cho kết quả là các số có 10 chữ
số thập phân sau dấu chấm động. Nếu muốn thay đổi độ chính xác tính
93
toán, ta có thể dùng lệnh trên, hoặc thay đổi giá trị mặc định này bằng lệnh
thay đổi biến
Digits
.
Lệnh
Cú pháp:
evalf(expression);
evalf(expression,[Digits]);
Các tham số:

expression
: Biểu thức cần ớc lợng.
[Digits]: Là tham số tuỳ chọn, nhận giá trị là số tự nhiên (số

lợng các số sau dấu chấm thập phân).
Ví dụ minh hoạ
Nhiều biểu thức cho kết quả cha đợc định giá trị số mà để dới dạng là các
số chính xá
c:
[>
bt1:=ln(2)+sqrt(3);

:= bt1

+ ()ln 2 3

[>
bt2:=1423/23546;

:= bt2
1423
23546

Hàm
evalf(expression)
ớc lợng các số với số các chữ số thập phân mặc
định trong biến
Digits:
[>
evalf(bt1);

2.425197989

Để biết số chữ số thập phân mặc định là bao nhiêu ta dùng lệnh

[>
Digits;
10

và để đặt lại chế độ mặc định (với số lợng các chữ số thập phân là 40 chẳng hạn)
ta dùng lệnh
[>
Digits:=40;

:=
D
igits 40
.
Khi ấy
[>
evalf(bt1);
94
2.425197988128822602944678462964048935019
Hàm evalf(expression,digits) ớc lợng các số với số các chữ số thập phân
xác định bằng tham số
digits
:
[>
evalf(bt2,5);

.060435

[>
evalf(bt2,70);


.06043489340015289221099125116792661173872419943939522636541238426909029
3.2.2. Đơn giản biểu thức: lệnh simplify
Mô tả

Mặc dù Maple tự động thực hiện đơn giản biểu thức nhng không phải lúc
nào nó cũng đa một biểu thức về đợc dạng theo ý ta muốn. Chẳng hạn,
Maple không tự động phân tích biểu thức thành nhân tử hoặc khai triển một
đa thức, cũng nh không rút gọn ớc số chung lớn nhất trong các hàm phân
thức (tỉ số giữa hai đa thức). Nhiều phép biến đổi trong Maple chiếm nhiều
thời gian cũng nh bộ nhớ cần thiết để lu trữ, và thông thờng thì các tính
toán còn phụ thuộc vào mức độ ớc lợng của ngời sử dụng trong những
trờng hợp nhất định. Chính vì vậy mà Maple đã để các phép biến đổi này
cho ngời dùng tự áp dụng tuỳ theo chọn lựa của riêng mình.

Hàm
simplify
là một hàm đơn giản biểu thức dùng chung cho nhiều dạng
ớc lợng khác nhau. Nó thực hiện chính xác trong hầu hết, tuy rằng không
phải là tất cả, các trờng hợp. Chẳng hạn nh nó luôn đợc dùng để đơn giản
các biểu thức phân thức, cũng nh đợc áp dụng cho tất cả các loại đơn giản
biểu thức chuẩn mà ta sẽ liệt kê dới đây. Bằng cách sử dụng simplify, ta có
thể biến đổi
x^2-y^2-(x-y)*(x+y) thành 0, đơn giản hoá
sin(x)^2+cos(x)^2
bằng
1
, hoặc biến đổi
log(x^2)
thành
2*log(x)

.
Chúng ta cũng có thể thực hiện việc đơn giản một phần biểu thức bằng cách
dùng tham số chọn lựa các phơng thức đơn giản biểu thức dới đây.
Các phơng thức đơn giản biểu thức:

atsign : toán tử hàm. ví dụ: sin@arcsin cho ta x-> x.

GAMMA : theo hàm gamma. ví dụ: GAMMA(n+1)/GAMMA(n) cho ta n.

hypergeom : theo các hàm hypergeometric. Ví dụ: hypergeom([1],[1],z)
thì cho ta
exp(z).

power : Đơn giản liên quan đến luỹ thừa, hàm mũ, logarithm. ví dụ:
ln(x*y) cho ta ln(x)+ln(y).

radical
: Biểu thức liên quan đến luỹ thừa hữu tỉ. Ví dụ: (x^2-
4*x+4)^(1/4)
cho ta (x-2)^(1/2).
95

RootOf
: Biểu thức có chứa hàm RootOf (tức là nghiệm của một phơng
trình nào đó).

sqrt
: Biểu thức gồm căn bậc hai hoặc luỹ thừa của căn bậc hai. Ví dụ :
16^(3/2) cho ta 64.


trig : Đơn giản liên quan đến các hàm lợng giác. Ví dụ:
cos(x)^2+sin(x)^2 cho ta 1.
Lệnh
simplify(expression);

simplify(expression,rule);

Tham số:
expression
: Biểu thức cần đơn giản.
rule: Các phơng thức cụ thể để đơn giản biểu thức nh đã liệt kê ở trên.
Minh họa
Maple không tự động đơn giản biểu thức mà để lại cho ngời dùng tự chọn lựa
phơng thức (keyword) thích hợp:
[>
restart;
[>
bt:=2*(cos(2*y))^2+3*(sin(2*y))^2+exp(x)^(5/2)*(1+
2*x+x^2)^(1/2)+2^(5/2);

:= bt + + + 2()cos 2 y
2
3()sin 2 y
2
()e
x
()/52
+ + 12xx
2
4 2


Sử dụng lệnh đơn giản thông thờng:
[>
simplify(bt);
+ + + + ()cos 2 y
2
3()e
x
()/52
()csgn + 1 x ()e
x
()/52
()csgn + 1 xx 4 2

Đơn giản biểu thức theo hàm mũ:
[>
simplify(bt,power);

+ + + + 2()cos 2 y
2
3()sin 2 y
2
()e
x
()
/
52
()csgn + 1 x ()e
x
()

/
52
()csgn + 1 xx 4 2

Đơn giản theo các hàm lợng giác trong biểu thức:
[>
simplify(bt,trig);

+ + + ()cos 2 y
2
3()e
x
()/52
() + 1 x
2
4 2

96
3.2.3. Tìm giá trị lớn nhất và bé nhất
Lệnh:

max
- Xác định phần tử lớn nhất của một dãy các biểu thức.
min
- Xác định phần tử nhỏ nhất của một dãy các biểu thức.
Lời gọi:
max(x1, x2, )

min(x1, x2, )
Đối số:

x1,x2, - các biểu thức.
Mô tả
Các hàm max, min cho giá trị lớn nhất và giá trị bé nhất của một hay nhiều đối
tợng đợc cho dới dạng đối số của hàm.
Thông thờng các đối số có dạng số: số nguyên, phân số, hoặc số thập phâ
n.
Tuy nhiên, các hàm tổng quát cho phép nhận bất cứ đối số nào và khi đó hàm
max() hoặc min() cho một hàm không định giá trị.
Giá trị lớn nhất hay nhỏ nhất của một họ các đa thức có thể đợc biến đổi
thành một hàm từng khúc (
piecewise).
Ví dụ minh hoạ
Hàm max cho lại số lớn nhất:
[>
max(3/2, 1.49,-34,1.49999);
3
2

Hàm
max
,
min
với đối số không định đợc giá trị thì cho một hàm không định giá
trị:
[>
min(3/2, 1.49, f(x));

()min ,1.49 ( )f
x


[>
max(3/5, ln(2), 9/13, -infinity);

()ln 2

[>
max(x+1, x+2, y);

()ma
x
,y

+
x
2

[>
min();

97


Giá trị lớn nhất của một họ các đa thức có thể chuyển đổi đợc sang dạng một hàm
từng khúc:
[>
convert(max(x*x-2,x+3),piecewise);


















x
2
2 < x
1
2
1
2
21
+ x 3 x +
1
2
1
2
21
x
2
2 < +

1
2
1
2
21 x

3.2.4. Thay thế trong biểu thức: lệnh subs
Lệnh
subs(var=repl,expr);
subs(var1=repl1,var2=repl2,expr);
subs(var1=repl1, ,varn=repln,expr);
Các đối số:
var,var1,var2, ,varn: các kí hiệu cần đợc thay thế trong biểu thức.
repl,repl1, , repln
: các biểu thức sẽ thay thế chỗ của
var,
var1, ,varn
trong biểu thức expr.
Mô tả
Trong các phép tính nhiều bớc, một đồng nhất thức nh sin(x)^2+cos(x)^2=1
thờng phải áp dụng trong một biểu thức nào đó chẳng hạn
exp(x^2+sin(x)^2+cos(x)^2). Chúng ta có thể thực hiện việc này bằng cách
thay mỗi biểu thức sin(x)^2+cos(x)^2 trong biểu thức đó bởi giá trị 1 trong vế
phải của đồng nhất thức. Phép thay thế này nhanh hơn việc định giá của
Maple, do đó giảm đợc thời gian tính toán. Sử dụng lệnh
subs(var=replacement, expression) để thay thế biểu thức var
bằng biểu thức
replecement trong biểu thức expression (trong ví dụ
này khi thay sin(x)^2+cos(x)^2 bởi 1 ta thu đợc biểu thức: exp(x^2+1)).
Ta có thể sử dụng cách phát biểu thứ hai trong phần khai báo cú pháp lệnh để

thay thế một cặp biểu thức:
subs(v1=r1, v2=r2, expression). Trong
đó, mọi vị trí trong
expression có v1 đều đợc thay thế bởi r1, và vị trí
của
v2 đợc thay thế bởi r2. Tơng tự nh vậy, chúng ta có thể thay thế
nhiều vị trí bằng cách áp dụng hàm
subs với đối số bao gồm một dãy các
đẳng thức
var=replacement và biểu thức expression cần đợc thay
thế.
98
Ví dụ minh hoạ
Lệnh thay thế đơn giản:
[>
bt1:=a*x^2+b*x+c;

:= bt1

+

+ a
x
2
b
x
c

[>bt11:=subs(a=3,b=-1,c=4,bt1);
:= bt11




+ 3
x
2
x
4

Lệnh
subs
có thể áp dụng cho nhiều kí hiệu, và khi ấy thứ tự thay thế sẽ đợc thực
hiện từ trái qua phải. Trong ví dụ sau đây, ta thực hiện phép tính khối lợng
m
thông qua năng lợng
e và vận tốc ánh sáng c theo công thức Einstein:
[>
msol:=solve(e=m*c^2,m);

:= msol
e
c
2

ta có thể tính lực hấp dẫn thông qua khối lợng msol vừa tính đợc:
[>
subs(m=msol,g=9.8,c=300000,f=m*g);

=
f

.108888888910
-9
e

Để thấy rõ ý nghĩa của thứ tự thực hiện trong lệnh thay thế (nhiều ký hiệu), ta so
sánh 2 cách thay thế các giá trị vào công thức
f=m*g
.
Khi cho
c=300000 đứng trớc trong trật tự đợc thay thế thì lệnh tiến hành ngay
đối với nó. Nhng do biểu thức
f=m*g
không có kí hiệu
c
để mà thay, cho nên nó
bỏ qua sự thay thế này và chỉ thực hiện thay thế 2 ký hiệu tiếp theo là
m=msol,
g=9.8
và do đó kết quả của lệnh là một sự thay thế không đầy đủ:
[>
subs(c=300000,m=msol,g=9.8,f=m*g);
= f 9.8
e
c
2

Nếu cho
m=msol lên trớc thì ngay sau bớc đầu tiên biểu thức trở thành:
f=g*e/c^2
, và các biến

g,

c
lại đợc thay thế tiếp. Kết quả là ta có sự thay thế
đầy đủ hơn:
[>
subs(m=msol,c=300000,g=9.8,f=m*g);


=
f
.108888888910
-9
e

Hàm
subs
rất có ích trong việc tính toán nhanh chóng các hàm bằng cách thay thế
các biểu thức phức tạp bởi các giá trị đồng nhất của chúng (nhất là trong các biểu
thức lặp đi lặp lại). Ví dụ
cos(n*Pi) có thể đợc thay thế bởi (-1)^n nhờ chu
trình sau đây
[>
restart;
99
[>reduit:=proc()
if n<>0 then
simplify(subs(cos(n*Pi)=(-1)^n,sin(n*Pi)=0,
expand(args,trig)));
fi;

end:

Và khi ấy các biểu thức chứa
cos(n*Pi)
có thể đợc tính một cách rất dễ dàng,
thí dụ:
[>
bt:=sin(2*n*Pi)+2*(-1)^n*cos(n*Pi);

:= bt

+ ()sin 2 n

2( )-1
n
()cos n


[>
reduit(bt);
2( )-1
()2 n

3.2.5. Tổ chức biểu thức theo một số biến chính
Lệnh
collect(expression,variable);
collect(expression,adding_exp);
collect(expression,varlist,form,coefficient_simplifier);
Mô tả
collect() là một lệnh đợc sử dụng khi bạn muốn tổ chức một biểu thức

theo một biến số chính hay với các biến đợc viết dới dạng tổng của các số
hạng, trong đó mỗi số hạng là một luỹ thừa của một biến chính hay một biểu
thức nhân với một hệ số liên hợp (associated coefficient). Có hai dạng kết quả
có khả năng thu đợc: hoặc là biểu thức đệ quy hoặc là biểu thức phân phối.

Với dạng đệ quy, kết quả đợc cấu trúc phân cấp. Nó đợc ép thành dạng đa
thức theo biến đầu tiên trong danh sách biến cho trong lệnh gọi ( ví dụ nh
collect(x*y^2 + x^2*z + y*z + y,[x,y]);
thì
x
là biến đầu
trong danh sách biến
[x,y]), hệ số của biến đầu này lại là đa thức của biến
thứ hai trong danh sách biến ,và tiếp tục nh thế cho đến biến cuối cùng trong
danh sách.
Với dạng phân phối, kết quả đợc viết dới dạng đa thức khai triển tổng của
các số hạng. Mỗi số hạng là tích của các luỹ thừa của các biến trong danh
sách với các hệ số ( các hệ số này không phụ thuộc vào các biến trong danh
sách biến ). Dạng này rất hữu ích khi bạn muốn xem nhiều biến nh là "biến
chính" mà không cho trớc một sự u tiên đối với bất cứ biến nào.
Đối số tuỳ chọn thứ t "coefficient simplifier" là tên của chu trình đơn giản sẽ
đợc áp dụng cho hệ số của các số hạng của kết quả.Ví dụ nh, nếu expand là
đối số thứ t, thì các hệ số sẽ đợc khai triển. Vì thế, có thể thiết lập các hệ số
khác với dạng phân cấp và dạng đệ quy mà collect tráo đổi các phần của biểu
thức có chứa các biến trong danh sách.
100
Minh họa
Gom các số hạng của biểu thức theo biến x, rồi theo y, cuối cùng theo z.
[>
expr:=r^2*x^2-2*x^2*r+x^2+8*z*y*r^2-2*y*z*r*s-

6*z*y*s^2+t^2*z^2+3*r^2*x*y*s*t-r*s*x*y+s^2*y^2+r^3*z*x-
r*z*x*t^2;

exp
r
r
2
x
2
2
x
2
r
x
2
8
z
y
r
2
2y
z
r
s
6
z
y
s
2
t

2
z
2
3
r
2
x
y
s
t
r
s
x
y
s
2
y
2
r
3
z
x
+ +





+


+



+ + :=
rzxt
2


[>
collect(expr,[x,y,z]);

+

+

+ + () +
r
2
2
r
1
x
2
()

+ () +
r
s
3

r
2
s
t
y ()


r
3
r
t
2
z
x
s
2
y
2
()




+ 2
r
s
6
s
2
8

r
2
z
y
t
2
z
2

Sử dụng dạng
distributed, ta thấy kết quả đợc khai triển:
[>
collect(expr,[x,y,z],distributed);
+ +

+

+

+ () +
r
2
2
r
1
x
2
t
2
z

2
s
2
y
2
()




+ 2
r
s
6
s
2
8
r
2
z
y ()


+
r
s
3
r
2
s

t
y
x
()
r
3
r
t
2
x
z

3.2.6. Sắp xếp các số hạng
Các lệnh:
sort(expression);
Dùng để sắp xếp các số hạng theo thứ tự abc hoặc theo số mũ.
sort(expression,variablelist,plex);
Dùng để sắp xếp một biểu thức theo thứ tự từ điển.
sort(expression,variablelist,tdeg);
Dùng để sắp xếp một biểu thức theo thứ tự tổng bậc.
sort(list);
Sắp xếp danh sách các biểu thức theo thứ tự tăng dần.
sort(list,ordering);
Sắp xếp một danh sách theo các trật tự cho bởi
ordering
:
string
: sắp xếp danh sách theo trật tự của các xâu kí tự.

numeric: sắp xếp danh sách theo trật tự số.


address: sắp xếp theo địa chỉ đợc Maple lu trữ.
một hàm cho kiểu
boolean gồm hai đối số f(a,b) trong đó a đứng trớc b
nếu
f cho giá trị true, ngợc lại nếu f cho giá trị false.
Mô tả
Maple sắp xếp các toán hạng theo một trật tự cố định. Nếu một biểu thức đợc
in ra
y+x+z trong lần làm việc đầu, thì nó cũng sẽ tiếp tục nh vậy trong
những lần tiếp theo. Tuy nhiên, trật tự thuận lợi để cho Maple làm việc có
101
hiệu quả thì có thể không phù hợp với trật tự mà chúng ta muốn quan sát thấy
trong kết quả. Ví dụ, Maple không sắp xếp các số hạng của một đa thức một
biến theo trật tự giảm dần của bậc hoặc theo trật tự
abc. Để có biểu thức đợc
sắp xếp nh mong muốn, chúng ta phải sử dụng hàm
sort(expression)
để thay đổi trật tự các toán hạng trong các tổng hoặc các tích có trong biểu
thức theo một trật tự nào đó.
Đối với các biểu thức có chứa luỹ thừa của nhiều biến (hoặc nhiều biểu thức
con),
sort nhận ba đối số. Khi chúng ta có một biểu thức gồm nhiều biến
trong đó có một biến đợc xem là biến chính, và chúng ta muốn sắp xếp các
số hạng của biểu thức theo sự u tiên đối với số hạng nào có luỹ thừa cao nhất
của biến chính, Hàm
sort(expression,variablelist,plex) sẽ sắp
xếp các số hạng theo cách ấy.
variablelist có thể là danh sách biến với
biến chính đứng ở đầu danh sách. Để sắp xếp các số hạng có cùng luỹ thừa

theo biến chính, luỹ thừa của biến tiếp theo trong danh sách
variablelist
sẽ đợc dùng đến. Nếu điều này lại tiếp tục xảy ra đối với biến thứ hai thì
biến tiếp theo đợc áp dụng và cứ tiếp tục nh vậy. Cách làm này đợc gọi là
sự sắp xếp theo từ điển vì nó giống nh quy tắc sắp xếp các từ theo thứ tự từ
điển.
Cách khác để tổ chức các số hạng của một biểu thức là theo tổng bậc (total
degree order). Tổng bậc của một tích các luỹ thừa của các biến là tổng của tất
cả các số mũ. Hàm
sort(expression,variable list,tdeg) sẽ sắp
xếp các số hạng của biểu thức theo cách này. Để sắp xếp hai số hạng có cùng
tổng bậc, hàm sẽ sắp xếp theo thứ tự từ điển dựa trên các biến sắp xếp trớc
trong danh sách biến.
Nếu danh sách (list) đợc cho vào nh một đối số của lệnh
sort, thì các phần
tử của danh sách đợc sắp xếp theo thứ tự tăng dần. Một đối số tuỳ chọn có
thể đợc dùng để định rõ kiểu sắp xếp sẽ đợc sử dụng. Đối số này có thể là
từ khoá mà Maple có thể nhận ra hoặc có thể là hàm so sánh do ngời dùng
định nghĩa.
Minh họa
Maple lu các đa thức không theo trật tự tăng hay giảm của bậc các đơn thức
mà nó lu trữ một cách lộn xộn thích hợp cho việc lu trữ và tính toán của nó. Để
thu đợc biểu thức đợc sắp xếp, chúng ta sử dụng hàm
sort()
:
[>
bt:=expand( (x^2-x-1)^4 );
:= bt

+




+

+



+

+
x
8
4
x
7
8
x
5
8
x
3
2
x
2
2
x
6
5

x
4
4
x
1

[>
sort(bt);

+

+





+

+

+
x
8
4
x
7
2
x
6

8
x
5
5
x
4
8
x
3
2
x
2
4
x
1

Sắp xếp các biểu thức có nhiều biến số theo thứ tự từ điển:
[>
bt:=x^5*y^2*z+x^4*y^3*z^2+x^3*y^3*z^5+2*x^2+1;
:= bt

+

+

+

+
x
5

y
2
z
x
4
y
3
z
2
x
3
y
3
z
5
2
x
2
1

102
[>sort(bt,[x,y,z],plex);

+

+

+

+

x
5
y
2
z
x
4
y
3
z
2
x
3
y
3
z
5
2
x
2
1

[>
sort(bt,[y,x,z],plex);


+

+


+

+ y
3
x
4
z
2
y
3
x
3
z
5
y
2
x
5
z
2
x
2
1

Sắp xếp theo tổng bậc:
[>
sort(bt,[x,y,z],tdeg);


+


+

+

+
x
3
y
3
z
5
x
4
y
3
z
2
x
5
y
2
z
2
x
2
1

Sắp xếp danh sách theo
alphabet:

[>
sort([a,x,z,t,e,d,v,m,b,u]);

[],,,, ,,,,,abdemtuv
x
z

[>
sort(c+b+a);


+

+ abc

[>
sort(z*y*x);
x
y
z

Sắp xếp danh sách theo trật tự xâu kí tự:
[>
sort([`Xuan`,`Cuong`,Xuyen,`Vinh`,`Duong`],string);
[],,,,Cuong
D
uong Vinh
X
uan
X

uyen

Sắp xếp theo trật tự do ngời dùng định nghĩa thông qua hàm so sánh:
[>
ord:=proc(a,b)
if a<b*2 then true else false fi;
end:
[>sort([1,8,13,5,221,211],ord);

[],,, , ,18513221211

3.2.7. Chuyển đổi dạng cấu trúc dữ liệu (lệnh convert)
Lệnh:
convert(expression,resulttype);

expression : biểu thức cần đợc chuyển đổi.
103
resulttype
: dạng dữ liệu biểu thức của ta cần chuyển sang.
Mô tả

Các cấu trúc dữ liệu biểu diễn
tổng
,
tích
,
tập hợp
,
danh sách
,

mản
g nói chung
là tơng tự nhau. Mỗi cấu trúc dữ liệu đó có thể đợc xem nh một nhóm các
phần tử đợc viết theo một kiểu nào đó. Chẳng hạn nh một danh sách và một
tập hợp đợc viết ra trên màn hình chỉ khác nhau ở chỗ dấu đóng bao hai đầu
của chuỗi dữ liệu là ngoặc vuông và ngoặc xoắn. Về hình thức ta có thể thấy
hoàn toàn có thể chuyển đổi một tổng (sum) thành một danh sách (list) bằng
cách thay dấu cộng bằng dấu phẩy, rồi đặt dấu ngoặc vuông bao toàn bộ biểu
thức.
Trong một số chơng trình đôi khi rất cần thiết phải thực hiện việc chuyển đổi
nh vậy. Chẳng hạn khi ta muốn tính tổng các phần tử của một danh sách các
số, cách tốt nhất là ta biến đổi cấu trúc
danh
sách này thành cấu trúc tổn
g
.
Trong Maple chúng ta có thể làm đợc điều này một cách khá dễ dàng bằng
cách sử dụng lệnh chuyển đổi cấu trúc
convert().
Minh họa
Khai báo một danh sách các số nguyên:
[>
ds:=[12,23,53,2,11,34,12,2,3,11];
:= ds [],,,,,,,,,12 23 53 2 11 34 12 2 3 11

Chuyển dữ liệu từ kiểu danh sách (
list) thành kiểu tổng (sum), từ đó ta thu đợc
tổng các phần tử của danh sách:
[>
convert(ds,`+`);


163

Ta có thể chuyển kiểu danh sách này sang các kiểu mảng hay bảng, chẳng hạn:
[>
convert(ds,table);

table([ ,,,,,,,,,]) = 10 11 = 112

= 223

= 353

= 42

= 511

= 634

= 712

= 82 = 93

Hoặc chuyển sang kiểu tập hợp, lu ý các phần tử trùng nhau thì bị loại bỏ bớt:
[>
taphop:=convert(ds,set);

:= taphop {},,,,,,231112233453

Đếm số phần tử của tập hợp

[>
nops(taphop);
7

Đếm số phần tử của danh sách
[>
nops(ds);

104
10

3.2.8. Thực hiện một phép toán trên nhiều thành phần
Lệnh
map(f,expression);
Dùng để tính giá trị của hàm với đối số là mỗi thành phần của một biểu thức.
map(f,expression,arg2,arg3, argn);
Dùng để tính giá trị của hàm có
n
đối số trong đó đối số thứ nhất là một thành
phần của biểu thức
expression
, còn các đối số khác nhận giá trị
arg2
,
arg3, argn.
Mô tả
Các phép toán trong Maple nh evalf, normal, thông thờng nhận các đối
số là một số hoặc một biểu thức và chúng tính toán trên số hoặc biểu thức đó.
Tuy nhiên, khi các hàm này đợc truyền đối số là một danh sách các số hay
biểu thức, thì chúng vẫn thực hiện một cách bình thờng bằng cách tính toán

với từng phần tử của danh sách, sau khi tính toán chúng cho một danh sách
các kết quả. Khi muốn xây dựng một hàm có thể thực hiện một tính toán
giống nhau trên tất cả các phần tử của một danh sách, ta sử dụng hàm
map().
Hàm
map(f,expression) thực hiện tính toán hàm f với các đối số lần
lợt là các phần tử của cấu trúc dữ liệu

expression. Hàm map() tạo ra
một cấu trúc mới trong đó toán hạng thứ i của cấu trúc này là kết quả của việc
áp dụng hàm
f cho toán hạng thứ i của cấu trúc dữ liệu ban đầu. Kiểu của
cấu trúc mới đợc tạo ra cùng kiểu cấu trúc dữ liệu ban đầu, ngoại trừ khi sự
đơn giản hoá tự động thực hiện sau đó làm thay đổi chúng. Vì vậy, hàm
map
làm việc không chỉ trên danh sách, tập hợp, mà còn trên tổng, tích, phơng
trình, mảng, bảng,
Dạng thứ hai của lệnh
map trong khai báo trên đợc sử dụng trong trờng hợp
chúng ta muốn áp dụng một hàm gồm nhiều đối số trong đó tham số đầu tiên
của hàm f lần lợt đợc tính toán bằng các giá trị là các phần tử của cấu trúc
dữ liệu trong
expression, các tham số thứ hai trở đi nhận giá trị
arg2, ,argn. Nó tạo ra một cấu trúc dữ liệu mới cùng kiểu với biểu
thức đã cho ban đầu với
f(op(i,expression), arg2, argn) đợc
gán cho phần tử thứ i của cấu trúc mới.
Minh họa
Xét danh sách:
[>

ds:=[Pi/3,3/5,-sin(Pi/7)];

:= ds








,,
1
3

3
5









sin
1
7



Một số hàm trong Maple có khả năng tự động tính giá trị với đối số là từng phần tử
của các cấu trúc nh danh sách, tập hợp, tổng, tích, Chẳng hạn hàm evalf có thể
tính toán trên mỗi phần tử của danh sách trên:
105
[>
evalf(ds);

[],,1.047197551 .6000000000 4338837393

Ta có thể tính giá trị của một hàm
f
trên từng phần tử của một cấu trúc dữ liệu nào
đó bằng cách sử dụng hàm
map. Việc áp dụng hàm map nh vậy gọi là sự ánh xạ
hàm
f lên các phần tử của một cấu trúc. Chẳng hạn ta thấy hiệu quả của việc ánh xạ
(
mapping) hàm
sin
trên danh sách, tập hợp và tổng:
[>
ds:=[1,Pi/3,ln(10)];
:= ds









,,1
1
3
()ln 10

[>map(sin,ds);









,,()sin 1
1
2
3( )sin ( )ln 10

[>
th:={Pi/4,0,5*Pi/6};
:= th {},,0
1
4

5
6



[>map(sin,th);

{},,0
1
2
1
2
2

[>
tong:=Pi/3+1+Pi/7;
:= tong +
10
21
1

[>map(sin,tong);

+








sin

10
21
()sin 1

map
còn có thể đợc áp dụng với nhiều hơn hai đối số:
[>
map(int,[sin(t),ln(t),exp(t),tan(t)],t);

[],,, ()cos t

t ()ln tte
t

()ln ( )cos t

3.2.9. Xem cấu trúc và thành phần của một biểu thức
Lệnh
Hàm op() dùng để trích ra một số thành phần của một biểu thức.
op(i,expression);

Hàm nops() cho số lợng các thành phần trong một biểu thức.
nops(expression);

106
Hàm whattype(expression) cho biết kiểu cấu trúc của biểu thức
expression.
Hàm
type(expression,`typename`) kiểm tra xem biểu thức có cấu
trúc kiểu

typename không.
Mô tả
Bất kỳ biểu thức Maple nào cũng có thể phân tích thành một hay nhiều kiểu.
Ví dụ: biểu thức
x+y+z là một tổng, trong khi biểu thức 2*x*y có dạng tích.
Maple có thể biểu diễn nhiểu kiểu đối tợng toán học khác nhau. (ví dụ nh
các kiểu
integer, fraction, string, series, hay các toán tử logic:
or, xor, and, ).
Do tính chất trên, mọi biểu thức Maple nào cũng đợc lu trữ trong một dạng
dữ liệu với một kiểu cấu trúc nào đó. Muốn biết kiểu cấu trúc của một biểu
thức ta dùng lệnh
whattype(expression); Các kiểu cấu trúc hay gặp:
tổng, tích, hàm,
Nếu cấu trúc dữ liệu có nhiều mẫu thông tin, cấu trúc sẽ phân chúng ra nhiều
thành phần (operand). Những thành phần này đợc sắp xếp theo trật tự tuyến
tính, có thể đánh số đợc. Mỗi thành phần tự nó lại có thể là một cấu trúc với
các thành phần nhỏ hơn. Ví dụ nh biểu thức
x+y+z đợc biểu diễn trong
một cấu trúc dữ liệu tổng, cấu trúc này có ba phần chứa thông tin về từng bộ
phận (số hạng) của tổng, (trong trờng hợp này là các ký hiệu x,y,z). Biểu
thức
2*(x+y)*z đợc biểu diễn dới một cấu trúc khác ('tích'), cũng chứa ba
phần, nhng thành phần thứ hai của nó là một cấu trúc "tổng" chứa hai thành
phần (x và y).
Maple có nhiều hàm cho phép chúng ta có thể lấy đợc từng thành phần và
kiểu cấu trúc của bất cứ biểu thức nào:
Hàm
op(i,expression)
cho biết thành phần thứ i trong cấu trúc

biểu diễn biểu thức
expression
(ví dụ nh
op(2,x+y+z)
cho kết
quả là
y); còn hàm op(i k,expression) cho biết các thành phần
của biểu thức này trong phạm vi từ
i
đến
k
.
Hàm
nops(expression)
cho biết số
thành phần
của cấu trúc biểu
diễn biểu thức
expression.Ví dụ nh nops(x+y+z) cho kết quả là
3.
Hàm
whattype(expression) cho biết kiểu của cấu trúc biểu diễn
biểu thức expression. Các kiểu cấu trúc mà hàm
whattype() cho bao
gồm:
+ Các cấu trúc tổng (+), tích (*), cấu trúc mũ (^).
+ Cấu trúc móc nối (.), cấu trúc phạm vi ( ).
+ Cấu trúc
bé hơn
(<),

bé hơn hoặc bằng
(<=), cấu trúc
khác
(<>),
cấu trúc bằng (=).
+ Các cấu trúc logic and, not, or.
107
+ Cấu trúc dãy(exprseq), danh sách (list), tập hợp (set), bảng
(table), chuỗi (series).
+ Cấu trúc số nguyên (integer), phân số (fraction), số thực (float),
xâu kí tự (string), chỉ mục (indexed), không định giá (uneval).
+ Cấu trúc hàm (function) và cấu trúc chu trình (procedure).
Hàm
type(expression,`typename`)
cho true (đúng) nếu biểu
thức
expression
có kiểu cấu trúc
typename
, và cho false (sai) nếu
ngợc lại.
Minh họa
Cho các biểu thức:
[>
bt1:=17*x+7*y+1979*z*t+sin(u+v);
:= bt1

+

+


+ 17
x
7 y 1979
z
t ()sin

+ uv

[>bt2:=10*x^3*y^2+3*x^2*y^3+3*x^2*y+5*cos(z^2);
:= bt2

+

+

+ 10
x
3
y
2
3
x
2
y
3
3
x
2
y 5()cos

z
2

[>
bt:=bt1/bt2;
:= bt

+

+

+ 17
x
7 y 1979
z
t ()sin

+ uv
+ + + 10 x
3
y
2
3 x
2
y
3
3 x
2
y 5()cos z
2


Khi ấy lệnh
op(i,bt) cho biết thành phần thứ i trong biểu thức.
Thí dụ Thành phần thứ 3 của
bt1
, thành phần thứ 4 của
bt2
đợc lấy ra bằng các
lệnh:
[>
tp3_bt1:=op(3,bt1);
:= tp3_bt1 1979
z
t

[>tp4_bt2:=op(4,bt2);
:= tp4_bt2 5()cos
z
2

Ta thấy rằng các thành phần này có cấu trúc tích, và do đó có thể lấy từng thành
phần con của nó.
Thí dụ
[>
op(2,tp3_bt1);
z

[>op(2,tp4_bt2);
()cos
z

2

[>
nops(tp3_bt1);
108
3

[>
nops(tp4_bt2);

2

Ta tìm kiểu cấu trúc của biểu thức bằng lệnh
whattype()
.
Thí dụ
[>
whattype(bt1);

+

[>
whattype(tp3_bt1);

*

[>
whattype(bt);

*


và kiểm tra kiểu cấu trúc bằng lệnh:
[>
type(bt1,`+`);

true

[>
type(bt1,`*`);
f
alse

3.2.10. Kiểm tra một phần tử có thuộc một dữ liệu có cấu
trúc nào đó
Mô tả

Hàm
member(x,s) xác định phần tử x có là phần tử của
tập hợp
hay
danh
sách có tên là
s hay không. Nếu đúng thì hàm cho giá trị true, nếu sai thì
cho
false.
Nếu đối số thứ ba
'p' đợc đa vào và hàm member(x,s,'p') cho giá trị
true, giá trị của biến p sẽ là vị trí đầu tiên của x trong
danh sách
hay trong

tập hợp
s.
Cú pháp lệnh
member(x,s,'p');

Tham biến:
x
: Là một biểu thức bất kì.
s : Một tập hợp hoặc một danh sách.
109
'p'
: (Tuỳ chọn) Một tên cha bị định giá trớc.
Minh họa
Kiểm tra phần tử
a
có trong tập hợp
{b,c,a,v,r,2,3,4}
hay không:
[>
member(a,{b,c,a,v,r,2,3,4});
true

Cho danh sách 200 số ngẫu nhiên:
[>
L:=[seq(rand() mod 200,i=1 200)];

L := [130, 67, 111, 182, 19, 73, 185, 87, 110, 35, 36, 91, 182, 94, 143, 141,
97, 116, 175, 13, 44, 159, 106, 142, 44, 78, 124, 145, 152, 137, 30, 90,
191, 81, 5, 13, 38, 85, 7, 86, 35, 7, 21, 59, 53, 59, 152, 50, 37, 118, 160,
138, 45, 83, 88, 142, 102, 23, 57, 135, 185, 160, 2, 57, 118, 157, 97, 3,

117, 152, 10, 100, 5, 181, 109, 184, 155, 125, 52, 131, 183, 53, 87, 1,
71, 172, 103, 120, 66, 23, 135, 44, 34, 159, 65, 129, 59, 144, 28, 111,
93, 144, 42, 8, 70, 137, 75, 52, 29, 151, 55, 46, 36, 52, 187, 66, 60, 170,
128, 144, 40, 31, 17, 40, 108, 151, 88, 197, 39, 70, 172, 36, 95, 160, 53,
73, 190, 55, 53, 56, 67, 29, 188, 49, 87, 60, 98, 150, 27, 196, 33, 4, 183,
88, 72, 6, 158, 72, 149, 5, 71, 68, 20, 8, 56, 184, 143, 172, 18, 68, 193,
54, 169, 155, 12, 54, 31, 65, 46, 169, 117, 150, 198, 60, 42, 2, 23, 196,
126, 91, 175, 153, 29, 114, 43, 170, 109, 153, 60, 193]
Kiểm tra số x=30 có trong danh sách trên không:
[>
x:=30;
:=
x
30

[>member(x,L,'p');
true

Giá trị của p là vị trí của x=30 trong danh sách:
[>
p;

31

3.2.11. Kiểm tra một
tên
đã đợc gán hay cha
Mô tả
Hàm
assigned(n)

cho giá trị true nếu
n
đã đợc gán một giá trị nào đó
(không phải là tên của nó), cho
false trong trờng hợp ngợc lại. Ta có thể sử dụng
hàm
assigned() để kiểm xem một biến là biến lập trình hay biến toán học.
Lệnh
assigned(n);

×