Портал освітньо-інформаційних послуг «Студентська консультація»

  
Телефон +3 8(066) 185-39-18
Телефон +3 8(093) 202-63-01
 (093) 202-63-01
 studscon@gmail.com
 facebook.com/studcons

<script>

  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){

  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),

  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)

  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

 

  ga('create', 'UA-53007750-1', 'auto');

  ga('send', 'pageview');

 

</script>

Методичні вказівки

Тип роботи: 
Методичні вказівки
К-сть сторінок: 
44
Мова: 
Українська
Оцінка: 

об'єктів один за одним буде таким:

/* Об'єкти X, Y й Z утворять ряд,
якщо X ліворуч від Y й Y ліворуч від Z */
ряд(X, Y, Z) :- ліворуч(Y, X), ліворуч(Z, Y).
Кількість аргументів у голові даного правила дорівнює кількості об'єктів у
 задачі. Запит ?- ряд(X, Y, Z). дасть нам рішення задачі.
 
1.10. Арифметичні вирази
 
Ще раз відзначимо, що Пролог намагається сховати різницю між арифметикою цілих і дробових чисел скрізь, де це можна.
Для обчислення арифметичних виразів у Пролозі використається вбудований бінарний оператор is, що інтерпретує правий терм як арифметичний вираз, після чого уніфікує (якщо можливо) результат обчислення з лівим термом (звичайно зі змінною). Пріоритет виконання арифметичних операцій є традиційним. Круглі дужки використаються для зміни порядку обчислень. У наступних прикладах змінна X уніфікується зі значеннями арифметичних виразів:
?- X is 2.5 + 2.5. X = 5
Yes
?- X is 4/(2+1). X =1.33333
Yes
 X is cos(3*pi). X = -1
Yes
?- 1 is sin(pi/2). Yes
?- 1.0 is sin(pi/2). No
Пояснимо трохи несподівану відповідь Прологу в останньому запиті. Значення sin(pi/2) автоматично округляється предикатом is до цілого значення 1, що не вдається уніфікувати з дробовими числом 1.0. Предикат float змусить вважати значення sin(pi/2) дробовими числом:
?- 1.0 is float( sin(pi/2)). Yes
Для порівняння арифметичних виразів використається ряд операторів. Ціль X > Y (більше) буде успішна, якщо вираз X буде відповідати більшому числу, ніж вираз Y.
Аналогічно використаються оператори < (менше), =< (менше або дорівнює), >= (більше або дорівнює), =\= (не дорівнює) і =:= (арифметично рівний). Розходження між операторами =:= й = дуже істотні. Перший оператор порівнює значення арифметичних виражень, тоді як останній намагається уніфікувати їх.
Приклад
?- 2 ** 3 =:= 3 + 5. Yes
?- 2 ** 3 = 3 + 5. No
?- 1.0 = float(sin(pi/2)). No
 ?- 1.0 =:= sin(pi/2). Yes
Помітьте, що ціль X =:= Y буде істинна, навіть якщо один з термів є ціле число, а іншої - рівне йому дробове.
Приклад
Порядок підцілей у запиті впливає на його результат:
?- X is 4+Y, Y=3.
ERROR: Arguments are not sufficiently instantiated
?- Y=3, X is 4+Y. Y = 3
X = 7
Yes
У першому запиті повідомлення про помилку з'явилося тому, що перша підціль запиту (X is 4+Y) зазнала невдачі, тому що в момент її обробки неможливо обчислити вираз 4+Y.
 
1.11. Приклади програм
 
Розглянемо деякі програми, що демонструють обробку числових даних. Відзначимо важливу особливість процедур, створюваних мовою Пролог: вони, у відмінності від вбудованих функцій, не можуть з'являтися в арифметичних виразах. Якщо потрібно, наприклад, змінної R привласнити значення, рівне помноженому на три більшому із двох виразів X й Y, то, використовуючи введену нижче процедуру максимум, це можна записати так:
максимум(X,Y,Z), R is 3*Z.
максимум(X,X,X). максимум(X,Y,X):- X>Y. максимум(X,Y,Y):- X<Y.
гіпотенуза(X,Y,Z):- number(X), number(Y), Z is sqrt(X**2 + Y**2).
мін_гіп(A1,B1,A2,B2,Min):- гіпотенуза(A1,B1,C1), гіпотенуза(A2,B2,C2), Min is min(C1,C2).
сума(X,Y):- integer(X), X<10, Y is X.
сума(X,Y):- integer(X), X1 is X//10, сума(X1,Y1), Z is X mod 10, Y is Y1+Z.
друк_суми:-write('Введіть число (не забудьте крапку наприкінці): '),
read(X), nl,
write('Сума цифр введеного числа дорівнює '), сума(X,Y), write(Y), nl.
факт(1,1).
факт(N,R):- integer(N), N>1, N1 is N-1, факт(N1,R1), R is N*R1.
сума_списку([],0).
сума_списку([H|T],S):- сума_списку(T,S1), number(H), S is
S1+H.
Приклад
Написати процедуру, що обчислює максимум із двох чисел.
максимум(X,X,X). максимум(X,Y,X):- X>Y. максимум(X,Y,Y):- X<Y.
У предикаті максимум третій аргумент є максимумом з двох чисел – першого та другого його аргументів. Зміст кожного із правил даної процедури цілком очевидний. Подивимося на реакцію інтерпретатора Прологу на запити, що містять даний предикат.
?- максимум(20,50,X). X = 50
Yes
?- максимум(100,50,X). X = 100
Yes
?- максимум(X,50,100). X = 100
Yes
Остання відповідь показує, що наш предикат дозволяє знаходити відповідь на питання типу: "Яке повинне бути число, щоб максимум із шуканого числа й числа 50 дорівнювався 100?".
Як ви думаєте, чому була отримана відповідь "No" на наступний запит?
 ?- максимум(X,50,40). No
Приклад
Складіть процедуру гіпотенуза, що по двох катетах прямокутного трикутника обчислює його гіпотенузу.
Скористаємося теоремою Піфагора та вбудованою функцією sqrt для обчислення квадратного кореня:
гіптенуза(X,Y,Z):- Z is sqrt(X**2 + Y**2).
ограма коректно обчислює гіпотенузу, але якщо ми спробуємо за її допомогою знайти один з катетів, то переконаємося, що процедура працює не цілком вірно. Щоб уникнути цього додамо перевірку того, що перші два аргументи предиката - позитивні числа, для чого використаємо вбудований предикат number і порівняння з нулем:
гіпотенуза(X,Y,Z):- number(X), X>0, number(Y), Y>0, Z is sqrt(X**2 + Y**2).
?- гіпотенуза(3,4,X). X = 5
Yes
?- гіпотенуза(3,'a',X). No
?- гіпотенуза(3,X,5). No
Фото Капча