- Философия, эзотерика:
- Религии:
- Познавательное
(обо всём)
Программа «Присоединение списков» - демонстрация присоединения одного списка к другому.
/*Среда - 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
!!Рекомендуем: Что должен знать современный человек? ⇒ Семейная Энциклопедия Здоровья ⇒ Самоанализ. Работа над собой ⇒ Оглавление ⇒ Главная сайта
Обсуждение