ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ ПРОЛОГ Курс лекций

Двойка? Нет!

Графика
Начертательная геометрия
Практикум по решению задач
Конспект лекций черчение
Геометрическое черчение
Перспектива
ЕСКД - констр. документация
Инженерная графика
Элементарная математика
Кратные интегралы
Математический анализ
Векторный анализ
Аналитическая геометрия
Производная и диф. уравнения
Математика 2 курс
Функции и их графики
Математический анализ
Производные и дифференциалы
ТФКП
Физика
Физические законы механики
Электричество. Магнетизм
Колебания. Волны
Ядерная физика Лекции
Атомная и ядерная физика
Электричество, электростатика
Магнетизм, индукция
Оптика волновая квантовая
Основы физики и ТОЭ
Электромагнитное
взаимодействие
Физика оптика
Молекулярная физика
Информатика
Архитектура ЭВМ
Пролог програмирование
Лекции Пролог
Учебник PHP
Информационные технологии
Web технологии
Интернет
Web безопасность
GPRS
Компьютерные сети
Локальные сети
Основы вычислит. систем
Вычислительные комплексы
Операционные системы
Windows 2000
Windows server 2003
Java учебник
Примеры Java
Базы данных
Язык PHP
Функции PHP A-C D-F
G-I J-M N-O P-R S-T U-Z
TurboPascal
ТКМ

Электротех. материалы

Лекции ТКМ

Электротехника
Общая электротехника
Электротехника
ТОЭ
Атомная энергетика
Реактор РБМК
Реактор ВВЭР
Реактор БН-600
Атомные станции
Юбилей Энергетики
Ядерное оружие
Готовые работы
Оформить заказ
Дипломные, курсовые
Купить контрольную
Контрольные, расчетные
Рефераты
Лабораторные работы
Курсовые расчеты
 
Лекция 6.


Рекурсивные структуры данных
Списки.
Список - это один из самых простых и полезных типов структур, широко используемых в нечисловом программировании.
Список - это последовательность, составленная из произвольного числа элементов одного типа.
["a", "b", "c", "d", "e"]
["a", "b", "c", | T]

[T] - список из 1-го элемента.
[_| T] - список как минимум из одного элемента.

Списки можно применять для представления множеств, хотя между ними есть отличия:
1. порядок элементов в списке существенен
2. элементы списка могут сколько угодно раз повторяться

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

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

найти_слово(Слово, []):-write(Слово), write("Не найдено слово"), nl, !.
найти_слово(Слово, [Слово|_]):- !.
найти_слово(Слово, [_|T]):- найти_слово(Слово, T).

Goal: найти_слово("утро", ["вечер", "день", "утро"])
yes

Goal: найти_слово(X, ["вечер", "день", "утро"])
X=вечер
Х=день
Х=утро
Х=[]
4 Solutions
Это без отсечения, а если с отсечением то Х=вечер

найти_номер([H|T], 1, H).
найти_номер([H|T], N, X):- найти_номер(T, M, X), N=M+1.

Goal: найти_номер(["a", "b", "c", "d"], X, "c")
X=3
Здесь появится сообщение "нажмите F10" потому что T явно не используется в первом правиле, как этого избежать?
найти_номер([H|_], 1, H).
найти_номер([_|T], N, X):- найти_номер(T, M, X), N=M+1.

Построение списков из фактов - findall/
служащий(имя, фамилия, должность, оклад)
сумма([], 0).
Сумма([X, R], итог):- сумма(R, сумма), Итог=Х + сумма.

Goal: findall(Оклад, служащий(_, _, _, Оклад), Список), Сумма(Список, Итог).

Findall(Переменная, Атом, Список).
Иногда бывает полезно представлять в виде списка информацию, содержащуюся в известных фактах.
В Прологе для этой цели служит предикат findall, здесь Атом - это отношение, которое определяет список элементов, конкретизирующих переменную в качестве аргумента предиката атом.
Выше описан пример поиска общей суммы окладов служащих, записанных в БД.

Ввод элементов с клавиатуры.
ввод(Y):-write("Введите элемент"), nl, readln(C), ввод(С, Y).
ввод(".", []):-!.
ввод(C, [C|Y]):-readln(C1), ввод(C1, Y).

Goal: ввод(X)
[ a | y ]
[ a | [ b | y ] ]
[ a | [ b | [ c | y ] ] ]
[ a | [ b | [ c | [ d | y ] ] ] ]


Бинарные деревья

Это двоичный рекурсивный тип данных, который определяет как имеющий левое поддерево, корень и правое поддерево.


дерево(3, дерево(1, nil, nil), дерево(2, nil, nil))

дерево(d, дерево(c, дерево(a, nil, nil)), дерево(b, nil, nil)), дерево(f, nil, nil)).

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

domains
x = integer
y = tree(x, y, y); nil
predicates
бин_дерево(у)
clauses
бин_дерево(tree(X, L, R)):-readint(X), X<>0, бин_дерево(L), бин_дерево(R), !.
бин_дерево(nil):-!.

Goal: бин_дерево(Х).


Поиск элемента в упорядоченном дереве.

Упорядоченным деревом называется дерево, в котором элемент правого поддерева больше корня, а элемент левого поддерева меньше корня.

прин_дереву(X, дерево(X, L, R)):-!.
прин_дереву(X, дерево(Y, L, R)):-X>Y, прин_дереву(X, R),!.
прин_дереву(X, дерево(Y, L, _)):-прин_дереву(X, L).


Способы представления БД в Пролог программах.

В Прологе существует 5 основных способов представления БД:
1. Множество фактов, каждое из которых соответствует целостному информационному элементу.
2. Множество фактов, представленных в виде совокупности значений, атрибут.
3. Список структур, каждый элемент в котором соответствует целостному информационному элементу.
4. Линейная рекурсивная структура.
5. Рекурсивная структура в виде двоичного дерева.

БД о семьях:
1. семья(фам, имя_папы, имя_мамы, реб1, реб2, реб3)
2. папа_дети(фам, имя_папы, реб1, реб2, реб3)
мама_дети(фам, имя_мамы, реб1, реб2, реб3)
семья(Х):-папа_дети(Х, _, N1, N2, N3), мама_дети(Х, _, N1, N2, N3).


Физика лабы
Элементарная математика Кратные интегралы Математический анализ
Векторный анализ Аналитическая геометрия Пределы функции Изучение функции Конспекты по математике Комплексные числа Дифференциальные уравнения Определенные интегралы Лекции по высшей математике Исследование функций Вычисление объема с помощью интегралов Алгеброические структуры