Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
3КСМ1 Бойко. ЛБ 8 ЛП.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
116.74 Кб
Скачать

10

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

ХЕРСОНСЬКИЙ НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ

Кафедра інформаційних технологій

ЗВІТ З ЛАБОРАТОРНОЇ РОБОТИ 8

з дисципліни „Логічне програмування”

студента третього курсу денної форми навчання

напряму підготовки 6.050102 “Комп’ютерна інженерія”

з професійною орієнтацією Компютерні системи та мережі

галузі знань 0501 “Інформатика та обчислювальна техніка”

факультету кібернетики

Бойко Тараса

Дата проведення лабораторної роботи:

«23» жовтня 2012р.

Дата подання звіту за графіком:

«30» жовтня 2012р.

Дата подання звіту студентом:

____________________

Підпис студента:

____________________

Позначка викладача про результати та дату перевірки звіту:

____________________

Відомості про викладача, що виконував перевірку звіту (прізвище, ініціали, посада, науковий ступінь, вчене звання):

Веселовська Г.В., доцент кафедри інформаційних технологій ХНТУ, к.т.н., доцент

Підпис викладача, що виконував перевірку звіту :

_____________________

Херсон – 2012р.

Лабораторна робота 8

Тема: Робота зі списками в процесі логічного програмування мовою Пролог. Частина 1.

Мета: набуття знань, умінь і навичок створення та рекурсивної обробки списків у логічних програмах, створених засобами мови Пролог.

1. План виконання лабораторної роботи

1. Вивчити основні теоретичні відомості до лабораторної роботи.

2. Ознайомитися з методичними вказівками для самостійної роботи студентів до лабораторної роботи 8.

3. Дати відповіді на контрольні питання.

4. Виконати завдання для самоперевірки.

5. Виконати контрольні завдання.

6. Оформити та захистити звіт з лабораторної роботи (вимоги до оформлення та захисту лабораторної роботи знаходяться в Додатку А, а зразок оформлення титульного аркуша звіту про виконання лабораторної роботи знаходиться в Додатку Б).

2. Основні теоретичні відомості

2.1. Базові технології Прологу, призначені для створення та рекурсивної обробки списків

Список являє собою об'єкт, який містить кінцеву кількість інших об'єктів.

Список у Пролозі дещо подібний до масивів в інших мовах програмування, але не вимагає попереднього оголошення його розмірності.

Згідно з синтаксисом Прологу, список беруть у квадратні дужки, а елементи списку розділяють комами.

Список, який не містить елементів, називається порожнім списком.

Типові приклади списків, оформлених згідно з синтаксисом Прологу, наведено в таблиці 8.1.

Таблиця 8.1

Типові приклади списків у Пролозі

з/п

Приклади списків

Пояснення до наведених прикладів списків

1

[ ]

порожній список

2

[1, 2, 3]

список, елементами якого є цілі числа

3

[one, two, three]

список, елементами якого є символи

4

["One", "Two", "Three"]

список, елементами якого є рядки

Для роботи зі списками в Пролозі не передбачено окремого стандартного домену.

Для того, щоб працювати зі списком, необхідно оголосити нестандартний списочний домен згідно з наступною схемою:

DOMAINS

listdomain = elementdomain*

elementdomain = …

У наведеному вище прикладі застосовано наступні позначення:

listdomain є довільно вибраним ім'ям нестандартного списочного домену;

elementdomain є ім'ям того домену, до якого належать елементи списку;

зірочка (*) після імені домену elementdomain позначає дію оголошення списку, що складається з елементів указаного домену elementdomain.

При роботі зі списками, не можна включати до списку такі елементи, що належать різним доменам.

У даному випадку, необхідно скористатися складеним доменом.

Наведемо далі приклад оголошення трьох простих спискових доменів (intlist, symlist, strlist) та одного складеного спискового домену (mixlist):

DOMAINS

% елементи списку intlist – цілі числа

intlist = integer*

% елементи списку symlist – символи

symlist = symbol*

% елементи списку strlist – рядки символів

strlist = string*

% елементи списку mixlist – або цілі числа, або символи, або рядки

mixlist = mixdomain*

mixdomain = int(integer); sym(symbol); str(string)

Зверніть увагу на те, що, при оголошенні складеного домену mixdomain, було додатково використано три функтори (з іменами int, sym, str).

Даний штучний підхід було застосовано через те, що оголошення виду mixdomain = integer; symbol; string призвело би до помилки.

Список є об'єктом рекурсивного типу, що складається з двох частин:

голова списку (початок списку), що являє собою перший елемент списку;

хвіст списку (продовження, завершення списку), що являє собою новий список, який поєднує всі ті елементи початкового списку, що слідують за головою.

Наочні приклади голів і хвостів списків наведено в таблиці 8.2.

Таблиця 8.2

Типові приклади голів і хвостів списків у Пролозі

з/п

Початковий список

Голова списку

Хвіст списку

1

[ ]

порожній список не можна розділити на голову та хвіст

2

[1]

1

[ ]

3

[1, 2]

1

[2]

4

[1, 2, 3]

1

[2, 3]

У Пролозі використовується спеціальний символ для розділу списку на голову та хвіст вертикальна риска " |".

Наочні приклади варіантів розділу списків на голову та хвіст за допомогою спеціального символу вертикальної риски " |" наведено в таблиці 8.3.

Таблиця 8.3

Типові приклади варіантів розділу списків на голову та хвіст

за допомогою спеціального символу вертикальної риски " |" у Пролозі

з/п

Початковий список

Приклади розділу списку за допомогою

спеціального символу вертикальної риски " |"

1

[1]

[1 | [ ]]

2

[1, 2, 3]

[1 | [2, 3]]

[1 | [2| [3]]]

[1 | [2 | [3 | [ ]]]]

Спеціальний символ вертикальної риски " |" можна використовувати для відокремлення не тільки голови списку, а й довільної кількості початкових елементів списку.

Наприклад, від початкового списку [1, 2, 3] за допомогою вертикальної риски можна відокремити наступні елементи:

– [1 | [2, 3]];

– [1, 2 | [3]];

– [1, 2, 3 | [ ]].

Наочні приклади здійснення співставлення та уніфікації в списках у Пролозі наведено в таблиці 8.4.

Таблиця 8.4

Типові приклади співставлення та уніфікації в списках у Пролозі

з/п

Початкові дані для співставлення та уніфікації в списках

Результати співставлення

та уніфікації в списках

1

[1, 2, 3] = [Elem1, Elem2, Elem3]

Elem1 = 1, Elem2 = 2, Elem3 = 3

2

[1, 2, 3] = [Elem1, Elem2, Elem3 | T]

Elem1 = 1, Elem2 = 2, Elem3 = 3,

T = [ ]

3

[1, 2, 3] = [Head | Tail]

Head = 1, Tail= [2, 3]

4

[1, 2, 3] = [Elem1, Elem2 | T]

Elem1 = 1, Elem2 = 2, T = [3]

5

[1, 2, 3] = [4 | T]

помилка

6

[ ] = [H | T]

помилка

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

Основна ідея методу рекурсивної обробки списків полягає в наведених нижче діях.

На першому етапі, необхідно:

– відокремити від списку голову;

– виконати по відношенню до отриманої голови списку потрібні дії;

– перейти до роботи з хвостом списку, що являє собою, в свою чергу, самостійний список.

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

Відповідно, предикати для роботи зі списками повинні передбачати, як мінімум, два речення: 1) для порожнього списку; 2) для непорожнього списку.

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