русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

ПРИСОЕДИНЕНИЕ СПИСКА


Дата добавления: 2014-09-29; просмотров: 872; Нарушение авторских прав


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

В качестве примера рассмотрим две переменные,L1 и L2, представляющие списки. Переменные имеют значения [1,2,3] и [4,5]. Назовем их входными списками. Предикат, присоединящий L2 к L1 и создающий выходной список L3, назовем concat.

Весь процесс можно представить себе в виде такой совокупности действий:

1. Список L3 вначале пуст.

2. Элементы списка L1 пересылаются в L3, теперь значением L3 будет [1,2,3].

3. Элементы списка L2 пересылаются в L3, в результате чего тот принимает значение [1,2,3,4,5].

Структура правила для выполнения этих действий достаточна проста:

concat([],L,L).

concat([N|L1],L2,[N|L3]) :-

concat(L1,L2,L3).

Поясним теперь, как будет функционировать это правило, если на вход подать списки L1=[1,2,3] и L2=[4,5]. Сначала Турбо-Пролог пытается удовлетворить первый вариант правила: concat([],L,L). Для того чтобы удовлетворить это правило, первый объект предиката concat нужно сделать пустым списком. Вначале же предикат concat имеет форму

concat([1,2,3],[4,5],L3)

Отметим, что третий, выходной список в этой форме пока еще не определен. Внутренний процесс унификации Турбо-Пролога, пытаясь удовлетворить второе правило concat, раскручивает цепочку рекурсий до тех пор, пока не обнуляет первый список.

ЭЛЕМЕНТЫ ПЕРВОГО СПИСКА ПРИ ЭТОМ ПОСЛЕДОВАТЕЛЬНО ПЕРЕСЫЛАЮТСЯ В СТЕК. Стек, логическая структура данных в памяти компьютера, обеспечивает временное хранение этих элементов.

Когда первый объект предиката concat окажется пустым списком, становится возможным применение первого варианта правила. Третий список при этом означивается вторым.

Такой процесс можно пояснить при помощи двух состояний concat, до и после применения первого варианта правила:



concat([],[4,5],_)

concat([],[4,5],[4,5])

В данный момент процедуры унификации Турбо-Пролога полностью удовлетворили это правило, и Турбо-Пролог начинает сворачивать рекурсивные вызовы второго правила:

concat([N|L1], L2, [N|L3]) :-

concat(L1,L2,L3).

Извлекаемые при этом из стека элементы помещаются один за другим в качестве головы к первому и третьему спискам.

Следует особо отметить, что элементы излекаются в обратном порядке (это стек!), и что значение извлеченного из стека элемента присваивается переменной N одновременно в [N|L1] и [N|L3]. Шаги данного процесса можно представить так:

concat([],[4,5],[4,5])

concat([3],[4,5],[3,4,5])

concat([2,3],[4,5],[2,3,4,5])

concat([1,2,3],[4,5],[1,2,3,4,5])

Присвоение элементов стека происходит рекурсивно до тех пор, пока стек не будет пуст. В результате список L3 будет содержать элеметы обоих входных списков — [1,2,3,4,5].

Программа 6.4 «Присоединение списка» демонстрирует применение данного метода. Внешней целью для программы может служить ранее разобранный пример:

concat([1,2,3],[4,5],L)

/* Программа 6.4 «Присоединение списка». */

/* Назначение: слияние двух списков. */

domains

 

list = integer *

 

predicates

 

concat(list,list,list)

 

clauses

 

concat([],L,L).

concat([N|L1], L2, [N|L3]) :-

concat(L1,L2,L3).

/* Конец программы */



<== предыдущая лекция | следующая лекция ==>
ПОИСК ЭЛЕМЕНТА В СПИСКЕ | ПОДСПИСОК


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.038 сек.