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

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

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

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

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

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

    Давайте разбираться
  • AI на минималках 2: Генератор стихов на Prolog

    • Tutorial

    AI на минималках 2: Генератор стихов на Prolog


    Мемная картинка


    На картинке — четверостишье, сгенерированное моей программой.


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


    Кто хочет научится писать стихи и познакомиться с Prolog, прошу под кат.

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

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

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

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

        Некоторое время назад я писал про «Интернациональное программирование на естественных языках», в которой попытался представить достойную цель для абстрактного языка программирования, попробовав примерить на него роль связующего звена между миром программистов с компьютерами и не программистов.

        Но в результате оказалось, что это не нужно в принципе, т.к. «не программистам» просто не требуется учиться писать программы. А если иногда такое желание и возникает, то вполне хватает обычных формализованных языков программирования, которых уже сейчас насчитывается наверно более десяти тысяч.

        И пользователи, как программисты, так и не программисты, просто хотят решать возникающие перед ними задачи. И хотя задачи бывают совершенно разные, но если способ (алгоритм) её решения известен, то выбрать язык для её решения не составит никакого труда.

        За исключением одного класса задач. Задач, решение которых нельзя описать в виде алгоритма. Но можно указать некие критерии, которым должно удовлетворять искомое решение. Я имею ввиду логические языки программирования и Пролог, как самый яркий представитель этого класса.

        Еще помню воспоминание из юности, когда удалось достать дискету с этим языком. Ух, с каким задором горели мои глаза, когда мне казалось, ну вот, еще чуть-чуть и будет создана система с базой знаний, у которой и можно будет получить заветный ответ 42 на любой вопрос.

        Так почему этого так и не случилось? В чем проблема Пролога, да и любой системы / языка программирования, назначение которых анализировать факты и искать ответы на вопросы?

        Эта проблема называется «Комбинаторный взрыв» — экспоненциальная (или более) зависимость времени работы алгоритма от количества входных данных. И есть как минимум два решения этой проблемы.
        Читать
      • Проектируем мультипарадигменный язык программирования. Часть 5 — Особенности логического программирования

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

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

          А сейчас я предлагаю окунуться в некоторые нюансы логического программирования. Поскольку язык компоненты моделирования имеет декларативную логическую форму, то придется решить такие проблемы, как определение семантики оператора отрицания, внедрение элементов логики высших порядков и добавление возможности работы с логическими переменными. А для этого придется разобраться с такими теоретическими вопросами как предположение об открытости/замкнутости мира, отрицание как отказ, семантикой стойких моделей (stable model semantics) и обоснованной семантикой (well-founded semantics). А также с тем, как реализованы возможности логики высших порядков в других языках логического программирования.
          Читать дальше →
        • Роль логического программирования, и стоит ли планировать его изучение на 2021-й

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

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

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

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

            В этой публикации я хочу представить основные способы определения понятий.
            Читать дальше →
          • Реклама
            AdBlock похитил этот баннер, но баннеры не зубы — отрастут

            Подробнее
          • Что за X++? Что за ABAP? Древние языки, про которые интересно слушать, но не дай бог на них писать

              Большая разработка — дело коллективное, и это хорошо. Что бы ни взбесило тебя в условных Go или JS, точно найдется сотня-другая разрабов с такой же болью. Преодолевать ее вместе легче — и когда ломаешь голову над рабочей задачей, и когда просто собираешься с товарищами поныть, как все плохо.

              Но почти в каждой компании в этот момент найдется человек со взглядом на сотню ярдов в пустоту, который будет вспоминать, как 10 лет назад в своем НИИ ШМИИ ИПИАН «Меловой период» его заставляли переписывать гигантскую систему с Лиспа на Си. И у всех в этот момент пробежит холодок по спине — потому что никто не застрахован от рефакторинга чего-нибудь древнего и страшного.

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

              Здесь мы собрали вместе людей, которые писали на Prolog, Forth, ABAP и X++, и дали им выговориться.

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

                Продолжаем рассказ о создании мульти-парадигменного языка программирования, поддерживающего декларативный логический стиль для описания модели предметной области. Прошлые публикации находятся здесь и здесь. Теперь пришло время для описания основных особенностей и требований к языку описания модели предметной области. Но для начала сделаем небольшой обзор наиболее популярных языков представления знаний. Это довольно обширная область, имеющая давнюю историю и включающая ряд направлений — логическое программирование, реляционное исчисление, технологии семантической паутины, фреймовые языки. Я хочу сравнить такие языки как Prolog, SQL, RDF, SPARQL, OWL и Flora, выделить те их особенности, которые были бы полезны в проектируемом мульти-парадигменном языке программирования.
                Читать дальше →
              • Навеянное Prolog-ом коммерческое решение пробыло больше 10 лет в эксплуатации

                  Для большинства программистов которые хотя бы слышали про Prolog это только странный артефакт из времён когда компьютеры были размером с динозавров. Некоторые сдали и забыли в институте. И лишь узкие как листочек A4 специалисты сталкивались с чем-то подобным в современном мире. Так уж получилось, что далёком 2003-ем году я использовал некоторые решения подчерпнутые из Prolog-а, в коммерческих играх на Flash и больше десятилетия они радовали французов. Причём применил я это полудекларативное решение не потому что прочитал книжку Братко и впечатлился, а потому что это было реально нужно нашему проекту. Я до сих пор регулярно порываюсь воспроизвести то решение на современном уровне, потому что оно очень много где было бы полезным в современном игрострое, но, к сожалению, каждый раз находятся дела поважнее… В общем об этом всём и расскажу.


                  Скриншот той самой флэшовой игры до сих пор приветствует вас на сайте toox.com/jeux/jeux-de-cartes/coinche
                  Ещё раз предупреждаю, всё что будет дальше не про Prolog, а про надёрганные из него идеи
                • Слышали о языке Prolog?

                  • Перевод
                  Prolog — это один из тех языков, которые программисты обычно изучают в самом начале карьеры (например — в школе или в институте). Его, правда, забывают почти сразу же после того, как изучили.

                  Почему? Ну, лично я виню в этом индустрию разработки ПО. Я работаю в этой сфере последние 17 лет. Я участвовал в самых разных проектах, связанных с веб-разработкой и с большими данными (а именно, это были крупные интернет-площадки, ETL-конвейеры и прочее подобное). Суть в том, что за всё это время я не увидел ни одной строчки кода, написанной на Prolog.



                  Теперь расскажу о том, что случилось на прошлой неделе. Это был совершенно обычный вторник, я проводил собеседование с начинающим программистом. Когда я спросил его о том, на каких ещё языках программирования он может писать, он ответил так: «Я учил Prolog в университете, но им уже никто не пользуется».

                  Это заставило меня задуматься о том, насколько подобное заявление соответствует действительности.
                  Читать дальше →
                • Проектируем мульти-парадигменный язык программирования. Часть 2 — Сравнение построения моделей в PL/SQL, LINQ и GraphQL

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

                    В этой публикации я хочу поговорить о некоторых популярных языках и технологиях, включающих элементы декларативного программирования — PL/SQL, MS LINQ и GraphQL. Попытаюсь разобраться, какие задачи в них решаются с помощью декларативного программирования, насколько тесно переплетены декларативный и императивный подходы, какие это дает преимущества, и какие идеи можно из них почерпнуть.
                    Читать дальше →
                  • Проектируем мульти-парадигменный язык программирования. Часть 1 — Для чего он нужен?

                    Хабр это замечательное место, где можно смело делиться своими идеями (даже если они и выглядят безумно). Хабр видел много самодельных языков программирования, расскажу и я о своих экспериментах в этой области. Но мой рассказ будет отличаться от остальных. Во-первых, это будет не просто язык программирования, а гибридный язык, сочетающий в себе несколько парадигм программирования. Во-вторых, одна из парадигм будет довольно необычной — она будет предназначена для декларативного описания модели предметной области. А в-третьих, сочетание в одном языке декларативных средств моделирования и традиционных объектно-ориентированного или функционального подходов способно породить новый оригинальный стиль программирования — онтологически-ориентированное программирование. Я планирую раскрыть в первую очередь теоретические проблемы и вопросы, с которыми я столкнулся, и рассказать не только о результате, но и о процессе создания дизайна такого языка. Будет много обзоров технологий и научных подходов, а также философских рассуждений. Материала очень много, придется разбить его на целую серию статей. Если вас заинтересовала такая масштабная и сложная задача, приготовьтесь к долгому чтению и погружению в мир компьютерной логики и гибридных языков программирования.
                    Читать дальше →
                  • Logical FizzBuzz

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


                      В реализации на Скала я увидел операцию "(value % n)" и пояснение, что значения value,n -это: type class "Integral" требующий от типа "T" возможности вычислять остаток от деления и иметь значение "zero".


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

                      Читать дальше →
                    • REST сервер на Прологе, как это выглядит?

                        В качестве небольшого экскурса для непосвященных в логическое программирование
                        в этом тексте будет проведен сеанс магии с разоблачением приведен подход
                        к созданию REST-сервера и замерены его параметры.

                        В чем подвох? А все просто — будем делать на Прологе (в реализации SWI-prolog)…
                        Посмотреть
                        • +47
                        • 6,2k
                        • 9
                      • Просто о Прологе

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


                          Задача 391. Perfect Rectangle


                          Given N axis-aligned rectangles where N > 0, determine if they all together form an exact cover of a rectangular region.
                          Each rectangle is represented as a bottom-left point and a top-right point. For example, a unit square is represented as [1,1,2,2]. (coordinate of bottom-left point is (1, 1) and top-right point is (2, 2)).
                          image
                          Example 1: rectangles = [
                          [1,1,3,3],
                          [3,1,4,2],
                          [3,2,4,4],
                          [1,3,2,4],
                          [2,3,3,4]]
                          Return true. All 5 rectangles together form an exact cover of a rectangular region.

                          Example 3:rectangles =
                          [ [1,1,3,3],
                          [3,1,4,2],
                          [1,3,2,4],
                          [3,2,4,4]]
                          Return false. Because there is a gap in the top center.
                          Читать дальше →
                        • Что такое логическое программирование и зачем оно нам нужно


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

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


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


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

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


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


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

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


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


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

                            Вступление


                            Как то мне посчастливилось выбирать тему дипломной работы по специальности программная инженерия, и я выбрал написание экспертной системы, причем именно на языке Пролог. Хоть в промышленном программировании он почти не используется, он интересен в теоретическом плане позволяет самым быстрым способом прикоснуться к интеллектуальным системам(ИС). Также сам язык интересен в спортивном плане, так как заставляет мыслить в непривычной манере, отличной от мышления процедурного программирования и ООП, что является хорошой тренировкой для мозгов.

                            Использовалась реализация Prolog — Visual Prolog, с встроенными библиотеками GUI. Но если
                            вы хотите написать GUI на Qt/C++, то в документации есть инструкция, как импортировать программу в DLL, и скомпилировать ее вместе с C/C++ проектом. Отсюда следует, что совместить можно и с другими языками.

                            Вообще когда я работал над этим проектом, я не нашел примеров достаточно не примитивных, но в то же время и не настолько больших, как наворочен
                            Читать дальше →
                          • Используем Пролог

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


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


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


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


                              Так вот, задача такова:


                              1. Trapping Rain Water II
                                Given an m x n matrix of positive integers representing the height of each unit cell in a 2D elevation map, compute the volume of water it is able to trap after raining.
                                Note:
                                Both m and n are less than 110. The height of each unit cell is greater than 0 and is less than 20,000.
                                Example:

                                image

                                Given the following 3x6 height map:
                                [
                                [1,4,3,1,3,2],
                                [3,2,1,3,2,4],
                                [2,3,3,2,3,1]
                                ]
                                Return 4.


                              Читать дальше →
                            • Ищем убийцу на Прологе

                              • Перевод
                              Каждое воскресенье в нашей компании принято устраивать весёлые викторины, это одна из них.

                              Загадка


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

                              • Для начала, представим подозреваемых. Есть три мужчины (Джордж, Джон, Роберт) и три женщины (Барбара, Кристина, Иоланда). Каждый человек находится в отдельной комнате (ванная, столовая, кухня, гостиная, кладовая, кабинет). В каждой комнате найдено подозрительное оружие (сумка, огнестрельное оружие, газ, нож, яд, верёвка). Вопрос: кого нашли на кухне?
                              • Подсказка 1. При мужчине на кухне нет ни верёвки, ни ножа, ни сумки. Оружие не является огнестрельным. Вопрос: какое оружие найдено на кухне?
                              Читать дальше →

                            Самое читаемое