Pull to refresh

Comments 16

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


По существу статьи. Как мне кажется, самыми показательными примерами эффективного применения Прлога являются те самые задачки из серии "Эйнштейн говорил, что эту задачу может решить только один процент населения". Ну там еще обычно перечисляется гора фактов про то кто курит трубку, кто любит бифштекс, а кто женат на миссис Хопкинс. Ещё есть серия детективно-логических задачек с распутыванием фактов.
В институте же меня, как обладателя большой шоблы родственников разного колена, сильнее всего торкнуло применение пролога для работы с базой данных родственных связей. Кто там кому шурин, кто кому деверь, тётя или внучатый племянник — разбираться в этом страшная морока. А прога щёлкает и перебирает сочетания и хитросплетения связей на раз-два, причем описывается всё на заглядение прозрачно и читабельно.


А ещё большой не закрытый гештальт у меня подвис с прологом в применении его для системы квестов в игровой индустрии. Когда я ворвался неопытный в первый свой геймдев-проект (ага, ММОРПГ в открытом мире=), у меня не хватило времени на внедрение пролога для квестовой логики, я ограничилася обычными тупыми конечными автоматами. Однако, какой потенциал!


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

Спасибо за такую позитивную оценку!
Идеи действительно интересные, а комментарий читается с удовольствием.

Насчёт логических задач про «того самого студента»: действительно, их решение доставляет удовольствие, это ярко и способно занять на часы, но, всё же, и тут моё личное мнение, новичок не сразу свяжет их с практическим применением пролога. Но решать определенно стоит!
> Ещё есть серия детективно-логических задачек с распутыванием фактов…
Можно ссылку?
> по принципу известной игры «Зоопарк»
И на это ссылку, плз. Подозреваю, что это нечто похожее на Акинатора

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

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

Нашёл.
Это журнал «Наука и жизнь» №12 за 1986, В. Щеглов, «Животные (игра)».

Лично для меня пропуском в мир программирования стал цикл статей «Человек с микрокалькулятором» в этом журнале, посвященный калькулятору Б3-34.

Офигеть! Как? Это в голове такой индекс по статьям из журналов?
Не затруднит фоточку со статьёй сюда запостить? Очень интересно.

Офигеть! Как?

Помню, что, на заре моей компьютерной грамотности, оную я черпал именно из журнала «Наука и жизнь». Первые шаги в освоении каких-либо знаний обычно запоминаются прочно. Вот и я вспомнил, что читал разбор этой программы на Бэйсике. Рубрики, посвященные азам программирования, назывались «Человек с микрокалькулятором» и «Человек и компьютер», про микрокалькулятор здесь явно не в кассу. Вбиваю в Яндекс «наука и жизнь человек и компьютер»:
yandex.ru/search/?text=наука%20и%20жизнь%20человек%20и%20компьютер
и вон третья ссылка со словами "Архив публикаций рубрик «Человек и компьютер», «Человек с микрокалькулятором» и других публикаций на тему программируемых калькуляторов из журнала «Наука и жизнь»." намекает, что там и надо смотреть.
Остаётся только пробежать страницу глазами, найти упоминанние статьи «животные» и понять, что это и есть искомое.

Вот такой нехитрый алгоритм.
Ссылки на саму статью в перечне нет, соответственно и фото предоставить не могу.

ЗЫ. Да вот вам ссылочка:
http://publ.lib.ru/ARCHIVES/N/%27%27Nauka_i_jizn%27%27%27/_''Nauka_i_jizn'''_1980-89_.html
http://publ.lib.ru/ARCHIVES/N/%27%27Nauka_i_jizn%27%27%27/''Nauka_i_jizn''',1986,N12.[djv-fax].zip
Спасибо за статью.
А можно с помощью логического программирования вычислять, скажем, линейную или логическую регрессию?
Учил Пролог в школе, но применений в реальной практике не могу пока найти.
К сожалению, я не являюсь специалистом в области анализа данных, поэтому дать ответа, который бы удовлетворил Ваш интерес, не смогу.

Замечу только, что Пролог (с учётом механизма отсечения (cut)) обладает полнотой по Тьюрингу, а значит на нем реализуема любая вычислимая функция.

Пролог не делает никаокго волшебства по сравнению с императивными программами. Напротив, нужно изголяться и оптимизировать её перебор дерева решений всякими отсечениями. В среднем, как верно отметил, кажется, автор статьи, пролог будет медленнее, чем хорошо оптимизированное решение императивным способом.
Однако, языки программирования придуманы не для компьютеров, а для людей, чтобы на них легче было изъясняться и легче читать. Пролог позволяет лаконично формулировать условия задач, которые совместимы с дискретной логикой. Также можно исхитриться и делать решения в обратимых линейных операциях вроде сложения, вычитания. Умножение на ноль уже будет вносить трудности, а всякие синусы и прочие нелинейности и подавно.
Если дерево решений не разнесёт комбинаторным взрывом, то можно добиваться достаточно эффективных решений, чтобы соблазниться простойтой и читабельностью пролога и не погрязнуть в его слабых местах.
На прологе хорошо решать задачи, связанные с контролем зависимостей (даже. вроде, кто-то говорил, что в системах кнтроля версий таки используетя). В геймдеве, как я упоминал. роль пролога, мне кажется, недооценена. Экспертные системы, втом числе со взвешенными правилами тоже можно легко формализовать на этом языке. Код н апрологе вполне можно обрабатывать как данные. например, автоматически генерировать факты на основе данных из БД и внешнего мира, генерировать просты предикаты логических зависимостей, взвешивать эти предикаты и осуществлять рейтингование варантов решений.


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


Нет ничего хуже, чем "Умный" Дом, основанный, скажем, на нейронных сетях, который не может "объяснить" почему он принял то или иное решение. таким домом трудно управлять. Он — слишком "черный ящик", а в черном ящике жить не очень уютно.


Ещё. мне кажется, пролог еще вспомнят в контексте всяких голосовых помощников и электронных секретарей. Оптимальные решение конфликтов с расписаниями, логика доступности локаций, логика учета интересов…

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


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


  1. Каково состояние языка и отрасли сейчас? Компиляторы/интерпретаторы, диалекты, как часто выходят новые версии и т.д. (читайте — «живое» ли оно ещё).
  2. Рекомендуемые книги, курсы? Насколько они свежие и соответствуют текущим реалиям?
  3. Есть ли конкретные опенсорс-проекты, в которых пролог используется? Думаю, может быть полезно, если захочется подсмотреть best practices.
  4. Всё остальное, что может помочь в изучении.

Считайте это реквестом :)

Спасибо за фидбек!
Хочу отметить, что целью написания статьи было именно замотивировать изучать логическое программирование (!= Пролог), так как те вводные статьи, которые я нашел, недостаточно просты и понятны.

Ответы на вопросы 1 и 3, как мне кажется, неплохо даны здесь: habr.com/ru/company/ruvds/blog/525014

На второй вопрос: курсы — увы, и здесь, думаю, всё ясно; книги широко представлены в тех статьях, о которых Вы упомянули, и во многих других.

Думаю, было бы действительно полезно и нужно собрать подробные ответы на эти вопросы, но это материал для отдельной статьи. Не отрицаю, что она может появиться и за моим авторством :)

Спасибо заранее! Буду ждать.

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

А задачки типа эйнштейновой куда проще решать специализированными программами, работающими по принципу constraint programming. Например, очень удобная MiniZinc.

Мне было бы интересно посмотреть на решение задачи, где исходные данные поступают из текстового файла некоторого формата. Например банальный word-count.

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

Sign up to leave a comment.

Articles