Редактирование: Парадигмы программирования, 07 лекция (от 05 ноября)

Материал из eSyr's wiki.

Перейти к: навигация, поиск

Внимание: Вы не представились системе. Ваш IP-адрес будет записан в историю изменений этой страницы.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.

Текущая версия Ваш текст
Строка 1: Строка 1:
-
* '''Аудиозапись:''' http://esyr.org/lections/audio/paradigms_2009_winter/avst_prolog.ogg, http://esyr.org/lections/audio/paradigms_2009_winter/paradigms_09_11_05.ogg
 
- 
parent(john, mary).
parent(john, mary).
parent(john, george)
parent(john, george)
Строка 21: Строка 19:
brother(X, Y): sex(male, X), parent(Z, X), parent(Z, Y), X =\= Y.
brother(X, Y): sex(male, X), parent(Z, X), parent(Z, Y), X =\= Y.
-
В этом случае второго паразитнрого решения не будет.
+
В этом лсучае второго паразитнрого решения не булет.
-
Всё, конечно, хорошо, но можно заметить одну особенность: формально, они связываются конъюнкцией. Но если мы переставим X =\= Y в начало, то работать не будет, будет только для констант. Потому, что значение Y неизвестно. Поскольку нельзя перебрать бесконечность. В этом случае порядок существенен.
+
Всё, конечно, хорошо, но можно заметить одну особенность: формально, они связываются конъюнкцией. Но если мы переставим X =\= Y в начало, то работать не будет, будет только для констант. Потому, что хначение Y неизвестно. Поск. нельзя перебрать бесконечность. В этом случае порядок существенен.
-
Получается, что есть неоторое ограничение. Совсем другео дело -- datalog, он если не может зарезолвить, то запоминает и идёт дальше. Он умеет переставлять выражения, но там поиск вширь и там нет динамических структур данных.
+
Получается, что есть неоторое ограничение. Совсем другео дело -- datalog, он если не может зарезолвить, то запоминает и идёт дальше. Он у меет переставлять выражения, но там поиск вширь и там нет дин. структур данных.
После того, как посмотрели пример, посмотрим более строго. Какими данными оперирует Пролог: прологовские данные, на самом деле, очень похожи на s-выр, понятно, почему: его авторы знали лисп. Пролог придуман всё для того же --- решать задачи ИИ. Ещё бы кто сказал, что это такое, есть некое интуитивное понимание.
После того, как посмотрели пример, посмотрим более строго. Какими данными оперирует Пролог: прологовские данные, на самом деле, очень похожи на s-выр, понятно, почему: его авторы знали лисп. Пролог придуман всё для того же --- решать задачи ИИ. Ещё бы кто сказал, что это такое, есть некое интуитивное понимание.
Структуры данных, данные в языке пролог. Как и влиспе, бывают атомарные и неатомарные, сложные. Единственное, что --- в прологе неатомарных большн.
Структуры данных, данные в языке пролог. Как и влиспе, бывают атомарные и неатомарные, сложные. Единственное, что --- в прологе неатомарных большн.
-
* Атомы
+
* Атомы
-
** Числа. Насколько помнит лектор, - не являются частью выражения.
+
* Числа. Насколько помнит лектор, - не явл. частью выражения.
-
** Идентификаторы, набранные с маленькой буквы. В прологе они называются атомами. Можно и с большой, можно и пробелы, можно вообще что угодно, только нужно взять в апострофы.: mary, john, parent, 'This is an atom, too'. В те времена, когда придумывался Пролог, ещё, видимо, не устоялись парадигмы, и небыло понимания, что имени иднтификаторов. Пролог вообще компилируемый, и одна из задач компиляции --- избавить программу от идент., введённых программистом. Но в прологе ещё одна роль атомов --- роль строк. Можно ли работать со строками иначе? Да, есть строки в дв. кавычках, но они неатомарные, это список из кодов символов. Н так работать со строками, вообще говоря, не очень эфективно. Поэтому приходится работать так.
+
* Идентификаторы, набранные с маленькой буквы. В прологе они наз. атомами. Можно и с большой, можно и пробелы, можно вообще что угодно, только нужно взять в апострофы.:
-
* Структуры. Это уже дин. данные. это иден., скобка, и далее уже другие арг., в том числе структуры: triangle(point(0,0), point(1,1), point(2,0)). triangle --- функтор. Они исп. для объед. трёх разных сущностей. Треугольник --- тренарная структура, точки --- бинарные. Интересно, что есть. спец. случай функтора, который наз. точка: .(a,b) Она исп. для того же, для чего и в лиспе --- для форм. списков. В прологе они выгл. неск. иначе: [a, b, c, d] Можно ещё отделить головуот хвоста: [a,b,c|d]. [a,b,c,d] предст. как .(a, .(b, .(c, .(d, [])))) . Но здесь это не единст., а доин из многоих способов городить списки. Более того, здесь можно менять число арг. у функторов. Казалось бы, средства богаче, но ничто не мешает написать в лиспе
+
mary, john, parent, 'This is an atom, too'. В те времена, когда придумывался Пролог, ещё, видимо, не устоялись парадигмы, и небыло понимания, что имени иднтификаторов. Пролог вообще компилируемый, и одна из задач компиляции --- избавить программу от идент., введённых программистом. Но в прологе ещё одна роль атомов --- роль строк. Можно ли работать со строками иначе? Да, есть строки в дв. кавычках, но они неатомарные, это список из кодов символов. Н так работать со строками, вообще говоря, не очень эфективно. Поэтому приходится работать так.
 +
* Структуры. Это уже дин. данные. это иден., скобка, и далее уже другие арг., в том числе структуры: triangle(point(0,0), point(1,1), point(2,0)). triangle --- функтор. Они исп. для объед. трёх разных сущностей. Треугольник --- тренарная структура, точки --- бинарные. Интересно, что есть. спец. случай функтора, который наз. точка: .(a,b) Она исп. для того же, для чего и в лиспе --- для форм. списков. В прологе они выгл. неск. иначе: [a, b, c, d] Можно ещё отделить головуот хвоста: [a,b,c|d]. [a,b,c,d] предст. как .(a, .(b, .(c, .(d, [])))) . Но здесь это не единст., а доин из многоих способов городить списки. Более того, здесь можно менять число арг. у функторов. Казалось бы, средства богаче, но ничто не мешает написать в лиспе
(triangle
(triangle
(point 0 0)
(point 0 0)
Строка 42: Строка 41:
Как работает пролог? Есть ключевое для пролога понятие: унификация. Это сопоставление двух термов. Под термами понимается произв. прологовское выражение. Есть два терма, их можно скормить на вход унификатору. У нас есть нек. количество перем., некоторые из них могут иметь (а могут не иметь) знач. к нач. унифик. счто явл. рез-том:
Как работает пролог? Есть ключевое для пролога понятие: унификация. Это сопоставление двух термов. Под термами понимается произв. прологовское выражение. Есть два терма, их можно скормить на вход унификатору. У нас есть нек. количество перем., некоторые из них могут иметь (а могут не иметь) знач. к нач. унифик. счто явл. рез-том:
-
* Термы унифиц. нельзя
+
* Термы унифиц. нельзя
-
* Да, можно, для этого нужно, чтобы переменные приняли такие-то значения.
+
* Да, можно, для этого нужно, чтобы переменные приняли такие-то значения.
Переменные предст. собой контекст. После работы унифик. контекст может дополниться.
Переменные предст. собой контекст. После работы унифик. контекст может дополниться.
Как работает унификатор:
Как работает унификатор:
-
* Два атома унифиц., если они одинаковые. В противном случае они не унифиц.
+
* Два атома унифиц., если они одинаковые. В противном случае они не унифиц.
-
** 1 1 => OK
+
* 1 1 => OK
-
** 1 2 => ∅
+
* 1 2 => ∅
-
** mary mary => OK
+
* mary mary => OK
-
* Если имеются две структуры, то первыми унифиц. функторы структуры. Если они унифиц., то идём дальше. Сравниваем арность. Если не равно, то прекращаем это дело, если арность одинаковая, то идём дальше и унфиц. аргументы. Во время унифик. могут появл. новые зн. переменных.
+
* Если имеются две структуры, то первыми унифиц. функторы структуры. Если они унифиц., то идём дальше. Сравниваем арность. Если не равно, то прекращаем это дело, если арность одинаковая, то идём дальше и унфиц. аргументы. Во время унифик. могут появл. новые зн. переменных.
-
* Переменная. Если с одной стороны стоит переменная. Первый вариант --- она связана. Тогда унифик. происз. так, как если бы вместо перем. стояло её знач. Несвязанная перем. унифиц. с чем угодно.
+
* Переменная. Если с одной стороны стоит переменная. Первый вариант --- она связана. Тогда унифик. происз. так, как если бы вместо перем. стояло её знач. Несвязанная перем. унифиц. с чем угодно.
Как работает пролог-решатель. Программа на прологе состоит из процедур. Предикат пролога сост. из предложений(?). Если переменных в предл. нет, то это факт, в противном случае --- не факт. Например, parent('Lord', X) --- не факт.
Как работает пролог-решатель. Программа на прологе состоит из процедур. Предикат пролога сост. из предложений(?). Если переменных в предл. нет, то это факт, в противном случае --- не факт. Например, parent('Lord', X) --- не факт.
Строка 88: Строка 87:
member(A, [A|_]). --- унификация не удалась
member(A, [A|_]). --- унификация не удалась
member(A, [_|L]) :- member(A,L). --- унификация при A2=1, L2=[1]
member(A, [_|L]) :- member(A,L). --- унификация при A2=1, L2=[1]
-
+
 
цель: member(1, [1])
цель: member(1, [1])
member(A, [A|_]). --- унификация при A3=1, _=[]
member(A, [A|_]). --- унификация при A3=1, _=[]
Строка 107: Строка 106:
развилка
развилка
member(A, [_|L]) :- member(A,L). --- унификация при A1=X, L1=[3,1]
member(A, [_|L]) :- member(A,L). --- унификация при A1=X, L1=[3,1]
-
+
 
цель: member(X, [3, 1])
цель: member(X, [3, 1])
member(A, [A|_]). --- унификация при X=3
member(A, [A|_]). --- унификация при X=3
развилка
развилка
member(A, [_|L]) :- member(A,L). --- унификация при A2=X, L2=[1]
member(A, [_|L]) :- member(A,L). --- унификация при A2=X, L2=[1]
-
+
 
цель: member(X, [1])
цель: member(X, [1])
member(A, [A|_]). --- унификация при X=1
member(A, [A|_]). --- унификация при X=1
развилка
развилка
member(A, [_|L]) :- member(A,L). --- унификация при A3=X, L3=[]
member(A, [_|L]) :- member(A,L). --- унификация при A3=X, L3=[]
-
+
 
цель: member(X, [])
цель: member(X, [])
унификация не удалась для обоих предложений.
унификация не удалась для обоих предложений.
Строка 123: Строка 122:
OK
OK
OK
OK
- 
-
<gallery widths="200" perrow="5">
 
-
Изображение:Paradigm 091105 01.jpg
 
-
Изображение:Paradigm 091105 02.jpg|Пролог — пример.
 
-
Изображение:Paradigm 091105 03.jpg|Пролог — пример.
 
-
Изображение:Paradigm 091105 04.jpg|Пролог — пример.
 
-
Изображение:Paradigm 091105 05.jpg|атомы, структуры.
 
-
Изображение:Paradigm 091105 06.jpg|схема работы унификатора.
 
-
Изображение:Paradigm 091105 07.jpg|схема работы унификатора — обновление контекста.
 
-
Изображение:Paradigm 091105 08.jpg|предложения.
 
-
Изображение:Paradigm 091105 09.jpg|предложения с разной арностью.
 
-
Изображение:Paradigm 091105 10.jpg|резолвинг.
 
-
Изображение:Paradigm 091105 11.jpg|функция member.
 
-
Изображение:Paradigm 091105 12.jpg|функция member, исправленный вариант.
 
-
Изображение:Paradigm 091105 13.jpg|обработка вызова member(1, [3, 2, 1]).
 
-
Изображение:Paradigm 091105 14.jpg|обработка вызова member(X, [3, 2, 1]).
 
-
</gallery>
 
{{Парадигмы программирования}}
{{Парадигмы программирования}}
{{Lection-stub}}
{{Lection-stub}}

Пожалуйста, обратите внимание, что все ваши добавления могут быть отредактированы или удалены другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. eSyr's_wiki:Авторское право).
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

Разделы