Как стать автором
Обновить

Проектируем мультипарадигменный язык программирования. Часть 6 — Заимствования из SQL

Время на прочтение18 мин
Количество просмотров1.9K
Продолжаем рассказ о создании мультипарадигменного языка программирования, сочетающего декларативный логический стиль с объектно-ориентированным и функциональным, который был бы удобен при работе со слабоструктурированными данными и интеграции данных из разрозненных источников. Язык будет состоять из двух компонент, тесно интегрированных между собой: декларативная компонента будет ответственна за описание модели предметной области, а императивная или функциональная — за описание алгоритмов работы с моделью и вычисления.

Компонента моделирования гибридного языка представляет собой набор понятий-объектов, связанных между собой логическими отношениями. Я успел рассказать об основных способах определения понятий, включая наследование и определение отношений между ними. А также о некоторых нюансах логического программирования, включающих семантику оператора отрицания и логики высшего порядка. Полный список публикаций на эту тему можно найти в конце этой статьи.

В области работы с данными неоспоримым лидером является язык SQL. Некоторые его возможности, оказавшиеся очень удобными на практике, такие как агрегация, позже перекочевали в логическое программирование. Поэтому будет полезным позаимствовать из SQL как можно больше возможностей и для компоненты моделирования. В этой статье я хочу показать, как в определения понятий можно встроить вложенные запросы, внешние соединения (outer join) и агрегацию. Также расскажу о еще одном типе понятий, которое описывается с помощью функции, генерирующей объекты (сущности) в алгоритмическом стиле не прибегая к логическому поиску. И покажу, как с его помощью можно использовать массивы объектов в качестве родительских понятий по аналогии с SQL операцией UNNEST, преобразовывающей коллекции в табличный формат и позволяющей соединить их с другими таблицами в секции FROM.
Читать дальше →
Всего голосов 8: ↑8 и ↓0+8
Комментарии8

Prolog in Prolog: зачем и как

Время на прочтение9 мин
Количество просмотров3.3K

Язык Prolog создавался для задач иссуственного интеллекта, который сейчас обычно называют "классическим", чтобы не путать с задачами машинного обучения путем подбора большого числа числовых параметров. Важным классом таких задач является моделирование "мира", в котором можно совершать какие-либо действия. Игрушечным примером такого мира является Nani Search. И решают их часто в таком стиле: состояние мира помещается в прологовскую базу данных и все изменения производятся путем удаления и добавления фактов в это хранилище. Но это получается уже не логическое программирование, а самое настоящее императивное! При этом используются худшие практики программирование - глобальное состояние! Мимо этого я пройти не могу!

Но самое плохое в таком подходе не стиль, в конце концов большая часть современного кода императивна, и даже частенько использует, явно или неявно, глобальные переменные. Важно что состоятние мира перестает быть first-order value и пропадает возможность решать задачи в моделируемом мире, для чего и создавался язык Prolog.

Читать далее
Всего голосов 16: ↑16 и ↓0+16
Комментарии11

Динамическая База данных на Turbo Prolog

Уровень сложностиСредний
Время на прочтение11 мин
Количество просмотров5.2K

Реализация динамической базы данных на Turbo prolog с сохранением в CSV файл.

Читать далее :-)
Всего голосов 20: ↑20 и ↓0+20
Комментарии12

Логическое программирование для начинающих. Prolog

Уровень сложностиПростой
Время на прочтение8 мин
Количество просмотров7.5K

Мне как студенту попалась очень хорошая тема. Всем известно, что человек поистине разбирается в какой-то теме, если он может объяснить ее ничего не знающему в этой области человеку. Например, младшему брату. Поэтому изложение материала не должно быть сложным, обязательно должны быть примеры, подкрепляющие сказанное. Но прежде чем начать рассказывать о логическом программировании, нужно рассказать о самом программировании. Приступим.

Читать далее
Всего голосов 10: ↑10 и ↓0+10
Комментарии12

Плэнер — язык логического программирования для ИИ: что из него получилось

Уровень сложностиСредний
Время на прочтение6 мин
Количество просмотров5.4K
Боты под управлением системы GOAP (Goal Oriented Action Planning), источник

Плэнер (Planner) — функционально-логический язык программирования, схожий по своему синтаксису с Лиспом. Функциональная часть языка содержит фактически целиком Лисп в качестве подмножества. При этом его встроенные возможности по символьной обработке значительно шире. А введение в запись нескольких типов скобок (в Лиспе допускаются только круглые скобки) сделало программы гораздо понятнее для чтения.

В свою очередь, логическое программирование — это парадигма программирования, основанная на математической логике, в которой код состоит из логических утверждений и правил вывода.
Читать дальше →
Всего голосов 26: ↑34.5 и ↓-8.5+43
Комментарии3

Решение задачи «AAAAAA» с Facebook Hacker Cup методом динамического программирования на B-Prolog

Время на прочтение4 мин
Количество просмотров11K
Есть много материала по решению запутанных задачек на Прологе (например, страница Hakan Kjellerstrand о B-Prolog). Однако часто приводятся задачи, которые либо создавались для решения вручную (имеют маленькое пространство поиска), либо изначально ориентированы на решение при помощи логического программирования.

Я хочу показать мое решение на Прологе задачи AAAAAA с первого раунда Facebook Hacker Cup 2014. Задача имеет достаточно большое пространство поиска и создана с прицелом на решение опытными спортивными программистами на распространенных языках программирования.
Читать дальше →
Всего голосов 16: ↑15 и ↓1+14
Комментарии2

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

Время на прочтение13 мин
Количество просмотров53K
Представьте себе высокоуровневый язык, в котором не нужно указывать КАК получить результат, вместо этого нужно просто указать ЧТО вы хотите получить. При этом область применения языка не ограничена и язык способен решать те же задачи, что и любой другой высокоуровневый язык, наподобие JAVA. Кажется фантастикой, не правда ли? Однако такой язык есть и называется он PROLOG. Посмотрим как PROLOG справляется с этой задачей на примере загадывания прологу некоторых загадок и попросим PROLOG выдать доказательство теоремы.

image

Читать дальше →
Всего голосов 59: ↑49 и ↓10+39
Комментарии105

PROLOG для программистов

Время на прочтение9 мин
Количество просмотров91K
Язык логического программирования PROLOG (далее – ПРОЛОГ) большинству программистов представляется чем-то запутанным и малопригодным для практического применения. В то же время, Интернет основан на символьной информации, поэтому практически все современные программисты сталкиваются с необходимостью обрабатывать символьные структуры данных, а ведь для этого и предназначен язык логического программирования ПРОЛОГ. Этот язык – идеальный для работы с символьными структурами, текстовыми файлами и для построения интеллектуальных программ.
Читать дальше →
Всего голосов 30: ↑21 и ↓9+12
Комментарии109

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

Время на прочтение17 мин
Количество просмотров43K

У того, кто в детстве не писал на Прологе — нет сердца, а у того, кто пишет на нём сегодня — нет мозгов. (оригинал)

Если вас всегда терзали мучительные сомнения — что за фигня это Логическое Программирование (ЛП) и вообще зачем оно нужно? То это статья для вас.


Можно по-разному разделить языки программирования на группы (часто их называют парадигмами программирования), например, вот так:


  • структурное: программа разбивается на блоки — подпрограммы (изолированные друг от друга), а основными элементами управления являются последовательность команд, ветвление и цикл.
  • объектно-ориентированное: задача моделируется в виде объектов, которые отправляют друг другу сообщения. Объекты обладают свойствами и методами. Абстракция. Инкапсуляция. Полиморфизм. Ну в общем, все в курсе.
  • функциональное: базовым элементом является функция и сама задача моделируется в виде функции, а, точнее, чаще всего в виде их композиции, если f(.) и g(.) — это функции, то f(g(.)) — это их композиция.
  • логическое: вот тут, как правило, начинается феерия — если про первые три написаны сотни статей, книг, обзоров, презентаций и учебников, то здесь мы в лучшем случае видим что-то про Prolog и разработки времён Pink Floyd и Procol Harum (ну хоть с музыкой им тогда повезло) и на этом история заканчивается.

Вот эту оплошность я и собираюсь сегодня исправить.


Важнейший тезис этой статьи:


Логическое программирование != Prolog.

И вообще последний вам скорее всего не нужен. А вот первое вполне может быть.


Структура статьи:


  • Что такое Пролог и почему он вам скорее всего не нужен
  • Зачем оно надо, или краткое введение в Answer Set Programming
  • Решаем задачи на ASP
  • Комбинаторная оптимизация
  • Вероятностное ЛП: ProbLog
  • ЛП на классической логике FO(.) и IDP
  • Sketched Answer Set Programming
  • Экспериментальный анализ
  • Тестирование и корректность программ
  • Заключение
Читать дальше →
Всего голосов 30: ↑29 и ↓1+28
Комментарии22

Регулярные выражения + логическое программирование. Что в результате?

Время на прочтение4 мин
Количество просмотров7.5K
Здравствуйте, уважаемые читатели.

Регулярные выражения — хорошо известная вещь, которая используется в разнообразных проектах, чаще всего, для не очень сложных случаев разбора структурированных текстов. Занимаясь, на первый взгляд, такой несколько иной задачей, как обратный синтез моделей программ (когда есть код программы, порожденный автоматически некоторой системой по некоторой блочной модели решаемой задачи, и необходимо по этому коду воссоздать исходную модель), а также синтезом моделей программ по текстовому описанию задачи, я столкнулся с проблемой анализа текстов, а точнее — идентификации фрагментов текста некоторым настраиваемым шаблонам. Хотелось получить достаточно простое и гибкое (настраиваемое) решение. Регулярные выражения, с ходу, такими не казались, поскольку даже в такой простой задаче, как проверка слова по словарю, требовала, к сожалению, тщательного перечисления всех вариантов в этом выражении. Да и дерево синтаксического разбора они не строили. Однако, их явно можно было улучшить. Об этом и пойдет речь.
Читать дальше →
Всего голосов 15: ↑12 и ↓3+9
Комментарии3

Реляционное программирование: боль, интерес и снова боль

Время на прочтение14 мин
Количество просмотров9.6K
В предыдущем посте мы подробно рассказывали, чему учим студентов на направлении «Промышленное программирование». Для тех, чья сфера интересов лежит в более теоретической области, например, привлекают новые парадигмы программирования или абстрактная математика, используемая в теоретических исследованиях по программированию, существует другая специализация — «Языки программирования».

Сегодня я расскажу о своем исследовании в области реляционного программирования, которым занимаюсь в университете и в качестве студента-исследователя в лаборатории языковых инструментов JetBrains Research.

Что такое реляционное программирование? Обычно мы запускаем функцию с аргументами и получаем результат. А в реляционном случае можно делать наоборот: зафиксировать результат и один аргумент, а второй аргумент получить. Главное — правильно написать код и запастись терпением или хорошим кластером.


Читать дальше →
Всего голосов 24: ↑23 и ↓1+22
Комментарии10

Проектируем мульти-парадигменный язык программирования. Часть 4 — Основные конструкции языка моделирования

Время на прочтение17 мин
Количество просмотров2K
Продолжаем рассказ о создании мульти-парадигменного языка программирования, сочетающего декларативный стиль с объектно-ориентированным и функциональным, который был бы удобен при работе со слабоструктурированными данными и интеграции данных из разрозненных источников. Наконец-то после введения и обзоров существующих мульти-парадигменных технологий и языков представления знаний мы добрались до описания той части гибридного языка, которая ответственна за описание модели предметной области. Я назвал ее компонентой моделирования.

Компонента моделирования предназначена для декларативного описания модели предметной области в форме онтологии — сети из экземпляров данных (фактов) и абстрактных понятий, связанных между собой с помощью отношений. В ее основе лежит фреймовая логика — гибрид объектно-ориентированного подхода к представлению знаний и логики первого порядка. Ее основной элемент — понятие, описывающее моделируемый объект с помощью набора атрибутов. Понятие строится на основе других понятий или фактов, исходные понятия назовем родительскими, производное — дочерним. Отношения связывают значения атрибутов дочернего и родительских понятий или ограничивают их возможные значения. Я решил включить отношения в состав определения понятия, чтобы вся информация о нем находилась по возможности в одном месте. Стиль синтаксиса для определений понятий будет похож на SQL — атрибуты, родительские понятия и отношения между ними должны быть разнесены по разным секциям.

В этой публикации я хочу представить основные способы определения понятий.
Читать дальше →
Всего голосов 8: ↑7 и ↓1+6
Комментарии25

Роль логического программирования, и стоит ли планировать его изучение на 2021-й

Время на прочтение13 мин
Количество просмотров15K

В русскоязычном интернете достаточно мало информации о логическом программировании, особенно адаптированной для новичков. Эту проблему я попытался отчасти решить в данной статье, рассказав о том, что такое логическое программирование, какие задачи решают с его помощью, и стоит ли вообще это изучать.

Давайте рассуждать логически
Всего голосов 57: ↑57 и ↓0+57
Комментарии16

Проектируем мультипарадигменный язык программирования. Часть 5 — Особенности логического программирования

Время на прочтение16 мин
Количество просмотров3.3K
Продолжаем рассказ о создании мульти-парадигменного языка программирования, сочетающего декларативный логический стиль с объектно-ориентированным и функциональным, который был бы удобен при работе со слабоструктурированными данными и интеграции данных из разрозненных источников. Язык будет состоять из двух компонент, тесно интегрированных между собой: декларативная компонента будет ответственна за описание модели предметной области, а императивная или функциональная — за описание алгоритмов работы с моделью и вычисления.

В прошлой статье я начал рассказ о компоненте моделирования гибридного языка. Она представляет собой набор понятий-объектов, связанных между собой логическими отношениями. Я успел рассказать об основных способах определения понятий, наследовании и определении отношений между ними. С причинами, побудившими меня заняться проектированием гибридного языка, и его особенностями можно ознакомиться в моих предыдущих публикациях на эту тему. Ссылки на них можно найти в конце этой статьи.

А сейчас я предлагаю окунуться в некоторые нюансы логического программирования. Поскольку язык компоненты моделирования имеет декларативную логическую форму, то придется решить такие проблемы, как определение семантики оператора отрицания, внедрение элементов логики высших порядков и добавление возможности работы с логическими переменными. А для этого придется разобраться с такими теоретическими вопросами как предположение об открытости/замкнутости мира, отрицание как отказ, семантикой стойких моделей (stable model semantics) и обоснованной семантикой (well-founded semantics). А также с тем, как реализованы возможности логики высших порядков в других языках логического программирования.
Читать дальше →
Всего голосов 10: ↑9 и ↓1+8
Комментарии23

Семинары лаборатории языковых инструментов JetBrains Research

Время на прочтение8 мин
Количество просмотров1.6K
Лаборатория языковых инструментов — совместная инициатива JetBrains и математико-механического факультета СПбГУ.

Сотрудники лаборатории исследуют:

  • формализацию и верификацию семантики языков программирования в контексте слабых моделей памяти;
  • логическое и реляционное программирование;
  • теорию формальных языков и ее применения;
  • метапрограммирование, специализацию и частичные вычисления;
  • формальную верификацию и применение SMT-решателей.

На еженедельных семинарах выступают как наши сотрудники и студенты, так и приглашенные докладчики. С недавних пор семинары записываются, их можно посмотреть на Youtube. В этом посте мы поделимся ссылками и описаниями прошедших встреч, а также расскажем, как не пропустить анонсы будущих мероприятий.


Читать дальше →
Всего голосов 8: ↑8 и ↓0+8
Комментарии0

Проектируем мульти-парадигменный язык программирования. Часть 3 — Обзор языков представления знаний

Время на прочтение17 мин
Количество просмотров5.2K
Продолжаем рассказ о создании мульти-парадигменного языка программирования, поддерживающего декларативный логический стиль для описания модели предметной области. Прошлые публикации находятся здесь и здесь. Теперь пришло время для описания основных особенностей и требований к языку описания модели предметной области. Но для начала сделаем небольшой обзор наиболее популярных языков представления знаний. Это довольно обширная область, имеющая давнюю историю и включающая ряд направлений — логическое программирование, реляционное исчисление, технологии семантической паутины, фреймовые языки. Я хочу сравнить такие языки как Prolog, SQL, RDF, SPARQL, OWL и Flora, выделить те их особенности, которые были бы полезны в проектируемом мульти-парадигменном языке программирования.
Читать дальше →
Всего голосов 7: ↑7 и ↓0+7
Комментарии5

Необычная концепция синтаксиса языка программирования

Время на прочтение8 мин
Количество просмотров8.6K


Хочу представить на обсуждение читателей немного необычный концепт языка программирования, в котором отсутствует проблема, присущая практически всем промышленным языкам — постоянное увеличение сложности синтаксиса языка из-за его естественного развития по мере выхода новых версий и добавления новых фич. Эта проблема описана в материале Простое сложное программирование и Какая «идеальная» цель развития у языков программирования?

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

Особенности языка:

  • Низкий порог входа и естественное ограничение уровня сложности в течение длительного времени даже при условии постоянного развития самого языка.
  • Возможность писать код программы как в декларативной, так и в императивной парадигме с использованием процедурного, модульного и объектно-ориентированного подхода.

Ну и в соответствии с собственным наблюдением Хабр — ума палата, буду рад любым комментариям и предложениям, которые помогут протестировать или улучшить предлагаемое решение.
Читать дальше →
Всего голосов 10: ↑6 и ↓4+2
Комментарии42

Логическое программирование на Prolog для чайников

Время на прочтение14 мин
Количество просмотров72K

Дисклеймер: этот туториал написан преимущественно для студентов, изучающих Пролог. Если вы человек практического толка, то, скорее всего, вы не найдете здесь ничего полезного.

Выделяют три основные парадигмы программирования: императивное, функциональное и логическое. Императивное — это про C/C++, Java, Golang, Javascript и тд. Я даже могу сказать "C подобный, значит императивный". Функциональное — это про Haskell, F#, Lisp, ленивые вычисления, чистые функции и т.д. Но что такое логическое программирование? Какие задачи оно решает и на чем программировать? Не уже ли логическое программирование способно доказать любую математическую теорему? Или как?

Это статья — туториал по логическому программированию на Пролог для чайников.

Туториал будет интересен в первую очередь:
1. Любознательным
2. Студентам, которым приходится изучать Prolog в вузе

Я постарался лаконично, понятно, без излишних приступлений и отступлений научить основам программирования на Пролог.

Давайте разбираться
Всего голосов 17: ↑13 и ↓4+9
Комментарии18

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

Время на прочтение11 мин
Количество просмотров8.3K

Давайте поговорим о побитовых операциях.

С ними привычно иметь дело embedded-разработчикам и тем, кто занимается криптографией. Также побитовые операции можно встретить в системном программировании, компьютерной графике и везде, где присутствует сильная ограниченность ресурсов или длительные вычисления.

В прикладном же программировании многие устанавливают (|) и проверяют параметры (&) через степени двойки. Как правило, дальше этого не заходит. Но всегда есть задачи, которые потребуют горизонтального масштабирования при высокой нагрузке в случае их решения явным или привычным способом.

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

Читать далее
Всего голосов 20: ↑17 и ↓3+14
Комментарии26