Логічні задачі на мові програмування Prolog
Завдання 1.
1. Ввести запропонований текст програми, реалізувати її і записати на диск.divdicates
hello.
goal
hello.
clauses
hello: -
makewindow (1,7,7, "Моя перша програма", 4,56,14,22),
nl, write ("Введіть ваше ім'я, \ n", "потім натисніть Enter."),
cursor (4,6),
readln (Name), nl,
write ("Ласкаво просимо \ n в PDC Prolog, \ n ","", Name ,"!").
Результат: Ласкаво просимо в PDC Prolog, Vladimir!
2. Навмисне ввести друкарські помилки в текст програми і ознайомитися з повідомленнями про ці всі помічені, виправити їх.
divdicates
hello.
goal
hello.
clauses
hello: -
makewindow (1,7,7, "Моя перша програма", 4,56,14,22)
nl, write ("Введіть ваше ім'я, n", "потім натисніть Enter."),
cursor (4,6),
readln (Name) nl,
write ("Ласкаво просимо \ n в PDC Prolog, \ n", ", Name ,!").
Результат: 423 Syntax eror.
Завдання 2.
Реалізувати програму з введенням перерахованих нижче цілей і перевірити отримані результати. Цілі зовнішні.divdicates
book (symbol, symbol, symbol, integer).
clauses
book ("Фігурне В.Е.", "IBM PC для користувача", "ФиС", 1988).
book ("Пєтухов О.А.", "Проектування ОРБД", "Суднобудування", 1984).
book ("Пєтухов О.А.", "Об'єктно-реляційні моделі даних", "СЗПІ", 1987).
book ("Пєтухов О.А.", "Моделювання СМО", "СЗПІ", 1989).
book ("Пєтухов О.А.", "PDC Prolog", "СЗПІ", 2000).
book ("Анкудінов Г.І.", "Теорія автоматів", "СЗПІ", 1997).
book ("Миколаїв В.І.", "Дискретні структури", "СЗПІ", 1999).
Результат: X = Proektirovanie OR BD, Y = SUDOSTROENIE, Z = 1984
X = Object models of DATA, Y = SZPI, Z = 1987
X = Modelirovanie CMO, Y = SZPI, Z = 1989
X = PDC Prolog, Y = SZPI, Z = 2000
4 Solutions
X = Proektirovanie OR BD
X = Object models of DATA
X = Modelirovanie CMO
X = PDC Prolog
4 Solutions
E = Petuchov OA, X = Object models of DATA, Z = 1987
E = Petuchov OA, X = Modelirovanie CMO, Z = 1989
E = Petuchov OA, X = PDC Prolog, Z = 2000
E = Ankudinov GI, X = Automat theory, Z = 1997
E = Nikolaev VI, X = Diskretniye struktury, Z = 1999
5 Solutions
Завдання 3.
Реалізувати програму з введенням всіх перерахованих зовнішніх цілей і перевірити отримані результати:domains
name = symbol
year_in, year_out = integer
divdicates
parents (name, name)
woman (name)
man (name)
offspring (name, name)
father (name, name)
mother (name, name)
parent_parents (name, name)
brother (name, name)
grandfather (name, name)
grandmother (name, name)
emperor (name, year_in, year_out)
emperor_was (name, integer)
clauses
parents ("Петро III", "Павло I").
parents ("Катерина II", "Павло I").
parents ("Павло I", "Олександр I").
parents ("Павло I", "Микола I").
parents ("Микола I", "Олександр II").
parents ("Олександр II", "Олександр III").
parents ("Олександр III", "Микола II").
woman ("Катерина II").
man ("Петро III").
man ("Павло I").
man ("Алексндр I").
man ("Микола I").
man ("Олександр II").
man ("Олександр III").
man ("Микола II").
offspring (Y, X):-parents (X, Y).
father (X, Y):-parents (X, Y), man (X).
mother (X, Y):-parents (X, Y), woman (X).
parent_parents (X, Z):-parents (X, Y), parents (Y, Z).
brother (X, Y):-parents (Z, X), parents (Z, Y), man (X), X <> Y.
grandfather (X, Y):-father (X, Z), father (Z, Y).
grandmother (X, Y):-mother (X, Z), father (Z, Y).
emperor ("Петро III", 1761,1762).
emperor ("Катерина II", 1762,1796).
emperor ("Павло I", 1796,1801).
emperor ("Олександр I", 1801,1825).
emperor ("Микола I", 1825,1855).
emperor ("Олександр II", 1855,1881).
emperor ("Олександр III", 1881,1894).
emperor ("Микола II", 1894,1917).
emperor_was (X, Y):-emperor (X, A, B), Y> = A, Y <= B.
Результат: Y = aleksandr IX = petr III, A = 1761, B = 1762 X = pavel I
1 Solution X = ekaterina II, A = 1762, B = 1 769 1 Solution
X = pavel I, A = 1796, B = 1801
X = aleksandr I, A = 1801, B = 1825
X = nikolay I, A = 1825, B = 1855
X = aleksandr II, A = 1855, B = 1881
X = aleksandr III, A = 1881, B = 1894
X = nikolay II, A = 1894, B = 1917
8 Solutions
Завдання 4.
1. Реалізувати наведену програму:domains
name = symbol
divdicates
star (name)
planet (name)
revolve (name, name)
satellite (name, name).
goal
satellite (X, "Марс"),
write (X, "супутник Марса."),
nl.
clauses
star ("Сонце").
planet ("Земля").
planet ("Марс").
revolve ("Земля", "Сонце").
revolve ("Марс", "Сонце").
revolve ("Місяць", "Земля").
revolve ("Фобос", "Марс").
revolve ("Деймос", "Марс").
satellite (X, Y):-planet (Y), revolve (X, Y).
Результат: Фобос супутник Марса.
2. Написати та реалізувати програму встановлення родинних зв'язків: Василь має дочку Ольгу, у якої два сини Михайло і Максим. Використовувати зовнішні і внутрішні цілі.
domains
name = symbol
divdicates
men (name)
mama (name)
sons (name, name)
doughter (name, name)
deda (name, name)
brother (name, name).
goal
doughter (Z, Y),
write (Z, Y),
nl.
clauses
men ("Vaciliy").
men ("Michail").
men ("Maxim").
mama ("Olga").
sons ("Michail", "Olga").
sons ("Maxim", "Olga").
doughter ("Olga", "Vasiliy").
deda (X, Y): - men (X), men (Y), sons (X, Y), doughter (Z, Y).
brother (X, Y): - men (X), men (Y), sons (X, Z), sons (Y, Z), X <> Y.
Результат: Olga, Vaciliy
Завдання 5.
1. Реалізувати таку програму: Отримати псевдовипадкові речові числа в діапазоні від 0 до 1.goal
random (X),
Z = X,
write ("Псевдовипадкові дійсне число від 0 до 1:", Z),
nl.
Результат: 0,64823988962
2. Отримати випадкові цілі числа в діапазоні від 0 до 10 та від 10 до 35.
goal
random (10, X),
Z = X,
write ("Псевдовипадкові дійсне число від 0 до 10:", Z),
nl.
Результат: 5
goal
random (25, X),
Z = X + +10,
write ("Псевдовипадкові дійсне число від 10 до 35:, Z),
nl.
Результат: 21
Завдання 6.
1.Реалізувати наведену пргограмму для обчислення
goal
write ("X ="),
readint (X),
nl,
write ("K ="),
readreal (K),
nl,
Z = exp (sin (X)) + sqrt (K + X * X),
write ("Z =", Z).
Результат: X = 5, K = 16, Z = 6,7864292326
2. У режимі калькулятора обчислити X = (2 + 5) * 3,4, тобто вводячи значення 2, 5, 3.4 з клавіатури.
goal
write ("X ="),
readint (X),
nl,
write ("K ="),
readint (K),
nl,
write ("N ="),
readreal (N),
nl
Z = (X + K) * N,
write ("Z =", Z).
Результат: 23,8
Завдання 7.
- Реалізувати наведену програму з зовнішньої зв'язком, виконавши всі чотири арифметичні операції.
operation (symbol, real, real)
clauses
operation ("+", X, Y):-Z = X + Y,
write (X ,"+", Y ,"=", Z),
nl.
operation ("-", X, Y):-Z = XY,
write (X ,"-", Y ,"=", Z),
nl.
operation ("*", X, Y):-Z = X * Y,
write (X ,"*", Y ,"=", Z),
nl.
operation ("/", X, Y):-Z = X / Y,
write (X ,"/", Y ,"=", Z),
nl.
Результат: Z = 8 +2 Z = 8-2 Z = 8 * 2 Z = 8 / 2
Z = 10 Z = 6 Z = 16 Z = 4
1 Solution 1 Solution 1 Solution 1 Solution
2. Реалізувати цю ж програму з внутрішньою метою
divdicates
operation (symbol, real, real)
Goal
write ("Vvedite chisla"),
nl,
readreal (X),
nl,
readreal (Y),
nl,
operation ("+", X, Y),
operation ("-", X, Y),
operation ("*", X, Y),
operation ("/", X, Y).
clauses
operation ("+", X, Y):-Z = X + Y,
write (X ,"+", Y ,"=", Z),
nl.
operation ("-", X, Y):-Z = XY,
write (X ,"-", Y ,"=", Z),
nl.
operation ("*", X, Y):-Z = X * Y,
write (X ,"*", Y ,"=", Z),
nl.
operation ("/", X, Y):-Z = X / Y,
write (X ,"/", Y ,"=", Z),
nl.
Результат: Vvedite chisla
2
4
2 +4 = 6
2-4 =- 2
2 * 4 = 8
2 / 4 = 0,5
Завдання 9.
Реалізувати програму завдання 4 з новою метою, що використовує вбудований предикат fail, і проаналізувати отриманий результат.domains
name = symbol
divdicates
men (name)
mama (name)
sons (name, name)
doughter (name, name)
deda (name, name)
brother (name, name).
goal
deda (X, "Vaciliy"),
write (X, "Vaciliy"),
nl.
clauses
men ("Vaciliy").
men ("Michail").
men ("Maxim").
mama ("Olga").
sons ("Michail", "Olga").
sons ("Maxim", "Olga").
doughter ("Olga", "Vasiliy").
deda (X, Y): - men (X), men (Y), sons (X, Y), doughter (Z, Y), nl,
write ("", X), nl, fail.
brother (X, Y): - men (X), men (Y), sons (X, Z), sons (Y, Z), X <> Y.
Результат: Michail
Maxim
Завдання 10.
Реалізувати програми обчислення суми наступних рядів:1. 1 + 2 + 3 + ... + 9 + 10
2. 2 + 4 + 6 + ... + 14 + 16
3. 10 + 9 + 8 + ... + 2 + 1
4. 1 + 3 + 5 + ... + 13 + 15
domains
number, sum = integer
divdicates
sum (number, sum)
goal
write ("Сума ряду:"),
sum (1, sum), write (sum).
clauses
sum (11,0).
sum (Number, Sum): -
New_number = Number +1,
sum (New_number, Partial_sum),
Sum = Number + Partial_sum.
Результат: Сума ряду: 55
domains
number, sum = integer
divdicates
sum (number, sum)
goal
write ("Сума ряду:"),
sum (2, sum), write (sum).
clauses
sum (18,0).
sum (Number, Sum): -
New_number = Number +2,
sum (New_number, Partial_sum),
Sum = Number + Partial_sum.
Результат: Сума ряду: 72
domains
number, sum = integer
divdicates
sum (number, sum)
goal
write ("Сума ряду:"),
sum (9, sum), write (sum).
clauses
sum (0,11).
sum (Number, Sum): -
New_number = Number-1,
sum (New_number, Partial_sum),
Sum = Number + Partial_sum
Результат: Сума ряду: 55
domains
number, sum = integer
divdicates
sum (number, sum)
goal
write ("Сума ряду:"),
sum (1, sum), write (sum).
clauses
sum (17,0).
sum (Number, Sum): -
New_number = Number +2,
sum (New_number, Partial_sum),
Sum = Number + Partial_sum.
Результат: Сума ряду: 64
Завдання 12.
Написати програму, що створює список міст. Виконати програму з різними внутрішніми і зовнішніми цілями.domains
town_list = town *
town = symbol
divdicates
towns (town_list)
goal
towns ([A, B, C, D, E]),
write (A ,",", B ,",", C ,",", D ,",", E).
clauses
towns (["Kazan", "Nignekamsk", "Elabuga", "Bugulma", "Almetevsk"]).