Главная

ПРОЕКТ "ЧЕЛОВЕК. ЗЕМЛЯ. ВСЕЛЕННАЯ"

Инструменты пользователя

Инструменты сайта


project:prolog:listing:prisoedinenie_spiskov



Программа «Присоединение списков»

Программа «Присоединение списков» - демонстрация присоединения одного списка к другому.

/*Среда - EZY Prolog
Программа «Присоединение (слияние) списков». */
 
domains
/* домен списков, состоящие из целых чисел */
n_list = integer *
 
predicates
/* Списки:
L1, L2 - исходные списки, которые сливаются
L3 - итоговый список */
append(n_list,n_list,n_list)
 
clauses
/* Процесс присоединения: 
 
1. Cписок L3 вначале пуст.
2. Элементы списка L1 пересылаются в L3, теперь значением L3 будет [1,2,3].
3. Элементы списка L2 пересылаются в L3, в результате чего тот принимает значение [1,2,3,4,5].
 
Чтобы удовлетворить 1-е правило (ниже), первый объект предиката append нужно сделать пустым списком.
Вначале же предикат append имеет форму append([1,2,3],[4,5],_).
Третий, выходной список в этой форме пока еще не определен.
*/
append([],L,L) :- write("Первое правило: L: ", L), nl.
 
/* Внутренний процесс унификации Пролога, пытаясь удовлетворить второе правило append, раскручивает цепочку рекурсий до тех пор, пока не обнуляет первый список.
Элементы списка при этом последовательно пересылаются в стек.
 */
append([N|L1], L2, [N|L3]) :- append(L1,L2,L3), write("N: ", N, " , L1: ", L1, ", L2: ", L2, ", L3: ", L3), nl.
 
/*
Когда первый объект предиката append окажется пустым списком, становится возможным применение 1-го правила.
Третий список при этом инициализируется вторым.
 
Состояния append, до и после применения 1-го правила:
 
  append([],[4,5],_).
  append([],[4,5],[4,5]).
 
В этот момент процедуры унификации Пролога полностью удовлетворили это правило, и Пролог начинает сворачивать рекурсивные вызовы 2-го правила.
Извлекаемые при этом из стека элементы помещаются один за другим в качестве головы к первому и третьему спискам.
Элементы из стека излекаются в обратном порядке.
Значение извлеченного из стека элемента присваивается переменной N одновременно в [N|L1] и [N|L3].
 
Шаги данного процесса можно представить так:
 
  append([],[4,5],[4,5])
  append([3],[4,5],[3,4,5])
  append([2,3],[4,5],[2,3,4,5])
  append([1,2,3],[4,5],[1,2,3,4,5])
 
Присвоение элементов стека происходит рекурсивно до тех пор, пока стек не будет исчерпан.
В результате список L3 будет содержать элеметы обоих входных списков - [1,2,3,4,5].
*/
goal
/* Внешние цели -
append([1,2,3],[4,5],L).*/

Результат:

Первое правило: L: [4,5]
N: 3 , L1: [], L2: [4,5], L3: [4,5]
N: 2 , L1: [3], L2: [4,5], L3: [3,4,5]
N: 1 , L1: [2,3], L2: [4,5], L3: [2,3,4,5]
L=1,2,3,4,5

!!Рекомендуем: ОбучениеСемейная Энциклопедия ЗдоровьяКонсультация аналитикаОглавлениеГлавная сайта

Обсуждение

Ваш комментарий:
W Q P᠎ X W
 
project/prolog/listing/prisoedinenie_spiskov.txt · Последние изменения: 2013/03/10 20:30 (внешнее изменение)

Вы можете оставить свои комментарии в разделе "Обсуждение".
Рекомендуем оформить подписку на новости данного раздела. Для этого нажмите на кнопку "Подписаться", расположенную справа снизу каждой страницы (знак конверта).


www.work-zilla.com

Индекс цитирования