Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PROLOG.DOC
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
502.27 Кб
Скачать

5.8.Порівняння складних об`єктів.

Складні об'єкти повинні зрівнюватись на еквівалентність з предикатами, визначеними програмістом, подібно до предикату are_equal із наступної програми:

domains

d = pair(integer, integer) ;

single(integer) ;

none

predicates

are_equal(d, d)

clauses

are_equal(X, X).

Задамо ціль goal: are_equal(5,4). Бачимо помилку в визначенні домену. Для фіксації проблеми додамо опис:

are_equal(integer, integer).

5.9.Узагальнення.

1.Програма Прологу може містити наступну множину типів даних: простий або складний, стандартний або визначений користувачем.

2.Складні структури даних дозволяють об`єднувать окремі частини інформації в один об`єкт. Він складається з імені (функтора) і одного або більше аргументів.

3.Функтор Прологу не відповідає функціям традиційних мов програмування типу Паскаль. Він не викликає ніякої дії.

4.Складна структура даних може уніфікуватись з простою змінною, або з складним об`єктом, який має відповідну структуру. Знак “=“ використовується для уніфікації складних об`єктів.

Вправи.

5.1. Виберіть деяку форму задання бази даних, в якій містяться повідомлення про операції з кредитними карточками. Кожний запис повинен мати інформацію про прізвище особи, яка тратить гроші, про тип операції і кількість грошей. Напишіть програму, яка буде видавати значення кінцевої суми всіх операцій для конкретної особи.

5.2. Нехай нам потрібно створити базу даних про сім`ї, яка б дозволяла оперувати з наступною інформацією. Кожна сім`я складається з трьох компонент: чоловік, дружина і діти. Оскільки кількість дітей в різних сім`ях може бути різною, тому бажано їх задавати у вигляді списку, який складається з довільної кількості елементів. Кожного члена сім`ї в свою чергу можна задати структурою, яка складається з чотирьох компонент: ім`я, прізвище, дата народження і місце роботи. Інформація про роботу може бути такою - це або “не працює”, або вказівка на місце роботи і заробітної плати.

Напишіть терм, який би дозволяв:

а)посилатись на всіх Іванових;

б)посилатись на всі сім`ї, які мають трьох дітей.

Побудуйте запит:

а)який би дозволяв знаходити всіх заміжніх жінок, які мають не менше трьох дітей.

Побудуйте набір предикатів, який би дозволив використати наступні запити до бази даних:

а)знайти всіх людей із бази даних;

b)знайти всіх дітей, які народились в 1990 році;

с)знайти всіх дружин, які працюють;

g)знайти людей, які народились до 1960 року;

е)знайти загальний заробіток кожної сім`ї.

6. Ітерація і рекурсія.

6.1.Реалізація ітераційного процесу за допомогою бектрекінгу.

В цьому розділі ми розглянемо спочатку організацію циклічної обробки, а потім рекурсивні структури даних.

Пролог допускає тільки два типи повторних дій: бектрекінг і рекурсію. В програмі, зображеній на мал.6.1, показано використання бектрекінгу для реалізації циклу. На поставлений запит будуть друкуватись всі можливі рішення.

predicates

country(symbol)

print_countries

clauses

country(england).

country(france).

country(germany).

country(denmark).

print_countries :- country(X),

write(X), /* write the value of X */

nl, /* start a new line */

fail.

print_countries.

мал.6.1.

Перша фраза говорить: "Знаходячи розв'язок предикату cuntry(x), надрукувати країну Х і перейти на нову стрічку.” Потім викликається предикат fail. В цьому випадку fail позначає наступне: якщо розв'язок поставленої цілі ще може бути знайдений, тоді повернутись і пошукати альтернативний розв'язок.

Вмонтований предикат fail завжди має хибне значення, але ми могли б форсувати бектрекінг, використавши якийсь інший, завжди хибний предикат типу 10 = 3 + 4, або country(abracadabra) .

Таким чином, будуть надруковані всі країни і процес обробки системою першої фрази закінчиться. Після, почнеться обробка другої фрази того ж предикату print-countries. Вона нічого не робить, а тільки завершає успіхом роботу системи. Кінцеве виведення буде мати вигляд:

england

france

germany

denmark Yes

Якби не було другої фрази, виведення закінчувалось - No, а все інше виведення залишилось без змін.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]