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

Lời giải bài tập prolog chương 3 Các phép toán và số học môn lập trình logic và ràng buộc.

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.63 MB, 42 trang )

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


×