Пролог (язык программирования)

Используем Пролог

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

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

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

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

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

Занимательный пролог #3

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

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

Я написал реализацию которая в среднем была вот такого вида скорости, значит есть еще 90 процентов решений, которых я не заметил, что кто-то знает как ее решить еще быстрее и он молчит, и посмотрев две предыдущие статьи не сказал: ах, если это вопрос производительности, тогда все понятно — тут пролог не подходит. Но с производительностью сейчас все нормально, представить себе программу, которая будет запущена на слабом железе не возможно, «в конце концов, зачем об этом думать?»

Вызов

Решить задачу еще быстрее, там был питон и было время, и есть на питоне более быстрое решение?

Мне сообщают «Runtime: 2504 ms, faster than 1.55% of Python3 online submissions for Wildcard Matching.»

Ищем убийцу на Прологе

Перевод

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

Загадка

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

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

[править] Warning!

Студент, запомни: твой научник тоже был романтичным студентом, и ему тоже не давали покоя «инновационные технологии» своего времени. Возможно, некоторые из них он полюбил на всю жизнь. На пике популярности Prolog позиционировался как универсальный silver bullet, после которого никаких других языков не нужно, чем заразил умы многих. Если профессор пытается загипнотизировать тебя бородой на написание диплома на Прологе — беги! Вполне вероятно, что у него тяжелая травма на этой почве, и каждый год он выбирает жертву, которая будет пытаться смыть его позор и доказать всем. Тебя ждёт неминуемый FAIL с необходимостью переписать весь код за два дня до защиты, его ждёт новая жертва. По словам приезжих членов комиссии из default city, прецеденты всё ещё случаются по всей стране.

Архитектура

Многие современные реализации языка имеют внутреннее расширение за счёт ООП-архитектуры. Кроме несвободных решений также существуют свободные реализации Пролога. В 1996 году был принят стандарт ISO, получивший название ISO/IEC JTC1/SC22/WG17.

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

Определение слова «Пролог» по БСЭ:

Пролог (греч. prologos, от pro — перед и logos — слово, речь)вступительная часть литературного и театрального произведения, которая предворяет общий смысл, сюжет или основной мотивы произведения или кратко излагает события, предшествующие основному действию (Сюжету). В античной драме П. — сцена или монолог, передававшие исходную ситуацию или миф, которые послужили основой сюжета. В средневековой мистерии, миракле, моралите — молитва или проповедь, включавшие исходную для пьесы притчу. В драмах Шекспира, Гёте, Шиллера П., наряду с мотивировкой последующих событий, часто содержал эстетическую декларацию автора. П. в современном значении и многообразии жанрового применения складывался начиная с 19 в. (поэма «Медный всадник» Пушкина, роман «Ярмарка тщеславия» Теккерея).Постепенно он всё более смыкался с сюжетом, по существу становясь одним из его элементов: П. повести Н. В. Гоголя «Страшная месть», поэмы Г. Лонгфелло«Песнь о Гайавате», романа И. Г. Эренбурга «Необычайные похождения Хулио Хуренито…» (такой П. в повествовательных жанрах называют иногда Vorgeschichte — предысторией). В отличие от предисловия, П. всегда художествен.В. А. Калашников.

Пролог (язык программирования)

Logical FizzBuzz

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

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

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

Печатные издания

Обыкновенно Про́лог издается в двух томах: первый содержит чтения на осенние и зимние месяцы, второй — на весенние и летние; тома эти, впрочем, столь велики и толсты, что часто переплетаются в две книги каждый, особо на каждое время года. История же изданий такова:

  • 1-е издание в , стишное; по сравнению с рукописями того же времени, опущено много мелких статей, являвших собой только перевод кратких греческих стихов, обычно уже малопонятный. Издана только первая часть сборника.
  • 2-е (первый том в , второй в ): по сравнению с первым изданием, добавлено более 20 довольно длинных сказаний о русских святых, в том числе об известных князьях (Иоанн Новгородский 7/IX, Киприан Московский 16/IX, Федор Смоленский 19/IX, Михаил Черниговский 20/IX, Сергий Радонежский 25/IX, Савватий Соловецкий 27/IX, Александр Невский 23/XI, битва новгородцев с суздальцами 27/XI, Всеволод Псковский 27/XI и 11/II и др.), но исключено около 40 небольших сообщений о лицах иностранных (Мартин Римский, Исаакий Кипрский, Дорофей Тирский, Павел Фивейский, Ипатий Гангрьский, Феодорит Киринейский и др.). Кроме того, исключено большинство стихов перед статьями — оставлены лишь те, где персонаж только в стихе и упомянут. Исправлен язык (встречаются как поновления, так и архаизация). Второй (мартовский) том набран более мелким шрифтом, чем первый.
  • 3-е (первый том в , второй в ): добавлено ещё не менее 20 сказаний о русских лицах и событиях (Гурий Казанский и Варсонофий Тверской 4/X, об избавлении Руси от ляхов 22/X, Иаков Боровицкий 23/X, избавление Руси от Ахмата Ордынского 23/VI, о Филиппе Московском 9/VII, о даре персидского шаха Аббаса в Москву 10/VII, о смерти вел. кн. Василия Московского 2/VIII и проч.). Добавлено также много пространных греческих слов и житий (Житие Николая Мирликийского добавлено в виде 15 отдельных повестей и отдельного слова, 6/XII и 9/V; житие Алексия человека Божия 17/III и т. п.). Слово Ефрема Сирина о соблазнившемся монахе заменено более пространной редакцией. Для компенсации снова исключено много мелких греческих материалов, а иные сокращены (например, Дионисий Ареопагит 3/X), исключены некоторые поучительные слова (от Патерика о двою пустыннику 13/VI, Феодорита Студийского о ярости 13/VII и др.). Более решительно правлен язык и орфография — старая московская редакция церковнославянского заменена новоцерковнославянским. Тексты приведены к единообразному оформлению.
  • 4-е (первый том в , второй в ): близко к предыдущему (отдельные страницы полностью совпадают), но все же добавлено более 30 статей (в основном небольших) о русских деятелях и событиях (Иосиф Волоцкий 9/IX, кн. Ефросиния Суздальская 25/IX, кн. Михаил Ярославич Тверской 22/XI, вел. кн. Даниил Александрович Московский 4/III, кн. Игорь Ольгович Киевский 5/VI, Евдокия, жена вел. кн. Дмитрия Донского 7/VII, о разорении Рязани Батыем 28/VII и проч.). Заменены более пространными редакциями некоторые сказания греческого происхождения (об Иоанне Златоусте 13/XI, о Федоре Стратилате 8/VI). Взамен опущены единичные поучения, вроде «Слова о еже не имети злобы» 13/I. Умеренная правка языка.
  • 5-е (первый том в , второй в ): небольшие краткие вставки нового материала (Нил Столбенский 7/XII, Федор Писанный 27/XII, Кассиан Римлянин 28/II, Иона Московский 15/VI, о явлении тихвинской иконы Богоматери 26/VI); заменено другой редакцией «Слово о непокоряющихся монасех» 17/VI. Слово Иоанна Златоуста на усекновение главы Иоанна Предтечи заменено Словом Григория о том же, 28/VIII. В конце томов добавлены указатели имен и тем, выдержанные приблизительно по алфавиту. Издание напечатано более мелким шрифтом, для экономии места убраны заставки и прочие украшения, подзаголовки подверстаны в текст и т. п.
  • 6-е (), 7-е () и 8-е () издания практически тождественны с предыдущим (в 6-м добавлено было Слово патриарха Иоакима против раскольников, но в 7-м оно убрано).
  • 9-е () и 10-е () издания вновь изменены, на этот раз под влиянием Миней четьих Димитрия Ростовского.
  • 11-е издание готовилось в начале 1720-х (иногда упоминается под годом), но либо не вышло, либо ни одного экземпляра не сохранилось (в типографской библиотеке сохранился мартовский том предыдущего издания с пометками и исправлениями для готовившегося нового). Коренная правка с позиций рационалистического взгляда на мир.
  • Ещё 6 изданий в XVIII веке (12-е (), издание года и четыре других).
  • Несколько изданий в XIX и XX веках (в частности, и ). Издание — гг. репринтно переиздано в году издательством Сретенского монастыря .

Таков список синодальных изданий; кроме того, старообрядцы много раз, начиная с конца XVIII века, перепечатывали 2-е (дониконовское) издание в разных своих типографиях.

Синтаксис

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

В языке пролог исходное множество формул , для которого ищется пустая резольвента, представляется в виде так называемых «дизъюнктов Хорна»:

Термы

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

 atom
 'Atom'

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

 X is 2 + 2.

Структуры представляют собой совокупности термов, заключенные в круглые скобки, в том числе и другие структуры. Структура обозначается именем (функтором), которое располагается перед круглыми скобками.

 book( 'Название', '2009', 'Спб', authors( 'Первый автор', 'Второй автор' ) ).

Ещё одной конструкцией являются списки, элементы которых заключаются в квадратные скобки. В основе списков в Пролог лежат связные списки.

 List =  a, b,  c, d ], e 

Правила

Правила в Прологе записываются в форме правил логического вывода с логическими заключениями и списком логических условий. В чистом Прологе предложения ограничиваются дизъюнктами Хорна:

 Вывод :- Условие.

и читаются так: «Заголовок ИСТИНА, если тело ИСТИНА». Тело правила содержит ссылки на предикаты, которые называются целями правила.

Встроенные предикаты
Значение: оператор с двумя аргументами. Определяет конъюнкцию целей.
Оператор определяет дизъюнкцию.

Факты

Факты в языке Пролог описываются логическими предикатами с конкретными значениями. Факты в базах знаний на языке Пролог представляют конкретные сведения (знания). Обобщённые сведения и знания в языке Пролог задаются правилами логического вывода (определениями) и наборами таких правил вывода (определений) над конкретными фактами и обобщёнными сведениями.
Предложения с пустым телом называются фактами. Пример факта:

 Кот( Иван ).

Этот факт эквивалентен правилу:

 Кот( Иван ) :- ИСТИНА.

[править] История

Впервые появился в начале 1970-х годов. Интерес к языку возрос в 80-х годах, когда японские ученые решили использовать его для создания систем искусственного интеллекта в рамках национальной программы «компьютеры пятого поколения».

После облома этого нацпроекта интерес к языку поугас, однако его до сих пор используют в некоторых вузах при изучении математической логики, искусственного интеллекта и т. п. матана. Студенты этому абсолютно не рады, олдфагам известен DOS-вирус «Гражданская оборона», целенаправленно поражающий Turbo Prolog и программы на нём.

Также фрагменты кода на Прологе были обнаружены в некой системной DLL от Windows NT4, код, предположительно, отвечал за привязку стека протоколов к сетевым картам.

[править] Примеры кода

Классика жанра:

helloworld:- write('Hello World!').

После чего этот скрипт загружается в интерпретатор и выполняется запрос:

?- helloworld.
Hello World!
true. 
 
?-

Чуть более сложный пример:

% это факты: PHP, Java и Visual Basic являются быдлокодерскими языками
быдлокодерский_язык(php).
быдлокодерский_язык(java).
быдлокодерский_язык(visual_basic).
 
% это тоже факты: Вася - программист на похапе, Петя - на асме, 
% Раджеш - на Visual Basic, Джон - на С и Адольф - на Brainfuck 
программист(вася, php).
программист(петя, assembler).
программист(раджеш, visual_basic).
программист(джон, pure_c).
программист(адольф, brainfuck).
 
% а это - правило вывода - "быдлокодер - это программист на быдлокодерском языке"
быдлокодер(Некто):- программист(Некто, Язык), быдлокодерский_язык(Язык).

Если пользователь хочет узнать из этих данных, кто же таки является быдлокодером, то он должен ввести запрос:

?- быдлокодер(А).
  A = вася;
  A = раджеш;
false.
 
?-

false в конце означает, что других быдлокодеров найти не удалось.

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

Впрочем, сегодня примерно те же конструкции используются в запросах к СУБД на языке SQL.

Еще более сложный пример. Уровень – Иван Братко:

nocheck(_, , _).
nocheck(Y, Y1 | Rest, N) :-
    Y =\= Y1,
    abs(Y1-Y) =\= N,
    N1 is N + 1,
    nocheck(Y, Rest, N1).
 
 
legal(, _).
legal(Y | Rest, NumList) :-
    legal(Rest, NumList),
    member(Y, NumList),
    nocheck(Y, Rest, 1).
 
 
n_queens(N, L) :-
    natural_number(N),
    numlist(1, N, NumList),
    permutation(NumList, L),
    legal(L, NumList).
 
 
natural_number(1).
natural_number(N) :- 
    M is N - 1, 
    natural_number(M).

– генерирует решение/я для задачи N-Queens.

Литература

  • Дьяченко Г. М., прот. Полный церковнославянский словарь. — СПб., 1900. Репринт: М.: Издат. отдел Московского патриархата, 1993. ISBN 5-87301-068-4.
  • Полный православный богословский энциклопедический словарь. — СПб., 1913. Репринт: London: Variorum reprints, 1971. SBN 902089-08-0.
  • Дёмин А. С. (ред.), Литературный сборник XVII века Про́лог / В серии «Русская старопечатная литература (XVI — первая четверть XVIII в.)». — М.: Наука, 1978.
  • Вознесенский А. В. Старообрядческие издания XVIII — начала XIX века. Введение в изучение. —— СПб.: Издательство С.-Петербургского университета, 1996. ISBN 5-288-01435-3.

Разминки с Прологом

Путешественники, привет.

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

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

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

Хватит вызывать заинтересованность, начинаю…

Диагностическая медицинская экспертная система на Prolog

Из песочницы

Вступление

Как то мне посчастливилось выбирать тему дипломной работы по специальности программная инженерия, и я выбрал написание экспертной системы, причем именно на языке Пролог. Хоть в промышленном программировании он почти не используется, он интересен в теоретическом плане позволяет самым быстрым способом прикоснуться к интеллектуальным системам(ИС). Также сам язык интересен в спортивном плане, так как заставляет мыслить в непривычной манере, отличной от мышления процедурного программирования и ООП, что является хорошой тренировкой для мозгов.
Использовалась реализация Prolog — Visual Prolog, с встроенными библиотеками GUI. Но если
вы хотите написать GUI на Qt/C++, то в документации есть инструкция, как импортировать программу в DLL, и скомпилировать ее вместе с C/C++ проектом. Отсюда следует, что совместить можно и с другими языками.
Вообще когда я работал над этим проектом, я не нашел примеров достаточно не примитивных, но в то же время и не настолько больших, как наворочен

Декларативное мышление

Привет странники

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

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

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

Что же, введение затянулось….

Занимательный пролог

Из песочницы

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

Но грустнее дело обстоит с логическим, продукционным программированием, которое можно представить только на Prolog.

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

Итого цель статьи: решить во время написания статьи задачу, которая была еще не известна на начало поста и показать свой код мысли, подтвердив это ходом и полученным рабочим решением. Но для этой проверки нужен арбитр, сам себя не рецензируешь-то. Выберу в этой роли leetcode.com.

1. Итак

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

[править] Ссылки

 Любой программист без словаря поймёт, что такое Prolog

Языки программирования  Промышленные: 1С • BAT • C# • C • C++ • Java • JavaScript (AJAX) • Pascal • Perl • PHP • Python • Ruby • ABAP • Ассемблер • Васик • ФортранЭзотерические: BrainFuck • Erlang • Forth • Haskell • LISP (My other car) • Prolog • Tcl • TeX
Профессии  Быдлокодер • Программист • Тестировщик • Хакер • Хеллоуворлдщик
Методы и стили  Reverse Engineering • Анти-паттерн • Выстрелить себе в ногу • Грязный хак • Код (индусский) • Костыль • Метод научного тыка • Помолясь • Свистелки и перделки
Прочее  ++i + ++i • Deadline • %s • 640 килобайт • CMS • Dummy mode • ЕГГОГ • Foobar • God is real, unless explicitly declared as integer • GOTO • Ifconfig • KISS • RegExp • SICP • sql.ru • Xyzzy • Дискета • Инжалид дежице • КОИ-8 • Лог • Ман • Рекурсия • СУБД • Тест Тьюринга • Умение разбираться в чужом коде • Фаза Луны • Фатальный недостаток

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

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

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

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

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

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

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

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

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

Критика

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

Другим часто подвергаемым критике свойством языка является отсутствие типизации (при этом в Visual Prolog — одном из объектно-ориентированных расширений языка — реализована строгая типизация, что, однако, снижает гибкость пролога).

В языке предопределён порядок обхода дерева решений «в глубину» и стандартизированы операторы, позволяющие вмешиваться в этот процесс (такие как оператор отсечения или ветвления ). Такая архитектура затрудняет автоматическое распараллеливание программ, которое позволило бы задействовать в поиске решения несколько процессоров или узлов сети.