Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекц по Visual Prolog.doc
Скачиваний:
4
Добавлен:
02.05.2019
Размер:
937.47 Кб
Скачать

7.4. Формування списків стандартним предикатом

Предикат Findall(Змінна, Факт, Список)

Предикат findall розглядає групу певних фактів. Вибирає значення вказаного аргументу для кожного факту і формує з цих значень список.

Аргумент „Факт” задає які факти розглядати. Аргумент „Змінна” вказує на аргумент факту, значення якого вибирається. Аргумент „Список” одержує сформований список.

Наприклад.

Завдання: Сформувати список прізвищ пасажирів літаку, у яких відсутній багаж.

Predicates

Do

Bag(string, integer, real)

Goal

Do.

Clauses

Bag(“Кузенко”,10,10.0).

Bag(“Крот”,0,0.0).

Bag(“Михайлов”,12,6.4).

Bag(“Грач”,0,0.0).

Do:- findall(F, bag(F,0,_), L), write(L).

7.5. СПИСКИ І МНОЖИНИ

Множини можна подавати списками. При роботі з такими списками треба пам’ятати:

1 В множині немає елементів, що повторюються.

2 Для множини не важливий порядок елементів.

7.6. ПРОЦЕДУРИ РОБОТИ ЗІ СПИСКАМИ

Список рекурсивний об’єкт, тому що хвіст списку теж список. Такі структури зручно оброблювати рекурсивними процедурами.

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

Розглянемо список [3, 1, 5, 11]. Розділимо список на голову і хвіст. Хвіст списку в свою чергу теж список. Його теж можна розділити на голову і хвіст. Процес можна повторювати до тих пір, поки список не стане порожнім.

[3, 1, 5, 11]

3 [1, 5, 11]

1 [5, 11]

5 [ 11]

11 []

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

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

Domains

Lst = integer*

Predicates

Do (lst)

Goal

Do([3, 1, 5, 11]).

Clauses

Do ([]).

Do ([H|T]):-do (T), write (H).

При зіставленні цілі Do([3, 1, 5, 11]) з секції Goal з умовним твердженням Do ([H|T]) змінна Н конкретизується 3, а Т=[1, 5, 11] і значення змінних зберігаються у стеку. Далі процедура Do викликається з хвостом списку – Т = [1, 5, 11]. Процес зображено у вигляді дерева, що подано вище і закінчується узгодженням цілі do (T) з фактом, коли список стане порожнім.

Тобто ціль do (T) стає істинною і може бути виконана наступна процедура write. Процедура write виводить верхній елемент стеку, який є останнім елемент списку. Після виводу елементу він вилучається зі стеку і верхнім елементом стеку стає другий з кінця списку. Тобто елементи списку будуть виводитися в зворотному порядку.

Стандартні рекурсивні процедури

Нижче подано стандартні рекурсивні процедури, відомі з літератури. Але Visual Prolog їх не знає, тому для використання їх треба визначати в програмі.

Процедура „Належить”

Процедура перевіряє чи входить елемент у список:

Domains

list = integer*

Predicates

in (integer, list)

Goal

readterm (list, L)

readint (N), in (N, L),

write (“Входить ”, N,” в ” L);

write (“Не входить ”).

Clauses

in (H, [H | _] ).

in (X, [_ | T] ): - in (X, T).

Граничною умовою рекурсивної процедури є факт: елемент знайдено.

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

Процедура “ Приєднати (pr) ”

Процедура працює в трьох режимах залежно від завдання цілі: