Логическое программирование

Содержание

Слайд 2

Обо мне Майкрософт Россия, академический евангелист Кандидат физ.-мат. наук Распределенные интеллектуальные

Обо мне

Майкрософт Россия, академический евангелист
Кандидат физ.-мат. наук
Распределенные интеллектуальные системы с явным

представлением знаний
Интеллектуальная реструктуризация социальных сетей на основе онтологий
Семантически-ориентированые системы (Semantic Wiki)
Кафедра Вычислительной математики и программирования МАИ (доцент)
Логическое программирование
Искусственный интеллект
Студенческая лаборатория MAILabs (www.mailabs.ru)
ФИВТ

http://blogs.gotdotnet.ru/personal/sos

Слайд 3

Лекция 1 Что такое логическое программирование?

Лекция 1

Что такое логическое программирование?

Слайд 4

Мечта человечества

Мечта человечества

Слайд 5

Возможно ли это? Тест Тьюринга – подробнее в курсе ИИ Проблемы:

Возможно ли это?

Тест Тьюринга – подробнее в курсе ИИ
Проблемы:
Неоднозначность человеческого языка
При

коммуникации мы полагаемся на картину мира, которая есть у нас в голове (common knowledge)
Слайд 6

Потенциальный способ реализации  Формальный язык

Потенциальный способ реализации


Формальный язык

Слайд 7

Какие языки программирования вы знаете? Assembler (x86, …) C, C++, C#,

Какие языки программирования вы знаете?

Assembler (x86, …)
C, C++, C#, Java
Pascal

Brainfuck?
FORTH?
LISP, FP,

ML, Haskell, OCaml, F#, …
Prolog, Mercury, Datalog, …
Слайд 8

Языки программирования

Языки программирования

Слайд 9

Программирование вчера и сегодня

Программирование вчера и сегодня

Слайд 10

Обратимся к истории Первый язык программирования высокого уровня – ФОРТРАН –

Обратимся к истории

Первый язык программирования высокого уровня – ФОРТРАН – был

создан Дж.Бэкусом, чтобы математики могли программировать на уровне формул.

• программирование переключателей

• машинные коды

• язык ассемблера

• FORTRAN

1954-57 г., Дж.Бэкус

0000 0A 12 1F 4B C3 E0 EE F1
0008 C3 1D 23 17 F2 00 0C 0D
0010 …

MOV AX, [ARG1]
ADD AX, [ARG2]
MOV [RES], AX
JMP NEXT
ARG1: DB 10
ARG2: DB 20
RES: DB 0
NEXT: …

S = 0
DO 10 I=1,10
S = S + I*I
10 CONTINUE

Слайд 11

Программирования для математиков Позже Дж.Бэкус пошел дальше и предложил язык FP,

Программирования для математиков

Позже Дж.Бэкус пошел дальше и предложил язык FP, в

котором формулы более соответствовали математическому понятию функции

• программирование переключателей

• машинные коды

• язык ассемблера

• FORTRAN

1977 г., Дж.Бэкус

def fac = eq 0 → 1;
*○[id,fac○(-○ [id,1])]

(defun factorial (n)
(if (<= n 1) 1
(* n (factorial (- n 1)))))

1950

1960

1970

1980

1990

2000

2010

♦ FP

♦ LISP

1958 г., Дж.Маккарти

Слайд 12

Что делать, чтобы приблизиться к человеческому языку? Надо пытаться формализовать человеческий

Что делать, чтобы приблизиться к человеческому языку?

Надо пытаться формализовать человеческий язык!
Основной

инструмент формализации:
Формальные аксиоматические системы
Логика!
Слайд 13

Языки логического программирования • программирование переключателей • машинные коды • язык

Языки логического программирования

• программирование переключателей

• машинные коды

• язык ассемблера

• FORTRAN

1950

1960

1970

1980

1990

2000

2010

♦ FP

LISP

• С, Pascal

○ С++

○ Java

○ C#

♦ Haskell

♥ Prolog

♥ Mercury

♦ F#

♦ OCaml

♦ ML

♦ Miranda

○ Python

?

?

♥ Datalog

♥ Oz

Слайд 14

Как это выглядит на практике? Вычисление факториала: function fact(x:integer):integer; var i,

Как это выглядит на практике?

Вычисление факториала:

function fact(x:integer):integer;
var i, r : integer;
begin

r:=1;
for i:=1 to x do r:=r*i;
fact:=r
end;

Императивное программирование
(Pascal)

Слайд 15

Декларативное программирование При декларативном программировании мы (на некотором формальном языке) описываем

Декларативное программирование

При декларативном программировании мы (на некотором формальном языке) описываем результат

(его свойства), а не способ его достижения
Описание факториала
HTML – описание расположения объектов
SQL
LINQ
Функциональные, логические языки
Слайд 16

Императивное программирование Императивное – мы говорим компьютеру, как решать задачу (что

Императивное программирование

Императивное – мы говорим компьютеру, как решать задачу (что делать)
Основной

акцент – манипулирование ячейками памяти
Оператор присваивания
Явные операторы передачи управления
Циклы, условный оператор
Слайд 17

Декларативный стиль Это не «чистая» императивная программа. В «чистых» императивных языках

Декларативный стиль

Это не «чистая» императивная программа.
В «чистых» императивных языках (ФОРТРАН) нет

рекурсии
Нет операторов присваивания
«:= » -это возврат результата из функции, а не присваивание

function fact(x:integer):integer;
begin
if x=1 then fact:=1
else fact:=x*fact(x-1)
end;

Слайд 18

Логическое программирование Парадигма декларативного программирования, в которой программа представляет собой описание

Логическое программирование

Парадигма декларативного программирования, в которой
программа представляет собой описание требуемого решения

в терминах определенной логики
решение задачи строится в процессе логического вывода по заданному описанию
Различные разновидности логического программирования: индуктивное, в ограничениях, ...
Подход к программированию
Языки программирования Prolog, Datalog, Mercury, Oz, …
Слайд 19

С практической стороны: Найдем все комбинации чисел от 1 до 10,

С практической стороны:

Найдем все комбинации чисел от 1 до 10,

что a2+b2=c2

for a:=1 to 10 do
for b:=1 to 10 do
for c:=1 to 10 do
if a*a+b*b=c*c then
write(a,b,c);;

[ for a in 1..10
for b in 1..10
for c in 1..10
when a*a+b*b=c*c ->
(a,b,c)
];;

solve(A,B,C) :-
for(A,1,10),
for(B,1,10),
for(C,1,10),
A*A+B*B =:= C*C.

zip3 [1..10] [1..10] [1..10] |>
filter (
fun (a,b,c)->a*a+b*b=c*c );;

Слайд 20

Практические преимущества Функциональные языки Компактный синтаксис для списков, n-ок (tuples), вариантных

Практические преимущества

Функциональные языки
Компактный синтаксис для списков, n-ок (tuples), вариантных типов
Логические языки
Компактный

синтаксис для списков, n-ок (tuples), вариантных типов
Возможность перебора и поиска различных решений, заложенная в язык
Слайд 21

Ещё пример studied(petya,mathematics). studied(vasya,german). studied(petya,compscience). studied(vasya,literature). studied(petya,english). studied_technical(X) :- studied(X,mathematics). studied_technical(X)

Ещё пример

studied(petya,mathematics). studied(vasya,german).
studied(petya,compscience). studied(vasya,literature).
studied(petya,english).
studied_technical(X) :- studied(X,mathematics).
studied_technical(X) :- studied(X,compscience). studied_languages(X) :- studied(X,english).
studied_languages(X) :- studied(X,german).
speciality(X,tech_translator)

:- studied_languages(X),studied_technical(X).
speciality(X,programmer) :-
studied(X,mathematics),studied(X, compscience).
speciality(X,lit_translator) :- studied_languages(X),studied(X,literature).
?-specialty(vasya,X).
?- specialty(X,lit_translator).
Слайд 22

Что особенного? Определения на логическом языке похожи на предложения математической логики

Что особенного?

Определения на логическом языке похожи на предложения математической логики
Логическое программирование

имеет очень четкую математическую основу
Возможны рассуждения о программах: доказательство корректности, …
Отсутствует оператор присваивания
Есть знак = , но он имеет другую семантику – унификация, связывание имен
Переменные связываются неявно, в процессе логического вывода
Будучи один раз связанным, имя может менять свое значение только в процессе пересмотра решения (возврата)
А это значит – нет побочных эффектов!
Слайд 23

Парадигмы программирования

Парадигмы программирования

Слайд 24

Парадигмы программирования

Парадигмы программирования

Слайд 25

Семантика языков

Семантика языков

Слайд 26

Мультипарадигмальные языки C# - императивный (ОО) + элементы функциональности F# -

Мультипарадигмальные языки

C# - императивный (ОО) + элементы функциональности
F# - функциональный с

элементами императивности
Mercury – функционально-логический
Oz
Python

Слайд 27

Почему важно изучать логическое программирование?

Почему важно изучать логическое программирование?

Слайд 28

Главный вопрос Придется ли нам программировать на Прологе в реальной жизни?

Главный вопрос

Придется ли нам программировать на Прологе в реальной жизни?

В лучшем

случае – 1 человеку из группы

Пролог удобен при быстром прототипировании определенного класса систем
Принципы, заложенные в основу логического программирования, помогут при решении реальных задач

Слайд 29

Какие задачи хорошо решаются на логических языках? Задачи искусственного интеллекта Экспертные

Какие задачи хорошо решаются на логических языках?

Задачи искусственного интеллекта
Экспертные системы
Лингвистика, обработка

естественного языка
Задачи с неопределенностью
Задачи, связанные с поиском решений
Мета-программирование, построение специализированных языков