- •Оглавление
- •Логическое программирование. Язык Prolog.
- •1. Предикаты Пример 1.1. Максимум из двух чисел
- •Пример 5.2. Вычисление факториала
- •6. Хвостовая рекурсия Пример 6.1. Вычиление факториала с с использованием хвостовой рекурсии
- •Пример 6.2. Вычисление чисел Фибоначчи
- •Пример 7.4. Обращение списка
- •Пример 7.5. Среднее арифметическое элементов списка.
- •7. Обработка списков Пример 7.1. Вычисление длины списка
- •Пример 7.2. Проверка принадлежности элемента списку
- •Пример 7.3. Соединение двух списков
- •8. Сортировка списков Пример 8.1. Пузырьковая сортировка
- •Пример 8.2. Сортировка вставкой
- •Пример 8.3. Сортировка выбором
- •9. Строки
- •Пример 9.3. Преобразование строки в список символов
- •Пример 9.4. Подсчет кол-ва вхождений заданного символа в строку
- •Пример 9.6. Замена заданного символа в строке – на другой
- •Пример 9.7. Удаление части строки
- •Пример 9.8. Копирование части строки
- •Пример 9.9. Вставка одной строки внутрь другой
- •10. Множества Пример 10.1. Превращение произвольного списка в множество
- •Пример 10.2. Операция объединения двух множеств.
- •Пример 10.3. Пересечение множеств
- •Пример 10.4. Разность множеств
- •Пример 10.5. Проверка, является ли одно множество подмножеством другого.
- •Пример 10.6. Предикат, реализующий отношение равенства двух множеств.
- •Пример 10.7. Определение собственного подмножества множества
- •Пример 10.8. Симметричная разность
- •Пример 10.9. Дополнение множества
- •11. Деревья Пример 11.1. Принадлежность элемента дереву
- •Пример 11.2. Замена заданного значения на другое в дереве
- •Пример 11.3. Подсчет общего количества вершин дерева
- •Пример 11.4. Подсчет количества листьев (узлов без сыновей)
- •Пример 11.5. Подсчет суммы чисел в вершинах дерева
- •Пример 11.6. Предикат, вычисляющий высоту дерева
- •Пример 11.7. Проверка принадлежности значения двоичному справочнику .
- •Пример 11.8. Добавление элемента в двоичный справочник
- •Пример 11.9. Генератор случайного двоичного справочника из чисел
- •Пример 11.10. Удаление заданного значения из двоичного справочника
- •Пример 11.11. Преобразование произвольного списка в двоичный справочник
- •Пример 11.12. Предикат, сворачивающий заданный двоичный справочник в список
- •12. Базы знаний Пример 12.1. Вычисление чисел Фибоначчи с запоминанием результатов
- •13. Логические задачи (головоломки) Пример 13.1. Перестановка кубиков
- •Пример 13.2. Ханойский башни
- •Пример 13.3. Волк, коза и капуста
- •Пример 13.4. Побег из Зурга
Логическое программирование. Язык Prolog.
1. Предикаты Пример 1.1. Максимум из двух чисел
Давайте создадим предикат, который будет находить максимум из двух чисел. У предиката будет три аргумента. Первые два аргумента - входные для исходных чисел, в третий выходной аргумент будет помещен максимум из первых двух аргументов.
Предикат будет довольно простым. Мы запишем, что в случае, если первое число больше второго, максимальным будет первое число, в случае, если первое число меньше, максимумом будет второе число. Надо также не забыть про ситуацию, когда числа равны, в этом случае максимумом будет любое из них.
Решение можно записать в следующем виде:
max(X,Y,X):-
X>Y. /* если первое число больше второго,
то первое число - максимум */
max(X,Y,Y):-
X<Y. /* если первое число меньше второго,
то второе число - максимум */
max(X,Y,Y):-
X is Y. /* если первое число равно второму,
возьмем в качестве максимума
второе число */
Последнее предложение можно объединить со вторым или третьим в одно предложение. Тогда процедура будет состоять не из трех предложений, а всего из двух:
max(X,Y,X):-
X>Y. /* если первое число больше второго,
то первое число - максимум */
max(X,Y,Y):-
X<=Y./* если первое число меньше или равно
второму, возьмем в качестве максимума
второе число */
?- max(1,2,X).
X = 2
2. Отсечения
Пример 2.1. Максимум из двух чисел, вычисления с отсечениями
Оптимизируем ф-ю поиска максимума из двух чисел с помощью отсечений.
max2(X,Y,X):-
X>Y,!./* если первое число больше второго, то первое число - максимум */
max2(_,Y,Y). /* в противном случае максимумом будет второе число */
?- max2(1,2,X).
X = 2
3. Ветвления
Пример 3.1. Реализация ветвления
С помощью отсечения в Прологе можно смоделировать такую конструкцию императивных языков, как ветвление.
:-op(1160, fx, if).
:-op(1150, xfx, then).
:-op(1155, xfx, else).
if A then B else C :- A, B; not(A), C.
max(X,Y,Z) :- if X>Y then Z is X else Z is Y.
?- max2(1,2,X).
X = 2
4. Операторы
Пример 4.1. Определение условных операторов
Зададим условные операторы и запишем с их помощью определение прдиката max
:-op(1160, fx, if).
:-op(1150, xfx, then).
:-op(1155, xfx, else).
if A then B else C :- A, B; not(A), C.
max(X,Y,Z) :- if X>Y then Z is X else Z is Y.
5. Рекурсия
Пример 5.1. Рекурсивное определение отношения «Предок»
Предположим, что в базе знаний есть набор фактов, описывающий родственные связи людей через отношение "быть родителем". Предикат родитель имеет два аргумента. В качестве его первого аргумента указывается имя родителя, в качестве второго - имя ребенка. Мы хотим создать отношение "быть предком", используя предикат родитель. Для того чтобы один человек был предком другого человека, нужно, чтобы он либо был его родителем, либо являлся родителем другого его предка.
/* предком является родитель */
ancestor(X, Y):- parent(X, Y).
/* предком является родитель предка */
ancestor(X, Y):- parent(X, Z), ancestor(Z, Y).
