Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Voprosy_k_ekzamenu_po_FLP_SP21_22.doc
Скачиваний:
13
Добавлен:
15.03.2015
Размер:
330.75 Кб
Скачать

Определение

Список- это бинарная структура данных, представляющая собой логически связанную последовательность записей - элементов списка.

Эта структура либо пуста, либо состоит из двух частей – головы и хвоста.

Хвост в свою очередь является списком.

Голова – обычная переменная. Выделив из списка голову, можно ее обрабатывать как и любую другую переменную. Все элементы списка обладают общим свойством: в Прологе это свойство трактуется как отношение, определяющее связь между элементами списка или между списком в целом и элементом, внешним по отношению к списку. Все элементы списка заключаются в [] и отделяются друг от друга запятыми:

[ann, peter, jim, tom] , [2,5.7.8]

В Прологе список – это последовательность, состоящая из любого количества элементов. Известно, что все структурированные объекты Пролога – это деревья. Списки не являются исключением из этого правила:

[3,7,10]

/ \

3 [7,10]

/ \

7 [10]

/ \

10 []

Рис.6.1.Двоичное дерево списка

Замечание

Конечно, объединить объекты в один можно различными способами. Если число объектов заранее известно,

то можно сделать эти объекты аргументами одной составной структуры данных. Если число объектов не определено, то можно использовать рекурсивную составную структуру данных, такую, как дерево, но наиболее легко и удобно работать со списками.

Список помогает сделать программу компактной, эффектив-

ной и легко управляемой. Списки широко используются в программах искусственного интеллекта, при разработке трансляторов программных языков, в реализации методов управления памятью.

Это базовые структуры функциональных языков. С помощью списков можно представить практически любые сложные структуры.

Порядок расположения элементов является отличительной чертой списка: те же элементы, упорядоченные иным способом, представляют собой уже совсем другой список. Порядок важен в процессе сопоставления. Объекты cписка называются элементами списка. Единственное ограничение на их число – объем оперативной памяти.

Все элементы списка принадлежат одному и тому же типу доменов. (Исключением являются списки структур. Структура может принадлежать альтернативному домену, и тогда элементы списка могут иметь разный тип).

Как представить список в виде стандартного объекта Пролога?

Список – это рекурсивный составной объект, поэтому

мы рассматриваем два случая – пустой список и непустой список.

Непустой список следует рассматривать как структуру, состоящую из двух частей - головы и хвоста, при этом хвост тоже список, который либо пуст, либо имеет свою голову и хвост.

Одноэлементный список [a]- не то же самое, что элемент, который в него входит, так как [a] –на самом деле – это составная структура данных:

list

/ \

a []

Список в Прологе рассматривается как частный случай двоичного дерева.

При построении списков необходимо наличие константного символа, чтобы рекурсия не была бесконечной. Таким символом является символ [], обозначающий пустой список.

Требуется также функтор арности два [X|Y],где X и Y-компоненты терма, имеющие специальные названия: X – голова(car),а Y-хвост (cdr) списка.

Определение списка

list([]).

list([Head|Tail]):-

list(Tail).

Например, список [a,b,c] – это терм [H|T] при подстановке H=a и T=[b,c].

list([a,b,c])

|

list([b,c])

|

list([c])

|

list([])

Рис 6.2.Дерево вывода при проверке списка

  1. Предикты Пролога для работы с файлами.

  2. Инженерия знаний с использованием исчисления предикатов1 порядка. Какие этапы включают в себя проекты в области инженерии знаний?

  3. Удаление элемента из списка. Предикат delete. Доказательство его обратимости.

Листинг 6.1.7. Удаление элемента из списка

domains

list=integer*

predicates

delete(integer,list,list)

clauses

(1) delete(X,[X|Tail],Tail).

(2) delete(X,[Y|Tail],[Y|Tail1]):-

delete(X,Tail,Tail1).

(1) Если X – голова списка, то результат –хвост этого списка.

(2) Если X – в хвосте, то его надо удалить оттуда.

Отношение delete по своей природе – недетерминировано и обратимо.

Цели:

? delete(5,[1,8,5,7,5],L)

Ответ L=[1,8,7,5] -удаление первой 5

L=[1,8,5,7] –удаление последней 5

Если в списке содержится несколько вхождений элемента X, то delete может исключить их все при помощи возврата и дать нам различные варианты удалений, каждый раз удаляя лишь одно вхождение X.Остальные вхождения остаются в неприкосновенности (недетерминированность). При попытке исключить элемент, отсутствующий в списке, отношение delete потерпит неудачу

? delete(5,L,[1,8,7]) – используем для вставки элемента (обратимость)

Ответ L=[5,1,8,7]

L=[1,5,8,7]

L=[1,8,5,7]

L=[1,8,7,5] 4Solution

Отношение delete – обратимое, его можно использовать в обратном направлении для того, чтобы добавить элементы в список, вставляя их в произвольные места списка. Для этого зададим вопрос:”Каким должен быть список L,чтобы после удаления из него элемента “5” получить список [1,8,7] ”?

Отношение delete можно использовать для проверки на принадлежность списку.

Идея:X принадлежит списку, если этот X можно из списка удалить:

member(X,List):-

delete(X,List,_).

Delete можно использовать для построения всех возможных перестановок списка .Для этого надо включить отношение change с двумя аргументами

Листинг 6.1.8 Перестанова элементов списка с помощью удаления

domains

list=integer*

predicates

delete(integer,list,list)

change(list,list)

clauses

delete(X,[X|Tail],Tail).

delete(X,[Y|Tail],[Y|Tail1]):-

delete(X,Tail,Tail1).

change([],[]).

change(L,[X|P]):-

delete(X,L,L1),

change(L1,P).

? (change([3,5,6],L)---L=[3,5,6] L=[3,6,5] L=[5,3,6] L=[5,6,3]

L=[6,3,5] L=6,5,3] 6 Solutions

Но надо быть осторожным ( при change(L,[3,5,6])—произойдет зацикливание)

  1. Семантические модели Пролога. – декларативная, процедурная и абстрактная. Что определяет каждая из этих моделей?

  2. Компиляция в системах логического вывода. Для чего служит промежуточный язык WAM?

  • Наборы команд современных компьютеров плохо согласуются с семантикой Пролога, поэтому большинство компиляторов Пролога компилируют программу в промежуточный язык, а не непосредственно в коды машины.

  • Таким промежуточным языком является язык WAM (Warren Adstract Machine – абстрактная машина Уоррена)

Другие компиляторы транслируют программу в Lisp или С.

  1. В каких случаях предпочтительнее использовать язык Пролог? Где его конкурентноспособность не ниже, а иногда и выше языка Си?

  • Современные компиляторы достигли высоких скоростей обработки кода Пролог, способных конкурировать с языком С в самых различных эталонных тестах..Ясно, что Пролог становится более подходящим языком, чем С для создания прототипов большинства исследовательских проектов в области ИИ небольших масштабов

  1. Цели и подцели в Прологе.

  2. Детерминированные и недетерминированные вызовы

  3. Робототехнические языки программирования