- •Пролог тіліне жалпы шолу
- •Бағдарлама мысалы: туыстық қатынастар
- •1.2. Ережелер көмегімен мысал – бағдарламаны кеңейту
- •1.3. Ереженің рекурсивті анықтамасы
- •2. Пролог – бағдарламаның синтаксисі және семантикасы
- •2.1. Айнымалылар
- •2.2. Құрылымдар
- •2.3. Салыстырулар
- •2.5. Фактілер мен ережелер
- •2.6. Бағдарламаның орындалуы алгоритмі
- •2.7. Пролог – бағдарламаның декларативті мағынасы (мәні)
- •2.8. Пролог – бағдарламаның құрылымы
- •Рекурсивті есептеулер. Арифметикалық өрнектер
- •3.1. Есептеулерді басқару
- •Рекурсивті есептеулер
- •Арифметикалық өрнектер
- •Тізімдер. Стандартты предикаттар
- •4.1. Тізімдер
- •4.2. Тізімдермен операциялар жүргізу
- •1. Операция: тізімге қатыстылығы (мүшелігі).
- •Операция: жалғастыру (конкатенация).
- •4.3. Стандартты предикаттар
- •Тапсырма 2
- •Қорытынды
- •Әдебиеттер
- •3. Язык Пролог в задачах и примрах
- •3.1. Программирование с помощью фактов и правил
- •3.1.2. Первая формулировка задачи поиска в пространстве состояний 51 ад
- •3.1.3. Реализация на Прологе простой вопросно-ответной системы
- •3.2. Рекурсии
- •Упражнения
- •3.3. Программирование циклических процессов
- •3.4. Работа со списками
- •3.4.1. Описание списков в программе
- •3.4.11. Примеры использования списков
- •Упражнения
- •3.5. Виды рекурсии
- •3.6. Поиск в пространстве состояний
- •Упражнения
- •3.6.0 Использование структур
- •Упражнения
- •3.7. Динамическая база данных
- •3.7.1. Использование стандартных предикатов динамической базы данных
- •Упражнения
- •3.8. Средства управления
- •3.9. Представление множеств двоичными деревьями
- •3.9. Программы классификации
- •3.9.1. Программа классификации с обратной цепочкой рассуждений
- •3.9.2. Программы классификации с прямой цепочкой рассуждений.
- •3.9. Обработка текстов
- •Упражнения
- •3.10. Примеры
3.4.11. Примеры использования списков
Программирование
рекурсивных предикатов работы со
списками как основными структурами
данных представляет собой увлекательное
занятие.
Пролог идеально подходит
для решения различного рода математических
ребусов и головоломок, требующих
перебора. При этом пространство состояний
удобно представлять в виде списков, из
которого можно «черпать» элементы.
Рассмотрим одну такую головоломку.
Т
ребуется
расставить в кружочках числа от 1 до 25
таким образом, чтобы каждая сумма по
каждой диагонали была равна 25 и сумма
вершин треугольника тоже бы равнялась
25. Разным буквам должны соответствовать
разные числа, иначе возможно тривиальное
решение.
Список
чисел, из которого будут конкретизироваться
переменные, определим как факт cifr.
Введем отношение summa,
аргументами которого будут семь
переменных, которые предстоит
конкретизировать с выполнением заданных
условий. В программе действия по
конкретизации переменных выполняет
предикат удаления элемента из списка away.
Это трехаргументное отношение, в котором
в нашем примере конкретизирован второй
аргумент – список доступных чисел.
Предикат конкретизирует число из этого
списка и возвращает третий аргумент –
список без удаленного числа. Путем
последовательных удалений будут
конкретизированы все числа.
Полная
программа для решения головоломки
приводится ниже.
Domains
i
= integer
ILIST=
i *
predicates
summa(
i, i, i, i, i, i, i, ILST )
away(
i, ILIST, ILIST )
cifr(
ILIST
)
clauses
cifr([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]).
% Столько чисел хватит
summa(
A, B, C, D, E, F, G, CIF ) :-
away(
A, CIF, CIF1 ),
away(
B, CIF1, CIF2 ),
away(
C, CIF2, CIF3 ),
away(
D, CIF3, CIF4 ),
away(
E, CIF4, CIF5 ),
away(
F, CIF5, CIF6 ),
away(
G, CIF6, _ ),
A
+ G + D = 25,
B
+ G + E = 25,
C
+ G + F = 25,
A
+ C + E = 25.
away(
A, [ A | L ], L ).
away(
A, [ B | L ], [ B | L1 ] ):-
away(
A, L, L1 ).
goal
cifr( CIF ),
% Переменная CIF конкретизируется списком
чисел
summa(
A, B, C, D, E, F, G, CIF ), write( A, B, C, D, E, F, G ).
В
данном случае у нас найдено только одно
решение. Для получения всех решений
следует включить бэктрекинг (см.
«Организация циклов»).
Упражнения
1. Стандартный предикат вывода write выводит список «в строку». Запишите рекурсивный предикат вывода списка на экран а) «в столбец»; в) в виде таблицы по пять элементов в строке. 2. Список целых чисел иногда удобно представить в виде диаграммы. Пусть процедура diagramma выводит список в такой форме: Goal diagramma( [ 3, 4, 6, 5 ] ).
* * * * * * * * * * * * * * * * * * Определите рекурсивную процедуру diagramma. Указание. Для вывода заданного количества звездочек в строке используйте рекурсивный цикл со счетчиком. 2. Выборка упорядоченных пар из двух списков. Определим отношение much с четырьмя аргументами: much( X1, X2, L1, L2 ). Аргументы X1, X2 - это элементы соответственно списков L1 и L2, стоящие в своих списках в одной и той же позиции. Списки L1 и L2 одинаковой длины. 3. Упражнения на конкатенации. 103 Бр Определить отношение «последний» без использования конкатенации. Определите отношение «сдвиг» с использованием конкатенации 110 Бр 4. Список может представлять собой множество. Над списками выполняются такие операции как добавление, удаление, пересечение, разность, равенство. Выясните, какие предикаты из рассмотренных ранее могут представлять операции над списками. Допишите необходимые предикаты.
