TRƯỜNG ĐẠI HỌC GIAO THƠNG VẬN TẢI TP. HỒ CHÍ MINH
VIỆN ĐÀO TẠO SAU ĐẠI HỌC
BÁO CÁO
HỌC PHẦN: LẬP TRÌNH LOGIC VÀ RÀNG BUỘC
CHƯƠNG 3: CÁC PHÉP TOÁN VÀ SỐ HỌC
Giảng viên hướng dẫn : TS. PHAN VĂN ĐỨC
TP. Hồ Chí Minh - 2023
MỤC LỤC
DANH MỤC HÌNH ẢNH...............................................................................................II
PHẦN 1: BÀI TẬP GIỮA KỲ.........................................................................................1
1.1.
Bài 1.....................................................................................................................1
1.2.
Bài 2.....................................................................................................................2
1.3.
Bài 3.....................................................................................................................4
1.4.
Bài 4.....................................................................................................................5
1.5.
Bài 5.....................................................................................................................6
1.6.
Bài 6.....................................................................................................................7
1.7.
Bài 7.....................................................................................................................9
1.8.
Bài 8...................................................................................................................10
1.9.
Bài 9.................................................................................................................... 11
1.10.
Bài 10..............................................................................................................12
1.11.
Bài 11..............................................................................................................13
PHẦN 2: BÀI TẬP CUỐI KỲ.......................................................................................15
2.1.
Bài 1...................................................................................................................15
2.2.
Bài 2...................................................................................................................20
2.3.
Bài 3...................................................................................................................22
2.4.
Bài 4...................................................................................................................27
2.5.
Bài 5...................................................................................................................29
2.6.
Bài 6...................................................................................................................30
2.7.
Bài 7...................................................................................................................31
2.8.
Bài 8...................................................................................................................32
2.9.
Bài 9...................................................................................................................33
2.10.
Bài 10..............................................................................................................34
2.11.
Bài 11..............................................................................................................37
1
DANH MỤC HÌNH ẢNH
Hình 1-1: Kết quả tìm min và max của 2 số theo Prolog...................................................1
Hình 1-2: Kết quả tìm phần tử cuối cùng..........................................................................2
Hình 1-3: Kết quả kiểm tra phần tử thuộc danh sách........................................................3
Hình 1-4: Kết quả tính số phần tử thuộc danh sách..........................................................4
Hình 1-5: Kết quả đảo ngược danh sách...........................................................................5
Hình 1-6: Kết quả kiểm tra parlindrome (đối xứng)..........................................................6
Hình 1-7: Kết quả loại bỏ các phần tử danh sách trùng lặp liên tiếp................................7
Hình 1-8: Kết quả đóng gói các phần tử trùng nhau.........................................................8
Hình 1-9: Kết quả xây dựng hàm nhân đơi danh sách......................................................9
Hình 1-10: Kết quả xây dựng bài tốn nhân đơi theo u cầu........................................10
Hình 1-11: Kết quả bỏ phần tử thứ N khỏi danh sách.....................................................12
Hình 1-12: Kết quả chia list thành 2 phần......................................................................13
Hình 1-13: Kết quả xóa phần tử khỏi list........................................................................14
Hình 2-1: Kết quả với X = Y thì khơng xác định kết quả.................................................15
Hình 2-2: Kết quả với X is Y thì khơng xác định kết quả.................................................16
Hình 2-3: Kết quả với X=Y,Y=Z,Z=1 thì khơng xác định kết quả....................................16
Hình 2-4: Kết quả với X=1, Z=ZY, X=Y..........................................................................17
Hình 2-5: Kết quả với X is 1+1, Y is X............................................................................17
Hình 2-6: Kết quả với Y is X, X is 1+1thì khơng xác định kết quả..................................18
Hình 2-7: Kết quả với 1+2 == 1+2..................................................................................18
Hình 2-8: Kết quả với X == Y.........................................................................................18
Hình 2-9: Kết quả với 1 =:= 2-1......................................................................................19
Hình 2-10: Với X =:= Y thì khơng xác định kết quả........................................................19
Hình 2-11: Với op(X) is op(1) thì khơng xác định kết quả...............................................20
Hình 2-12: Kết quả với op(X) = op(1).............................................................................20
Hình 2-13: Kết quả Với op(op(Z), Y) = op(X, op(1))......................................................21
Hình 2-14: Kết quả Với op(X, Y) = op(op(Y), op(X))......................................................21
Hình 2-15: Kết quả hàm cộng.........................................................................................23
Hình 2-16: Kết quả hàm cộng.........................................................................................24
Hình 2-17: Kết quả hàm nhân.........................................................................................25
2
Hình 2-18: Kết quả hàm chia..........................................................................................26
Hình 2-19: Kết quả hàm tìm ước số chung lớn nhất........................................................27
Hình 2-20: Kết quả viết hàm Prolog để kiểm tra một số nhập vào có phải là số nguyên tố
......................................................................................................................................... 28
Hình 2-21: Kết quả viết chương trình tính số Fibonacci từ một số nhập vào bất kỳ......29
Hình 2-22: Kết quả tính chuỗi gần đúng phương trình (2.6.1)........................................31
Hình 2-23: Kết quả Viết hàm tạo 10 số tự nhiên sao cho kết quả trả về là số tăng dần. .32
Hình 2-24: Viết hàm tạo số giảm dần mà giới hạn tối đa là hiệu của 2 số cho trước......33
Hình 2-25: Kết quả viết hàm tạo số tăng dần mà giới hạn là tổng của 2 số cho trước. . .34
Hình 2-26: Sơ đồ cây.......................................................................................................35
Hình 2-27: Viết chương trình truy vấn............................................................................36
Hình 2-28: Đường thẳng, ngang, xiên.............................................................................37
Hình 2-29: Kết quả mô phỏng kiểm tra đường thẳng, ngang, xiên..................................38
3
PHẦN 1: BÀI TẬP GIỮA KỲ
1.1. Bài 1
Đề bài:
Viết chương trình find_max và find_min tìm Min và
Max của hai số.
Code chương trình:
% chuong trinh tim min, max cua 2 so
maxmin_of_two(X,Y,X) :- X >= Y,
write('Max is '), write(X),nl,
write('Min is '),write(Y).
maxmin_of_two(X,Y,Y) :- X < Y,
write('Max is '),write(Y),nl,
write('Min is'),write(X).
Kết quả mô phỏng theo Prolog:
Hình 1-1: Kết quả tìm min và max của 2 số theo Prolog.
1
1.2. Bài 2
Đề bài:
Tìm phần tử
- Tìm phần tử cuối cùng của danh sách
- Kiểm tra phần tử K của một danh sách
- Tìm số phần tử của danh sách?
Tìm phần tử cuối cùng của danh sách
Code chương trình:
% Tim phan tu cuoi cung
last(List, Last) :- append(_, [Last], List).
Kết quả mơ phỏng theo Prolog:
Hình 1-2: Kết quả tìm phần tử cuối cùng.
Kiểm tra phàn tử K của một danh sách
Code chương trình:
%Kiem tra phan tu thuoc danh sach
Kết quả mơ phỏng theo Prolog:
member( X,[ X|T]).
Tìmmember(
số phần tử
củaT]
danh
X,[_|
) :- sách
member( X, T).
Code chương trình:
2
%Tinh so phan tu thuoc danh sach
list_length([],0).
list_length([_|TAIL],N)
list_length(TAIL,N1),
N is N1 + 1.
Hình 1-3: Kết quả:-kiểm
tra phần tử thuộc danh sách.
Kết quả mô phỏng theo Prolog:
1.3. Bài 3
Đề bài
Đảo ngược danh sách
Code chương trình:
%viet chuong trinh dao nguoc danh sách
reverse([ ],[ ]).
reverse([X|Tail],R):-reverse(Tail,R1),append(R1,[X],R).
Kết quả mơ phỏng theo Prolog:
1.4. Bài 4
Hình 1-4: Kết quả tính số phần tử thuộc danh sách.
Đề bài:
Tìm xem một danh sách có phải là một palindrome hay khơng?
Code
chương trình:có thể được đọc về phía trước hoặc phía sau; ví dụ:
Mộtpalindrome
[x, a, m,a, x]
% viet chuong trinh kiem tra parlindrome(doi xung).
palindrome(L) :-reverse( L, L ).
Kết quả mô phỏng theo Prolog:
1.5. Bài 5
Hình 1-5: Kết quả đảo ngược danh sách.
Đề bài:
Loại bỏ các phần tử danh sách trùng lặp liên tiếp?
Ví dụ:
3
:? - remove([a, a, a, a, b, c, c, a, a, d, e, e, e, e], X).
1X = [a, b, c, a, d, e]
Hình 1-6: Kết quả kiểm tra parlindrome (đối xứng).
Code chương trình:
%Kết
loai
bomơ
cac
phantheo
tu Prolog:
trung nhau trong danh sach
quả
phỏng
remove( [] , [] ) .
remove( [X|Xs] , Ys ) :- remove(Xs, [X], Ts ), reverse(Ts,Ys) .
remove( [] , Ys , Ys ) .
remove( [X|Xs] , [T|Ts] , Ys ) :- X = T , remove( Xs , [X|Ts] , Ys ) .
remove( [X|Xs] , [T|Ts] , Ys ) :- X \= T , remove( Xs ,[X,T|Ts] , Ys ) .
1.6. Bài 6
Đề bài:
Đóng gói các phần tử danh sách trùng lặp liên tiếp thành danh sách con?
VíCode
dụ: chương trình:
:? - pack([a, a, a, a, b, c, c, a, a, d, e, e, e, e], X).
%dong
cac
X
= [[a, a,goi
a, a],
[b],phan
[c, c],tu[a,trung
a], [d],nhau
[e, e, e, e]]
1-7:
Kết
quảProlog:
loại bỏ các phần tử danh sách trùng lặp liên tiếp.
pack(X,Y)
:- pack(X,[],_,Y).
Kết
quảHình
mơ phỏng
theo
pack([H,H|T],Acc,X,R) :- pack([H|T],[H|Acc],X,R).
pack([H,H1|T], Acc, X,R) :- H\=H1, Acc1=[H|Acc],append(X, [Acc1],
X1),pack([H1|T],[],X1,R).
pack([H], Acc, X,R) :-Acc1=[H|Acc], append(X, [Acc1], X1),R = X1.
4
Hình 1-8: Kết quả đóng gói các phần tử trùng nhau.
1.7. Bài 7
Đề bài:
Sao chép các phần tử của danh sách?
Code chương trình:
Ví dụ:
:? - Dupli([a, b, c, c, d], X).
doi danh sach
X = [a,%xay
a, b, b,dung
c, c, c,ham
c, d, nhan
d]
Kết dupl([],[]).
quả chạy mô phỏng theo Prolog:
dupl([O|U],[O,O|U1]) :- dupl(U,U1).
5
Hình 1-9: Kết quả xây dựng hàm nhân đơi danh sách.
1.8. Bài 8
Đề bài:
Nhân đôi các phần tử của danh sách một số lần nhất định?
Ví dụ:
Code chương trình:
:? - Dupli([a, b, c], 3, X).
phỏng
Prolog:
X Kết
=
[a,quả
a,bai
a,chạy
b,
b,mô
b,
c, c,doi
c]theo
%xay
dung
toan
nhan
theo yeu cau
list_copy_h([], _, _, []).
list_copy_h([_ | Tin], 0, Num, Lout) :- succ(Num, Np1),
list_copy_h(Tin, Np1, Np1, Lout).
list_copy_h([H | Tin], Count, Num, [H | Tout]) :- succ(Cm1, Count),
list_copy_h([H | Tin], Cm1, Num, Tout).
list_copy(Lin, Num, Lout) :- list_copy_h(Lin, Num, Num, Lout).
Hình 1-10: Kết quả xây dựng bài6tốn nhân đơi theo u cầu.
1.9. Bài 9
Đề bài:
Bỏ một phần tử thứ N khỏi danh sách?
Ví dụ:
:? - drop([a, b, c, d, e, f, g, h, i, k], 3, X).
trình:
XCode
= [a,chương
b, d, e, g,
h, k]
%xay dung bai toan loai bo phan tu thu N
drop(L, N, X):-drop2(L, N, X, N).
drop2(_, _, _, 1).
drop2(L, N, X, C):- N mod C =:= 0,
remove(L, N, X),Z is C-1,
drop2(L, N, X, Z).
drop2(L, N, X, C):- Z is C-1,drop2(L, N, X, Z).
remove([_|T], 1, T).
remove([H|T1], N, [H|T2]):- N > 1, Z is N - 1,remove(T1, Z, T2).
Kết quả chạy mô phỏng theo Prolog:
7
Hình 1-11: Kết quả bỏ phần tử thứ N khỏi danh sách
1.10. Bài 10
Đề bài:
Chia danh sách thành hai phần,
Ví dụ:
Code chương trình:
:? - split([a, b, c, d, e, f, g, h, i, k], L1, L2).
quả
phỏng
theo
chia
thành
2 Prolog:
phan
L1Kết
=%
[a,
b,mô
c] list
L2 = list_divide([],[],[]).
[d, e, f, g, h, i, k]
list_divide([X],[X],[]).
list_divide([X,Y|Tail], [X|List1],[Y|List2]) :-list_divide(Tail,List1,List2).
8
Hình 1-12: Kết quả chia list thành 2 phần
1.11. Bài 11
Đề bài:
Xóa phần tử K khỏi danh sách?
Ví Code
dụ: chương trình:
:? - remove_at(X, [a, b, c, d], 2, R).
Kếtbquả chạy mô phỏng theo Prolog:
%X =Xoa
phan tu khoi list.
R = [a,
c, d]
list_delete(X,
[X], []).
list_delete(X,[X|L1], L1).
list_delete(X, [Y|L2], [Y|L1]) :- list_delete(X,L2,L1).
9
Hình 1-13: Kết quả xóa phần tử khỏi list
10
PHẦN 2: BÀI TẬP CUỐI KỲ
11
2.1. Bài 1
Đề bài:
Cho biết kết quả của các phép toán sau đây:
?- X=Y.
Kết
quả chạy theo Loprog:
?- X isVới
Y.X = Y: không xác định kết quả (chưa khai báo đủ sự kiện để chạy)
?- X=Y, Y=Z, Z=1.
?- X=1, Z=Y, X=Y.
?- X is 1+1, Y is X.
?- Y is X, X is 1+1.
?- 1+2 == 1+2 .
?- X == Y.
?- X == X.
?- 1 =:= 2-1.
?- X =:= Y.
Hình 2-14: Kết quả với X = Y thì khơng xác định kết quả.
Với X is Y: không xác định kết quả (chưa khai báo đủ sự kiện để chạy)
Hình 2-15: Kết quả với X is Y thì khơng xác định kết quả.
12
Với X=Y,Y=Z,Z=1: không xác định kết quả (chưa khai báo đủ sự kiện để
chạy).
Hình 2-16: Kết quả với X=Y,Y=Z,Z=1 thì khơng xác định kết quả.
Với X=1, Z=ZY, X=Y
Hình 2-17: Kết quả với X=1, Z=ZY, X=Y
Với X is 1+1, Y is X.
13
Hình 2-18: Kết quả với X is 1+1, Y is X
Với Y is X, X is 1+1: không xác định kết quả (chưa khai báo đủ sự kiện để
chạy).
Hình 2-19: Kết quả với Y is X, X is 1+1thì khơng xác định kết quả.
Với 1+2 == 1+2
14
Hình 2-20: Kết quả với 1+2 == 1+2
Với X == Y
Hình 2-21: Kết quả với X == Y
Với 1 =:= 2-1
15
Hình 2-22: Kết quả với 1 =:= 2-1
Với X =:= Y: không xác định kết quả (chưa khai báo đủ sự kiện để
chạy).
Hình 2-23: Với X =:= Y thì khơng xác định kết quả.
2.2. Bài 2
Đề bài:
16
Cho biết kết quả của
?op(X)
?op(X)
?op(op(Z),
Y)
các phép toán sau đây :
is
op(1).
=
op(1).
=
op(X,
op(1)).
Kết quả mô phỏng theo Prolog:
Với op(X) is op(1): không xác định kết quả (chưa khai báo đủ sự kiện để
chạy).
Hình 2-24: Với op(X) is op(1) thì khơng xác định kết quả.
Với op(X) = op(1)
Hình 2-25: Kết quả với op(X) = op(1).
Với op(op(Z), Y) = op(X, op(1))
17
Hình 2-26: Kết quả Với op(op(Z), Y) = op(X, op(1))
Với op(X, Y) = op(op(Y), op(X)).
Hình 2-27: Kết quả Với op(X, Y) = op(op(Y), op(X))
2.3. Bài 3
Đề bài:
18
Từ các định nghĩa số tự nhiên (nat) và phép cộng (addi) cho trong ví
dụ 1 định nghĩa hàm, hãy viết tiếp các hàm trừ (subt), nhân (multi),
chia(divi), ước số chung lớn nhất.
Bài làm:
Hàm cộng
- Code chương trình:
% ham tinh Z =X+Y
plus(X,Y,Z):nonvar(X), nonvar(Y),
Z is X+Y.
% ham tinh X =Z-Y
plus(X,Y,Z):nonvar(Y), nonvar(Z),
X is Z-Y.
% ham tinh Y =Z-X
plus(X,Y,Z):nonvar(X), nonvar(Z),
Y is Z-X.
-
Kết quả mô phỏng theo Prolog:
19
Hình 2-28: Kết quả hàm cộng
Hàm trừ
-
Code chương trình:
% ham tinh Z =X-Y
sub(X,Y,Z):nonvar(X), nonvar(Y),
Z is X-Y.
% ham tinh X =Z+Y
sub(X,Y,Z):nonvar(Y), nonvar(Z),
X is Z+Y.
% ham tinh Y =X-Z
sub(X,Y,Z):nonvar(X), nonvar(Z),
Y is X-Z.
-
Kết quả mô phỏng theo Prolog:
20
Hình 2-29: Kết quả hàm cộng
Hàm nhân
-
Code chương trình:
% ham tinh Z =X*Y
mul(X,Y,Z):nonvar(X), nonvar(Y),
Z is X*Y.
% ham tinh X =Z/Y
mul(X,Y,Z):nonvar(Y), nonvar(Z),
X is Z//Y.
% ham tinh Y =Z/X
mul(X,Y,Z):nonvar(X), nonvar(Z),
Y is Z//X.
-
Kết quả mô phỏng theo Prolog:
21