Концепции языков программирования Лекция 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