Концепции языков программирования Лекция 10. Логическое программирование mailto:

реклама
Концепции языков
программирования
Лекция 10. Логическое программирование
Глухих Михаил Игоревич, к.т.н., доц.
mailto: [email protected]
Беляев Михаил Анатольевич, асп.
Парадигма
Входит в декларативную группу
Основывается на построении
логических выводов из заданных в
программе фактов
Концепции языков
программирования
2
Плюсы и минусы
(+) не нужно описывать алгоритм
решения задачи
(+) программы легко читаются
(-) низкая производительность
(-) трудно понять принцип работы
построителя выводов
Концепции языков
программирования
3
Основы логики
Логика высказываний
переменные
конъюнкция (И), дизъюнкция (ИЛИ),
импликация (=>), отрицание (НЕ)
Логика первого порядка
предикаты с аргументами
кванторы "любой", "существует"
Логика высших порядков
аргумент предиката – другой предикат
Концепции языков
программирования
4
Известные правила вывода
Modus Ponens (логика
высказываний):
A ⇒ B, A
B
Генерализация
A
∀x : A
Концепции языков
программирования
5
SAT и SMT
Satisfiability Modulo Theories – поиск
существования решения для
формулы логики первого порядка с
равенством (+ доп. семантика)
boolean SATisfiability – поиск
существования решения для
формулы логики высказываний
Концепции языков
программирования
6
Существующие языки
язык Prolog (PROgramming in LOGic)
подмножество логики первого порядка
язык SMT-решателей SMT Lib
логика первого порядка с
дополнительной семантикой
языки верификаторов (HOL,
Isabelle, PVS, ...)
логика высших порядков
Концепции языков
программирования
7
Область применения Пролога
Системы верификации
Экспертные системы
Системы построения расписаний
Базы знаний
Системы принятия решений
В некоторых странах – первый
изучаемый язык программирования
Концепции языков
программирования
8
Реальные программы на
Прологе
Подход малопопулярен в
промышленном программировании,
индекс Tiobe 0.35%
http://drdobbs.com/highperformance-computing/184405220
системы предсказания погоды
Boeing (язык запросов)
http://www.amzi.com/
Концепции языков
программирования
9
Некоторые реализации
Пролога
GNU Prolog
tuProlog, jProlog (Java API)
Visual Prolog (Prolog Development
Center) – объектноориентированное расширение
Amzi! Prolog
Концепции языков
программирования
10
Элементы программы на
Пролог
Множество фраз, где фраза
факт (предикат)
p(x1, x2, ..., xn).
p – отношение,
x1, ..., xn – аргументы (термы)
отношение истинно при данных аргументах
правило (фраза Хорна, дизъюнкт Хорна)
q(...) :- p1(...), p2(...), ..., pn(...).
если p1, p2, ..., pn истинны, то q истинно
p – подцели правила, q – цель правила
Концепции языков
программирования
11
Классический пример
mother_child(trude, sally).
father_child(tom, sally).
father_child(tom, erica).
father_child(mike, tom).
/* Брат/сестра */
sibling(X, Y) :parent_child(Z, X), parent_child(Z, Y).
parent_child(X, Y) :- father_child(X, Y).
parent_child(X, Y) :- mother_child(X, Y).
Концепции языков
программирования
12
Запросы Пролога
Есть программа, описывающая некоторую
базу знаний
К ней можно направлять запросы
?- p(y1, ..., yn)
p – одно из отношений программы,
y1, ..., yn – термы программы
интерпретатор определяет, верен ли
данный предикат для данной базы знаний
Пример
?- sibling(sally, erica)
Концепции языков
программирования
13
Типы Пролога
Константы
числа (целые, вещественные)
атомы (с маленькой буквы, или в одинарных
кавычках)
Переменная (с большой буквы или _)
вместо переменной можно подставить любую
константу
если в запросе – интерпретатор попытается
найти все возможные значения
_ тоже переменная, но без имени
Предикат (атом с аргументами)
Концепции языков
программирования
14
Квантификация переменных в
правил
Для переменных в левой части
(цель) используется квантор
"любой"
Для переменных только в правой
части (подцели) используется
квантор "существует"
Концепции языков
программирования
15
Пример
journey(amtrak, new_york, boston, train).
journey(nj_transit, new_york, prinstone, train).
journey(amtrak, boston, portland, train).
journey(greyhound, boston, portland, bus).
journey(amtrak, new_york, washington, train).
journey(peoples, new_york, washington, plane).
journey(peoples, birlington, new_york, plane).
% Comp1, Comp2 – любые, CityA, CityB - существуют
opponent(Comp1, Comp2) :- journey(Comp1, CityA, CityB, _),
journey(Comp2, CityA, CityB, _).
% Хвостовая рекурсия
connected(CityA, CityC) :- journey(_, CityA, CityB, _),
connected(CityB, CityC).
Концепции языков
программирования
16
Операции в Прологе
, (запятая) – логическое И
; (точка с запятой) – логическое ИЛИ
И приоритетнее ИЛИ
= равно (переменные соответствуют одному
атому, переменная соответствует данному
атому)
\= не равно (переменные соответствуют
разным атомам)
is поставить атом в соответствие переменной
Концепции языков
программирования
17
Арифметика
+ - * / mod
< > >= =<
% Пример на след. слайде
Концепции языков
программирования
18
Списки
% [alpha, beta, gamma]
% [alpha, beta | Tail]
% Пример
way(CityA, [], CityB) :journey(_, CityA, CityB, _).
way(CityA, [CityB | Tail], CityC, CostF) :journey(_, CityA, CityB, _, CostJ),
way(CityB, Tail, CityC, CostW),
CostF is CostJ + CostW.
Концепции языков
программирования
19
Другие примеры на списки
elem(X, [X | Tail]).
elem(X, [Y | Tail]) :- elem(X, Tail).
len([], 0).
len([X | Tail], N) :- len(Tail, N1), N is N1+1.
join([], List, List).
join([X | Tail1], List2, [X | Tail3]) :join(Tail1, List2, Tail3).
Концепции языков
программирования
20
Скачать