Книга: ПРОГРАМУВАННЯ НА МОВІ ПРОЛОГ

Книга: ПРОГРАМУВАННЯ НА МОВІ ПРОЛОГ
2.5. Арифметика
2.5. Арифметика
ЕОМ часто використовують для виконання дій над числами. За допомогою арифметичних операцій можна порівнювати числа та проводити обчислення. У цьому розділі будуть наведені приклади використання арифметичних операцій.
Розглянемо спочатку порівняння чисел. Для двох заданих чисел завжди можна сказати, чи дорівнює одне число іншому,менше чиодне число іншого,більше чиодне число іншого. Пролог надає деякі вбудовані предикати, що дозволяють
порівнювати числа. Для цього можуть використовуватися обговорювані в розд. 2.4 предикати '='і '='. Їхні аргументи можуть бути конкретизовані змінні, значеннями яких є цілі числа, а також цілі числа, записані у вигляді констант. Існує ще кілька предикатів, які дають змогу порівнювати числа. Перерахуємо тут усі ці предикати, зауваживши попередньо, що кожен із них можна використовувати у формі інфіксного оператора.
X = YX і Y представляють одне й те число
X = YX та Y представляють різні числа
X ‹ YX менше Y
X › YX більше Y
X =‹ YX менше або дорівнює Y
X ›= YX більше або дорівнює Y
Зазначимо, що символ «менше чи одно» записується не так, як у багатьох інших мовах програмування (зазвичай ‹=). Це зроблено в Пролозі для того, щоб програміст міг використовувати схожий на стрілку атом для своїх власних потреб.
Оскільки оператори порівняння є предикатами, можна було б припустити, що в Пролозі допустимо такий факт:
стверджує, що 2 насправді більше 3. Факти, подібні до цього, зформальної сторони повністю відповідає правилам Прологу. Однак Пролог не дозволяє додавати факти до «вбудованих» предикатів. Така особливість запобігає непередбачуваним змінам сенсу вбудованих предикатів. У розділі 6 будуть описані всі вбудовані предикати, у тому числі й ті, з якими ми познайомилися.
Як перший приклад використання чисел припустимо, що у нас є база даних, що містить відомості про принців, які правили Уельсом у 9-му та 10-му століттях. Предикатправил(Х,Y,Z) істинний, якщо принц з ім'ямX перебував при владі з рокуY до рокуZ. Список фактів бази даних виглядає так:
Тепер припустимо, що ми хочемо дізнатися, хто був на троні Уельсу в певному році. Можна було б визначити правило, аргументами якого були б ім'я та дата і яке б переглядало базу даних і порівнювало задану дату з тими, що зазначені в фактах. Давайте визначимо предикатпринц(X, Y), який істинний, якщо принц на ім'яX був на троні на рікY :
принцом на рік Y, якщо:
X правил з року А до року В і
Y знаходиться між А і В або збігається з А або В.
Перше цільове затвердження узгоджуватиметься з базою даних шляхом пошуку відповідного факту. Друге цільове твердження правильне, якщоY дорівнюєА, абоY дорівнюєВ, абоY лежить міжА іВ. Для перевірки можна використовувати затвердженняY>=А таY=‹В. Переписавши це на Пролозі, отримуємо таке правило:
принц (X,Y):-правил(Х,А,В),Y ›= А,Y =‹ Ст.
Нижче наведено кілька можливих запитів та відповідей, що надаються Пролог-системою.
X = хівел_аб_ієуаф так
Зауважте використання змінних в останніх прикладах. Впевніться, щови розумієте, як працює механізм пошуку Прологу при відповіді на такі запитання.
Арифметичні операції також можуть використовуватися для обчислень. Наприклад, якщо є відомості про населення та площу деякої країни, то можна обчислити середню щільність населення для цієї країни. Середня щільність населення показує, наскільки тісно було б у цій країні, якби її населення було рівномірно розподілено по всій її території.
Розглянемо наступну базу даних, що містить відомості про населення та площу деяких країн у 1976 р. Для подання зв'язку між країною та її населенням буде використовуватися предикатнас. У наші дні населення зазвичай характеризується досить великими числами. Не всі версії Прологу дають змогу працювати з такими числами. Тому обчислюватимемо населення в мільйонах:нас(Х, Y) означає, що населення країниX становить приблизно «Y мільйонів» людей. Предикатплоща позначатиме зв'язок між країною та її площею (у мільйонах квадратних кілометрів):
Тепер для того, щоб знайти середню густину населення деякої країни, ми повинні використовувати правило, що свідчить, що значення густини виходить розподілом числа, що представляє населення, на число, що представляє площу.
Введемо предикатщільність(Х, Y), де X - це країна, a Y - щільність населення в цій країні, і запишемо відповідне правило на Пролозі:
густина(X,Y):-нас(Х,Р), площа(Х,А), Y is Р/А.
Це правило читається так:
Щільність населення країни X є числом Y, якщо:
Населення X-це Р, і Площа X-це A, і Y обчислюється розподілом Р на A.
У правилі використовується оператор розподілу '/' введений у попередньому розділі.Операція поділу виконується насправді як цілий поділ, що зберігає тільки цілу частину результату.
Новим тут є інфіксний оператор'is'. Його правий аргумент – терм, який інтерпретується як арифметичний вираз. Щоб виконати'is', Пролог спочатку обчислює його правий аргумент відповідно до правил арифметики. Результат обчислень перевіряється на відповідність до лівих аргументів, щоб визначити, чи доведено цільове затвердження. У наведеному вище прикладі зміннаY до виконанняis не конкретизована, і вона залишається в такому стані до обчислення виразу. Коли вираз обчислено,Y набуває значення, що дорівнює отриманій величині. Це означає, що мають бути відомі значення всіх змінних, що знаходяться праворуч відis.
Повернемося, наприклад, із середньою щільністю населення. Неважко бачити, що типові питання та відповіді на них виглядають наступним чином:
Х=89 у першому питанні є відповідь Пролог-системи, що означає 89 чоловік на квадратний кілометр. Другий запит не здійснимо, оскільки в базі даних нашого прикладу неможливо знайти відомості про населення Туреччини.
Набір допустимих арифметичних операцій залежить від використовуваної ЕОМ. Однак усі Пролог-системи забезпечують виконання наступних операцій: