изначений таким чином фрейм називається функціональним. br/>
36. Мова Prolog. Подання списків
Список - це послідовність, складена з довільного числа елементів, наприклад, енн, теніс, тому, лижі. На Пролозі це записується так
[енн, теніс, тому, лижі]
Однак таке лише зовнішнє уявлення списку. Як ми вже бачили, всі структурні об'єкти Прологу - це дерева. Списки не є виключенням з цього правила. p align="justify"> Яким чином можна представити список у вигляді стандартного прологовского об'єкта? Ми повинні розглянути два випадки: порожній список і не порожній список. У першому випадку список записується як атом []. У другому випадку список слід розглядати як структуру, що складається з двох частин:
1) перший елемент, званий головою списку;
2) інша частина списку, звана хвостом.
Наприклад, для списку
[енн, теніс, тому, лижі]
енн - це голова, а хвостом є список
[теніс, тому, лижі]
У загальному випадку, головою може бути що завгодно (будь прологовскій об'єкт, наприклад, дерево або змінна); хвіст же повинен бути списком. Голова з'єднується з хвостом за допомогою спеці ального функтора. Вибір цього функтора залежить від конкретної реалізації Прологу; ми будемо вважати, що це точка:
. (Голова, Хвіст)
Оскільки Хвіст - це список, він або порожній, або має свої власні голову і хвіст. Таким чином, обраного способу подання списків достатньо для подання списків будь-якої довжини. Наш список представляється наступним чином:
. (енн,. (теніс,. (тому,. (лижі, []))))
На наступному малюнку зображено відповідна деревоподібна структура.
В
Зауважимо, що показаний приклад містить порожній список []. Справа в тому, що самий останній хвіст є Одноелементний списком:
[лижі]
Хвіст цього списку порожній
[лижі] =. (лижі, [])
Розглянутий приклад показує. Як загальний принцип структуризації об'єктів даних можна застосувати до списків будь-якої довжини. З нашого прикладу також видно, що такий примітивний спосіб представлення у випадку великої глибини укладення піделементи в хвостовій частині списку може призвести до досить заплутаним виразами. Ось чому в Пролозі передбачається більш лаконічний спосіб зображення списків, при якому вони записуються як послідовності елементів, укладені в квадратні дужки. Програміст може використовувати обидва способи, але уявлення з квадратними дужками, звичайно в більшості випадків користується перевагою. Ми, однак, завжди будемо пам'ятати, що це всього лише косметичне поліпшення і що у внутрішньому поданні наші списки виглядають як дерева. При виведенні ж вони автоматично перетворюються в більш лаконічну форму представлення. Так, наприклад, можливий наступний діалог:
? - список1 = [a, b, c],
список2 = (а,. (b,. (c, [])))
список1 = [a, b, c],
список2 = [a, b, c]
? - Увлеченія1 =. (теніс,. (музика, [])),
Увлеченія2 = [лижі, їжа]
L = [енн, Увлеченія2, тому, Увлеченія2].
Увлеченія1 = [теніс, музика]
Увлеченія2 = [лижі, їжа]
L = [енн, [теніс, музика], тому, [лижі, їжа]]
Наведений приклад нагадує нам про те, що елементами списку можуть бути будь-які об `єкти, зокрема теж списки.
На практиці часто буває зручним трактувати хвіст списку як самостійний об'єкт. Наприклад, нехай
= [a, b, c]
Тоді можна написати:
Хвіст = [b, c] і L =. (a, Хвіст)
Для того, щоб виразити це за допомогою квадратних дужок, в Пролозі передбачено ще одне розширення нотації для подання списку, а саме вертикальна риса, яка відокремлює голову від хвоста.
L = [a | Хвіст]
Насправді вертикальна риса має більш загальний сенс: ми можемо перерахувати будь-яку кількість елементів списку, потім поставити символ В«|В», а після цього - список інших елементів. Так, тільки що розглянутий приклад можна представити наступними різними способами:
[a, b, c] = [a, | [b, c]] = [a, b, | [c]] = [a, b, c | []] p>
Підсумуємо:
В· Список - це структура даних, ...