- •Основные Элементы ТурбоПролога.
- •Структуры Пролога, разделы программы
- •Способы объявления предикатов в программе Пролог
- •Объявление предикатов
- •Утверждения и правила. Факты и правила.
- •Раздел goal
- •Этапы программирвоания на тп
- •Декларативный и процедурный смысл программы
- •Сопоставление
- •Арифметика в тп
- •Арифметические функции в тп
- •Рекурсия
- •Рекурсия и эффективность
- •Стандартные предикаты
- •Стандартные предикаты ввода-вывода
- •Отсечение
- •Отрицание (not)
- •Использование составных объектов
- •Списки. Описание. Голова и хвост списка.
- •Стандартные предикаты для работы со строками Определение длины строки
- •Конкатенация строк
- •Разделение строки на две части
- •Описание файловых доменов
- •Запись в файл
- •Чтение из файла
- •Дозапись в конец существующего файла
- •Создание меню с помощью окон Определение окна
- •Быстрое переключение между двумя окнами
- •Очистка текущего окна
- •Удаление текущего окна
- •Создание динамических баз данных. Статические и динамические базы данных
- •Способы занесения информации в динамическую базу данных
- •Предикаты для работы с базами данных
Отсечение
В процессе достижения цели Пролог-система осуществляет автоматический перебор вариантов, делая возврат при неуспехе какого-либо из них. Такой перебор – полезный программе механизм, так как он освобождает пользователя от необходимости производить этот перебор самому. С другой стороны ничем не ограниченный перебор может быть источником неэффективности программы. Поэтому требуется его ограничить или исключить вовсе. Для этого предусмотрено специальное целевое утверждение «!,», называемое отсечением. Отсечение реализуетяс следующим образом: после согласования ЦУ, стоящего перед отсечением, все предположения с тем же предикатомрасположенные после отсечения не рассматриваются. предположим, что надо вычислить число родителей кого-нибудь.
число_родителей (адам, 0):-,!
число_родителей (ева, 0):-,!
число_родителей (_, 2).
Можно выделить три основных функци отсечения:
Для устранения бесполезного цикла ( вычисление суммы 1+2+…+N)
сумма (1, 1):-,!
сумма (N, K):- N1=N-1, сумма (N1, K1), K=K1+N.
Если граничное условие будет записано в виде сумма (1, 1). , то сопоставление головы правила с запросом будет происходить успешно и при n=0, то есть будет предпринята попытка доказать цель сумма (0, К), что в свою очередь приводит к цели сумма (-1, К) и т.д.
При программировании взаимоисключающих утверждений.
max (X, Y, Max)
max (X, Y, X):- X>=Y.
max (X, Y, Y).
Или
max (X, Y, X):- X>=Y,!
max (_, Y, Y).
При необходимости неудачного завершения цели.
категория (Кр, _):- Кр>100,!, fail; Кр<0, !, fail.
категория (Кр, ‘A’):- Кр>80, !
категория (Кр, ‘В’):- Кр>40, !
категория (Кр, ‘С’).
Отрицание (not)
Встроенный предикат not имеет один аргумен. Этим аргументом являетяс отношение, значение истинности которого (после обработки этого отношения) заменяется на противоположное.
Использование составных объектов
Объекты утверждений представляют собой данные. Тип простых данных ограничен 6-ю стандартными типами.
любит (петр, музыка)
Оба объекта петр, музыка имеют простую структуру, они представляют самих себя. Любой объект представляющий сам себя называетяс простым объектом. Структура, состоящая из простых объектов, называетяс простой. Объект, представляющий другой объект или совокупность объектов, называется составным объектом, а использующая такие объекты структура, называетяс составной структурой.
Пример:
любит (том, яблоки, апельсины, бананы).
Все 3 вида фруктов можно объединить в одной структуре:
фрукты (яблоки, апельсины, бананы).
В результате появится составной объект, который поясняет отношение:
любит (том, фрукты (яблоки, апельсины, бананы)).
Функтор составного объекта фрукты является предметом, хотя он и выставлен внутри другого предиката. Главным функтором здесь является предикат любит.
domains
любимые_фрукты = фрукты (тип1, тип2, тип3)
имя, тип1, тип2, тип3 = symbol
predicates
любит (имя, любимые_фрукты)
Это одноуровневый составной объект.
Списки. Описание. Голова и хвост списка.
Список – специальный вид сложного терма, состоящий из последовательности термов, заключенных в [ ] и разделенных запятыми.
domains
list = integer* % целочисленный список
Если элементы списка имеют смешанный тип, то должно быть соответствующее описание:
domains
element = c (char); i (integer)
list = element*
[c(‘a’), i(6), i(-8), c(‘X’)]
Списки являются основной структурой программы на ТП. Для удобства обработки введены два понятия: голова (head), хвост (tail).
Основные примеры обработки списков:
Список |
Голова |
Хвост |
[‘a’, ‘b’, ‘c’] |
‘a’ |
[‘b’, ‘c’] |
[1] |
1 |
[ ] |
[ ] |
не определена |
не определена |
[[1, 2, 3], [2, 3, 4], [ ]] |
[1, 2, 3] |
[[2, 3, 4], [ ]] |
Для отделения головы спсика от хвоста используется символ “|” [X|Y].
Сцепление двух спиcков.
concat ([ ], L, L).
concat ([H|T], L2, [H|T3]):- concat (T, L2, T3).
Добавление элемента Х к началу списка L
add (X, L, [X|L]
в конец
add_end (X, L, L1)
add_end (X, [ ], [X]).
add_end (X, [H|T], [H|T1]):- add_end (X, T, T1).
обращение списка
domains
l =real*
predicates
revers (l, l)
reversl (l, l, l)
clauses
revers (L, Lr):- reversl (L, [ ], Lr).
reversl ([ ], Lr, Lr).
reversl ([H|T], L, Lr):- reversl (T, [H|L], Lr).
Правило ввода списка(3 варианта), вывод списка.