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

7.2. Увід-вивід списків

Для введення списків використовують універсальний предикат: readterm(тип списку, Змінна).

Розглянемо приклад вводу списку.

Domains

list1=char*

Predicates

do (list1)

Goal

readterm (list1, L), do(L).

Clauses

do (L):- write(“Список ”,L).

Вводиться список: [‘5’, ‘1’, ‘3’]

Вивід списку виконують стандартним предикатом write:

Список [‘5’, ‘1’, ‘3’]

7.3. Основна операція на списках

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

Для відсіку голови списку, його подають у вигляді структури:

[H | T], де подовжена двокрапка “|” - основна операція на списку.

Відсік голови списку застосовують у двох випадках:

  • При співставленні предикатів;

  • При співставленні списків.

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

Завдання: Ввести список. Вивести на екран голову і хвіст списку.

Domains

sp= real*

Predicates

prnt (sp)

Goal

readterm (sp, L), prnt (L).

Clauses

prnt ([H | T]):- write(H), nl, write (T).

Введемо список: [3, 5, 7, 9]. При співставленні змінної L, яка конкретизована введеним списком , і структури в голові правила, список поділяється на голову Н=3 і хвіст Т=[5, 7, 9].

Вивід: 3

[5, 7, 9]

Співставлення списків може виконуватися предикатом „=”.

Розглянемо завдання: Ввести список. Вивести на екран голову і хвіст списку.

Domains

Sp= real*

Goal

Readterm (sp, L), L = [H | T], write (H,’ ‘, T).

Введемо список [7]. При співставленні змінної L, яка конкретизована введеним списком , і структури в голові правила, список поділяється на голову Н=7 і хвіст Т=[].

Вивід: 7

[]

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

  • Змінна L конкретизована, а змінні Н та L вільні.

Тоді операція L=[H|T], працює на відсікання голови в списку.

Приклад1: do:- L = [1,2,3], L = [H|T], write (H), nl, write (T).

Вивід: Н= 1, Т=[2, 3].

Приклад2: do:- L=[ ], L = [H|T].

Порожній список не можна поділити на голову і хвіст. Операція повертає fail.

Приклад3: do:- L = [[1],[2],[3]], L = [H|T], write (H), nl, write (T).

Вивід: Н= [1], Т=[[2], [3]].

У прикладі подано список списків. Тому елемент списку також список.

  • Змінні Н і Т конкретизовані: H=2, T=[3, 5], а L вільна змінна. Тоді операція L = [H|T], приєднує елемент Н до початку Т.

Приклад: do : - H=2, T = [3, 5], L = [H | T], write (L).

Вивід: [2, 3, 5].

  • Операція „|” може працювати на порівняння конкретизованої змінної Н та голови списку. При вірному порівняні вільна змінна Т конкретизується хвостом списку.

Приклад1: do : - L=[1, 2, 3], H=1, L=[H | T], write (Т).

Значення змінної Н дорівнює голові списку. Змінна Т одержує значенням хвіст списку. Вивід: [2, 3].

Приклад2: do : - L=[1, 2, 3], H=2, L=[H | T].

Значення змінної Н не дорівнює голові списку. Предикат повертає fail.

  • Операція „|” може працювати на порівняння конкретизованої змінної Т та хвоста списку. При вірному порівняні вільна змінна Н конкретизується головою списку.

Приклад1: do : - L=[1, 2, 3], Т=[2, 3], L=[H | T], write (Н).

Значення змінної Т список [2, 3] дорівнює хвосту списку. Змінна Н одержує голову списку. Вивід: 1.

Приклад2: do : - L=[1, 2, 3], Т=[1, 3], L=[H | T].

Значення змінної Т список [1, 3] не дорівнює хвосту списку. Предикат повертає fail.

  • Операція „|” може працювати на з’ясування чи складається список з вказаних частин. При вірному порівняні операція повертає TRUE.

Приклад: do : - L=[1, 2, 3], H=1, T=[2, 3], L=[H | T].

У списку можна виділити відразу 2, 3 голови, а хвіст завжди один

Приклад: do : - L = [1, 2, 3, 4], L = [H1, H2 | T],

write (H1,’ ‘,H2,’ ‘,T).

Вивід: 1 2 [3, 4].