Bài tập thực hành prolog - Công nghệ thông tin | Trường Đại học Quy Nhơn

Bài tập thực hành prolog - Công nghệ thông tin | Trường Đại học Quy Nhơn được sưu tầm và soạn thảo dưới dạng file PDF để gửi tới các bạn sinh viên cùng tham khảo, ôn tập đầy đủ kiến thức, chuẩn bị cho các buổi học thật tốt. Mời bạn đọc đón xem!

BÀI TẬP THỰC HÀNH PROLOG
Cài đặt phần mềm SWI-Prolog
SWI-Prolog có thể tải và cài đặt từ địa chỉ: https://www.swi-prolog.org/Download.html
Bản quyền sử dụng phần mềm SWI-Prologmiễn phí cho mục đích học tập và nghiên
cứu.
SWI-Prolog là một công cụ lập trình Prolog được sử dụng rất phổ biến, có các phiên bản
chạy trên các hệ điều hành Windows, MacOS, và Linux.
Chạy chương trình Hello World:
Hướng dẫn Prolog
Toán tử so sánh
Toán tử Nghĩa
X> Y X lớn hơn Y
X <Y X nhỏ hơn Y
X> = Y X lớn hơn hoặc bằng Y
X = <Y X nhỏ hơn hoặc bằng Y
X =: = Y giá trị X và Y bằng nhau
X = \ = Y giá trị X và Y không bằng nhau
Ví dụ:
| ?- + =:= + 1 2 2 1.
yes
| ?- + = + 1 2 2 1.
no
| ?- + = + 1 A B 2.
A = 2
B = 1
yes
| ?- < 5 10.
yes
| ?- > 5 10.
no
| ?- 10=\=100.
yes
Toán tử trong số học
Toán tử Nghĩa
+ Phép cộng
- Phép trừ
* Phép nhân
/ Phân công
** Quyền lực
// Phân chia số nguyên
mod Mô đun
Toán tử logic
Toán tử Nghĩa
, Logic AND
; Logic OR
Vòng lặp
Các câu lệnh lặp được sử dụng để thực thi khối mã nhiều lần. Nói chung, for, while, do-
while là các cấu trúc vòng lặp trong các ngôn ngữ lập trình (như Java, C, C ++).
Khối được thực thi nhiều lần bằng cách sử dụng logic vị từ đệ quy. Không vòng
lặp trực tiếp trong một số ngôn ngữ khác, nhưng chúng ta thể phỏng vòng lặp
bằng một vài kỹ thuật khác nhau.
Ví dụ:
count_to_10 nl(10) :- write(10), .
count_to_10 X( ) :-
write(X), ,nl
Y X is + 1,
count_to_10(Y).
Kết quả:
| ?- [loop].
compiling D:/TP Prolog/Sample_Codes/loop.pl for byte code...
D:/TP Prolog/Sample_Codes/loop.pl compiled, 4 lines read - 751 bytes written, 16 ms
(16 ms) yes
| ?- count_to_10(3).
3 4 5 6 7 8 9 10
true ?
yes
| ?-
Câu lệnh điều kiện
Các câu lệnh điều kiện là câu lệnh If-Then-Else. Cách sử dụng cơ bản như sau:
If <condition> is true, Then <do this>, Else
Trong một số ngôn ngữ lập trình khác, các câu lệnh If-Else, nhưng trong
Prolog, chúng ta phải định nghĩa các câu lệnh của mình theo một số cách
khác. Sau đây là một ví dụ về việc ra quyết định trong Prolog.
Ví dụ:
% If Then- -Else statement
gt Y(X, ) :- X >= Y,write('X is greater or equal').
gt Y(X, ) :- X < Y,write('X is smaller').
% If Elif- -Else statement
gte X( ,Y) :- X Y> ,write('X is greater').
gte X( ,Y) :- X =:= Y,write('X and Y are same').
gte X( ,Y) :- X Y< ,write('X is smaller').
Danh sách
Danh sách là một cấu trúc dữ liệu đơn giản được sử dụng rộng rãi trong lập trình
phi số. Danh sách bao gồm bất kỳ số lượng mục nào, dụ: đỏ, lục, lam, trắng,
sẫm. Nó sẽ được biểu thị là, [đỏ, lục, lam, trắng, tối]. Danh sách các phần tử sẽ
được đặt trong .dấu ngoặc vuông
Bây giờ, chúng ta hãy xem xét một danh sách, L = [a, b, c]. Nếu chúng ta viết Tail
= [b, c] thì chúng ta cũng thể viết danh sách L dưới dạng L = [a | Tail]. Ở đây
thanh dọc (|) ngăn cách phần đầu và phần đuôi.
Ví dụ:
[a, b, c] = [x | [b, c]]
[a, b, c] = [a, b | [c] ]
[a, b, c] = [a, b, c | []]
Input & output
Input: Để ghi đầu ra, chúng ta có thể sử dụng vị từ write(). Vị từ này nhận tham
số làm đầu vào và ghi nội dung vào bảng điều khiển theo mặc định. write() cũng
có thể ghi trong tệp.
Ví dụ:
| ?- ). write(56
56
yes
| ?- ). write('hello'
hello
Output: read () được sử dụng để đọc từ bảng điều khiển. Người dùng có thể viết
một cái gì đó trong bảng điều khiển, có thể được lấy làm đầu vào và xử lý
nó. Read () thường được sử dụng để đọc từ bảng điều khiển, nhưng nó cũng có
thể được sử dụng để đọc từ các tệp.
Ví dụ:
cube :-
write('Write a number: '),
read( ),Number
process( ).Number
process stop( ) :- !.
process(Number) :-
C is Number * Number * Number,
write('Cube of ' ': '), ),write(Number write( ),write C nl( ), , cube.
Kết quả:
| ?- [read_write].
compiling D:/TP Prolog/Sample_Codes/read_write.pl for byte code...
D:/TP Prolog/Sample_Codes/read_write.pl compiled, 9 lines read - 1226 bytes written, 12 ms
(15 ms) yes
| ?- cube.
Write a number: 2.
Cube of 2: 8
Write a number: 10.
Cube of 10: 1000
Write a number: 12.
Cube of 12: 1728
Write a number: 8.
Cube of 8: 512
Write a number: stop
.
(31 ms) yes
| ?-
Bài tập thực hành
Để load file:
consult(‘filename’).
Bài tập làm quen – Viết chương trình
1. Suy diễn logic sau:
Tuấn là sinh viên QNU.
Mọi sinh viên của QNU đều học môn Toán rời rạc.
Tuấn có học môn Toán rời rạc không?
Chương trình Prolog:
studentQNU(tuan).
studDiscretQNU(X) :- studentQNU(X).
Kết quả chạy:
2. Viết chương trình tìm Min và Max của hai số?find_max find_min
find_max(X, Y, Max) :-
(X >= Y -> Max = X ; Max = Y).
find_min(X, Y, Min) :-
(X =< Y -> Min = X ; Min = Y).
?- find_max(3, 5, Max).
Max = 5
?- find_min(3, 5, Min).
Min = 3
------------------------------------------------------------------------------------------------
find_max_in_list([X|Xs], Max) :-
find_max_in_list(Xs, X, Max).
find_max_in_list([], Max, Max).
find_max_in_list([X|Xs], Acc, Max) :-
(X > Acc -> find_max_in_list(Xs, X, Max) ; find_max_in_list(Xs, Acc, Max)).
find_min_in_list([X|Xs], Min) :-
find_min_in_list(Xs, X, Min).
find_min_in_list([], Min, Min).
find_min_in_list([X|Xs], Acc, Min) :-
(X < Acc -> find_min_in_list(Xs, X, Min) ; find_min_in_list(Xs, Acc, Min)).
?- find_max_in_list([3, 5, 2, 7, 1], Max).
Max = 7
?- find_min_in_list([3, 5, 2, 7, 1], Min).
Min = 1
Làm việc với danh sách – Viết chương trình
3. Tìm phần tử cuối cùng của danh sách?
Ví dụ:
:? – my_last(X, [a, b, c, d]).
X = d
4. Tìm phần tử kề cuối của danh sách?
(phần tử cuối cùng thứ 2)
5. Tìm phần tử thứ K của một danh sách?
Ví dụ:
:? - element_at(X, [a, b, c, d, e], 3).
X = c
6. Tìm số phần tử của danh sách?
7. Đảo ngược danh sách?
8. Tìm xem một danh sách có phải là một palindrome hay không?
Một palindrome có thể được đọc về phía trước hoặc phía sau; ví dụ: [x, a, m,
a, x].
9. Loại bỏ các phần tử danh sách trùng lặp liên tiếp?
Ví dụ:
:? - remove([a, a, a, a, b, c, c, a, a, d, e, e, e, e], X).
1X = [a, b, c, a, d, e]
10. Đó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í dụ:
:? - pack([a, a, a, a, b, c, c, a, a, d, e, e, e, e], X).
X = [[a, a, a, a], [b], [c, c], [a, a], [d], [e, e, e, e]]
11.Sao chép các phần tử của danh sách?
Ví dụ:
:? - Dupli([a, b, c, c, d], X).
X = [a, a, b, b, c, c, c, c, d, d]
12. Nhân đôi các phần tử của danh sách một số lần nhất định?
Ví dụ:
:? - Dupli([a, b, c], 3, X).
X = [a, a, a, b, b, b, c, c, c]
13. Bỏ mọi 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).
X = [a, b, d, e, g, h, k]
14. Chia danh sách thành hai phần; chiều dài của phần đầu tiên đã cho?
Ví dụ:
:? - split([a, b, c, d, e, f, g, h, i, k], 3, L1, L2).
L1 = [a, b, c]
L2 = [d, e, f, g, h, i, k]
15. Xóa phần tử K khỏi danh sách?
Ví dụ:
:? - remove_at(X, [a, b, c, d], 2, R).
X = b
R = [a, c, d]
Làm việc với số học – Viết chương trình
16. Xác định xem một số nguyên đã cho có phải là số nguyên tố hay không?
Ví dụ
:? - is_prime(7).
true
17. Xác định ước chung lớn nhất của hai số nguyên dương?
Sử dụng thuật toán Euclid.
Ví dụ:
:? - gcd(36, 63, G).
G = 9
18. Xác định xem hai số nguyên dương có phải là nguyên tố hay không?
Hai số là nguyên tố nếu ước số chung lớn nhất của chúng bằng 1.
Ví dụ:
:? - coprime(35, 64).
true
19. Có ba đoạn thẳng, ngang, dọc, xiên xác định xem đoạn thẳng là loại nào?
Từ sơ đồ trên, chúng ta có thể hiểu
rằng:
Đối với các đường nằm ngang,
các giá trị tọa độ y của hai điểm
cuối giống nhau.
Đối với các đường thẳng đứng,
các giá trị tọa độ x của hai điểm
cuối giống nhau.
Đối với đường xiên, tọa độ (x, y)
của hai điểm cuối khác nhau.
| 1/10

Preview text:

BÀI TẬP THỰC HÀNH PROLOG
Cài đặt phần mềm SWI-Prolog
SWI-Prolog có thể tải và cài đặt từ địa chỉ: https://www.swi-prolog.org/Download.html
 Bản quyền sử dụng phần mềm SWI-Prolog là miễn phí cho mục đích học tập và nghiên cứu.
 SWI-Prolog là một công cụ lập trình Prolog được sử dụng rất phổ biến, có các phiên bản
chạy trên các hệ điều hành Windows, MacOS, và Linux.
 Chạy chương trình Hello World: Hướng dẫn Prolog Toán tử so sánh Toán tử Nghĩa X> Y X lớn hơn Y X X nhỏ hơn Y X> = Y X lớn hơn hoặc bằng Y
X = X nhỏ hơn hoặc bằng Y X =: = Y giá trị X và Y bằng nhau X = \ = Y
giá trị X và Y không bằng nhau Ví dụ: | ?- 1+2=:=2+1. yes | ?- 1+2=2+1. no | ?- 1+A=B+2. A = 2 B = 1 yes | ?- 5<10. yes | ?- 5>10. no | ?- 10=\=100. yes
Toán tử trong số học Toán tử Nghĩa + Phép cộng - Phép trừ * Phép nhân / Phân công ** Quyền lực // Phân chia số nguyên mod Mô đun Toán tử logic Toán tử Nghĩa , Logic AND ; Logic OR Vòng lặp
Các câu lệnh lặp được sử dụng để thực thi khối mã nhiều lần. Nói chung, for, while, do-
while là các cấu trúc vòng lặp trong các ngôn ngữ lập trình (như Java, C, C ++).
Khối mã được thực thi nhiều lần bằng cách sử dụng logic vị từ đệ quy. Không có vòng
lặp trực tiếp trong một số ngôn ngữ khác, nhưng chúng ta có thể mô phỏng vòng lặp
bằng một vài kỹ thuật khác nhau. Ví dụ:
count_to_10(10) :- write(10),nl. count_to_10(X) :- write(X),nl, Y is X + 1, count_to_10(Y). Kết quả: | ?- [loop].
compiling D:/TP Prolog/Sample_Codes/loop.pl for byte code...
D:/TP Prolog/Sample_Codes/loop.pl compiled, 4 lines read - 751 bytes written, 16 ms (16 ms) yes | ?- count_to_10(3). 3 4 5 6 7 8 9 10 true ? yes | ?-
Câu lệnh điều kiện
Các câu lệnh điều kiện là câu lệnh If-Then-Else. Cách sử dụng cơ bản như sau: If is true, Then , Else
Trong một số ngôn ngữ lập trình khác, có các câu lệnh If-Else, nhưng trong
Prolog, chúng ta phải định nghĩa các câu lệnh của mình theo một số cách
khác. Sau đây là một ví dụ về việc ra quyết định trong Prolog. Ví dụ: % If-Then-Else statement
gt(X,Y) :- X >= Y,write('X is greater or equal').
gt(X,Y) :- X < Y,write('X is smaller'). % If-Elif-Else statement
gte(X,Y) :- X > Y,write('X is greater').
gte(X,Y) :- X =:= Y,write('X and Y are same').
gte(X,Y) :- X < Y,write('X is smaller'). Danh sách
Danh sách là một cấu trúc dữ liệu đơn giản được sử dụng rộng rãi trong lập trình
phi số. Danh sách bao gồm bất kỳ số lượng mục nào, ví dụ: đỏ, lục, lam, trắng,
sẫm. Nó sẽ được biểu thị là, [đỏ, lục, lam, trắng, tối]. Danh sách các phần tử sẽ
được đặt trong dấu ngoặc vuông.
Bây giờ, chúng ta hãy xem xét một danh sách, L = [a, b, c]. Nếu chúng ta viết Tail
= [b, c] thì chúng ta cũng có thể viết danh sách L dưới dạng L = [a | Tail]. Ở đây
thanh dọc (|) ngăn cách phần đầu và phần đuôi. Ví dụ:  [a, b, c] = [x | [b, c]]  [a, b, c] = [a, b | [c] ]  [a, b, c] = [a, b, c | []] Input & output
Input: Để ghi đầu ra, chúng ta có thể sử dụng vị từ write(). Vị từ này nhận tham
số làm đầu vào và ghi nội dung vào bảng điều khiển theo mặc định. write() cũng có thể ghi trong tệp. Ví dụ: | ?- write(56). 56 yes | ?- write('hello'). hello
Output: read () được sử dụng để đọc từ bảng điều khiển. Người dùng có thể viết
một cái gì đó trong bảng điều khiển, có thể được lấy làm đầu vào và xử lý
nó. Read () thường được sử dụng để đọc từ bảng điều khiển, nhưng nó cũng có
thể được sử dụng để đọc từ các tệp. Ví dụ: cube :- write('Write a number: '), read(Number), process( ). Number process(stop) :- !. process(Number) :- C is Number * Number * Number, write('Cube of '),write( ),
Number write(': '),write(C),nl, cube. Kết quả: | ?- [read_write].
compiling D:/TP Prolog/Sample_Codes/read_write.pl for byte code...
D:/TP Prolog/Sample_Codes/read_write.pl compiled, 9 lines read - 1226 bytes written, 12 ms (15 ms) yes | ?- cube. Write a number: 2. Cube of 2: 8 Write a number: 10. Cube of 10: 1000 Write a number: 12. Cube of 12: 1728 Write a number: 8. Cube of 8: 512 Write a number: stop . (31 ms) yes | ?- Bài tập thực hành Để load file:
consult(‘filename’).
Bài tập làm quen – Viết chương trình 1. Suy diễn logic sau:  Tuấn là sinh viên QNU.
 Mọi sinh viên của QNU đều học môn Toán rời rạc.
 Tuấn có học môn Toán rời rạc không? Chương trình Prolog: studentQNU(tuan).
studDiscretQNU(X) :- studentQNU(X). Kết quả chạy:
2. Viết chương trình find_maxfind_min tìm Min và Max của hai số? find_max(X, Y, Max) :-
(X >= Y -> Max = X ; Max = Y). find_min(X, Y, Min) :-
(X =< Y -> Min = X ; Min = Y). ?- find_max(3, 5, Max). Max = 5 ?- find_min(3, 5, Min). Min = 3
------------------------------------------------------------------------------------------------
find_max_in_list([X|Xs], Max) :- find_max_in_list(Xs, X, Max).
find_max_in_list([], Max, Max).
find_max_in_list([X|Xs], Acc, Max) :-
(X > Acc -> find_max_in_list(Xs, X, Max) ; find_max_in_list(Xs, Acc, Max)).
find_min_in_list([X|Xs], Min) :- find_min_in_list(Xs, X, Min).
find_min_in_list([], Min, Min).
find_min_in_list([X|Xs], Acc, Min) :-
(X < Acc -> find_min_in_list(Xs, X, Min) ; find_min_in_list(Xs, Acc, Min)).
?- find_max_in_list([3, 5, 2, 7, 1], Max). Max = 7
?- find_min_in_list([3, 5, 2, 7, 1], Min). Min = 1
Làm việc với danh sách – Viết chương trình
3. Tìm phần tử cuối cùng của danh sách? Ví dụ:
:? – my_last(X, [a, b, c, d]). X = d
4. Tìm phần tử kề cuối của danh sách?
(phần tử cuối cùng thứ 2)
5. Tìm phần tử thứ K của một danh sách? Ví dụ:
:? - element_at(X, [a, b, c, d, e], 3). X = c
6. Tìm số phần tử của danh sách? 7. Đảo ngược danh sách?
8. Tìm xem một danh sách có phải là một palindrome hay không?
Một palindrome có thể được đọc về phía trước hoặc phía sau; ví dụ: [x, a, m, a, x].
9. Loại bỏ các phần tử danh sách trùng lặp liên tiếp? Ví dụ:
:? - remove([a, a, a, a, b, c, c, a, a, d, e, e, e, e], X). 1X = [a, b, c, a, d, e] 10.
Đó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í dụ:
:? - pack([a, a, a, a, b, c, c, a, a, d, e, e, e, e], X).
X = [[a, a, a, a], [b], [c, c], [a, a], [d], [e, e, e, e]]
11.Sao chép các phần tử của danh sách? Ví dụ:
:? - Dupli([a, b, c, c, d], X).
X = [a, a, b, b, c, c, c, c, d, d] 12.
Nhân đôi các phần tử của danh sách một số lần nhất định? Ví dụ: :? - Dupli([a, b, c], 3, X).
X = [a, a, a, b, b, b, c, c, c] 13.
Bỏ mọi 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). X = [a, b, d, e, g, h, k] 14.
Chia danh sách thành hai phần; chiều dài của phần đầu tiên đã cho? Ví dụ:
:? - split([a, b, c, d, e, f, g, h, i, k], 3, L1, L2). L1 = [a, b, c] L2 = [d, e, f, g, h, i, k] 15.
Xóa phần tử K khỏi danh sách? Ví dụ:
:? - remove_at(X, [a, b, c, d], 2, R). X = b R = [a, c, d]
Làm việc với số học – Viết chương trình 16.
Xác định xem một số nguyên đã cho có phải là số nguyên tố hay không? Ví dụ :? - is_prime(7). true 17.
Xác định ước chung lớn nhất của hai số nguyên dương?
Sử dụng thuật toán Euclid. Ví dụ: :? - gcd(36, 63, G). G = 9 18.
Xác định xem hai số nguyên dương có phải là nguyên tố hay không?
Hai số là nguyên tố nếu ước số chung lớn nhất của chúng bằng 1. Ví dụ: :? - coprime(35, 64). true 19.
Có ba đoạn thẳng, ngang, dọc, xiên xác định xem đoạn thẳng là loại nào?
Từ sơ đồ trên, chúng ta có thể hiểu rằng:
 Đối với các đường nằm ngang,
các giá trị tọa độ y của hai điểm cuối giống nhau.
 Đối với các đường thẳng đứng,
các giá trị tọa độ x của hai điểm cuối giống nhau.
 Đối với đường xiên, tọa độ (x, y)
của hai điểm cuối khác nhau.