Как стать автором
Поиск
Написать публикацию
Обновить
-0.3

Prolog *

Язык и система логического программирования

Сначала показывать
Порог рейтинга
Уровень сложности

LLM AI на «стероидах» прошлой эры, для ИИ новой эры. Круг замкнулся

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

В своих размышлениях и прошлых попытках разработки ИИ, я добрался до сего дня llm - large language models. Однако этим моделям свойственны некоторые точности с контролем выходного результата, а именно почему получилось именно так.

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

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

Техническое задание (ТЗ) на проект, основанный на извлечении триплетов из текста, логическом выводе и масштабируемой обработке графа знаний с GPU-ускорением:

---

📘 Техническое задание: Система извлечения и логического анализа триплетов с GPU-ускорением

🔹 Цель проекта

Разработка гибридной экспертной системы, способной:

- Извлекать триплеты из неструктурированного текста с помощью LLM

- Хранить и обрабатывать триплеты в логической форме (Prolog)

- Масштабировать поиск и reasoning через кластеризацию и GPU-графовые вычисления

---

🔹 Архитектура системы

1. Модуль извлечения знаний

- Вход: текстовые данные (статьи, документы, диалоги)

- Выход: триплеты вида <субъект> — <предикат> — <объект>

- Инструменты: LLM с кастомным промптом, поддержка хотя бы одного языка. Перевод это техническая обвязка.

Читать далее

Новости

Лабиринты и прологи

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

Знакомство с языком программирования пролог.

Когда кто-то проходит лабиринт за тебя, то время летит незаметно. Если не происходит зависания, то приходит ответ. А теперь стоит разобраться, как любые вопросы превращать в лабиринты.

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

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

Читать далее

Задача Эйнштейна. Пролог к валидации конечных автоматов

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

TL;DR: решение задачки Эйнштейна на прологе и объяснение, зачем мне вообще пролог в 2025 году.

В библиотеке finitomata конечный автомат задаётся набором переходов в текстовой форме в формате plantuml и/или mermaid (с поддержкой пользовательских форматов, но это не суть). На этапе компиляции описание проверяется со всех возможных сторон на корректность (нет обособленных состояний, одно и только одно начальное, для всех неоднозначных переходов определены резолверы, ну и так далее). Долгое время добавление нового правила приводило к написанию очередного велосипеда по его проверке. Все-таки, эликсир — не самый удобный инструмент для валидации правил.

Наконец, мне все это надоело. Заколачивать утюгом шурупы — весело, но малоэффективно. Я даже попробовал прикрутить Coq, но микроскоп тоже плохо подходит для довольно грубой работы с шурупами. И тут меня осенило: пролог же. Оффтопик: почему-то вика в этом месте не переведена на русский язык, если эту заметку читает кто-то, кому не противно редактирование вики — сделайте доброе дело, пожалуйста.

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

Посмотреть на код

Prolog: три портрета через 50 лет

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

В 2024 году языку логического программирования Prolog исполнилось пятьдесят лет! Оказывая дань уважения, мне хотелось бы в небольшом историческом очерке рассказать о научном контексте семидесятых годов прошлого века, в котором зародилась как теория логического программирования, так и её реализация — язык Prolog. Более подробного и полного изложения вы не найдёте не только на страницах «Хабра», но и в русскоязычном сегменте Интернета.

Существует старая «бородатая» шутка полувековой давности — язык Prolog создали в 1974 в Эдинбурге и реализовали в 1972 в Марселе. Хотите узнать как это произошло?!

Читать далее

Пролог в Perl

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

Прогресс неумолимо стремится вперёд, заставляя программистов использовать git, docker и chat-GPT. В то же время древние технологии 60-х, 70-х, 80-х, 90-х и 2000-х предаются забвению...

Читать далее

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

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

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

Читать далее

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

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

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

Читать далее :-)

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

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

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

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

Читать далее

Как белорусы уже 30 лет делают искусственный интеллект при помощи ТРИЗ

Время на прочтение4 мин
Количество просмотров58K
image

«Это не программисты, это не разработчики, это — камикадзе.»

  • Минские студенты в 1987 году во главе с Валерием Цуриковым принялись программировать «Изобретающую машину» — софт, который бы усиливал интеллект инженеров и помогал изобретать. Кооператив был успешен и захватил 95% рынка бывших в странах СССР.
  • Когда СССР прекратил существовать, Валерий Цуриков перебрался в Бостон и основал свой «стартап» в 1992 году: Invention Machine Corp. Им заинтересовались Samsung, Boeing, NASA, Sony, Procter&Gamble.
  • В 1998 году журнал NASA провел опрос среди подписчиков и по результату голосования «Изобретающая машина» стала «the most innovative product in USA».
  • В 2012 году IHS inc купила Invention Machine Corp за 40 миллионов долларов.


30 лет назад Валерий Цуриков в спортивной сумке провез через границу 5000 фунтов и в Лондоне купил лицензионный язык «Пролог» (пожалуй, единственный лицензионный пакет на территории бывшего СССР). «Пролог» тогда был запрещённым к экспорту в страны СССР.

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

Через год профессору Ковальски, создателю языка «Пролог», показали рабочую систему и он не поверил, что она работает. Это был первый промышленный софт на «Прологе».
Читать дальше →

Можно ли использовать декларативный и императивный стили написания программ одновременно?

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


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

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

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

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

Данная статья — размышление о совместимости декларативной и императивной парадигм программирования и возможности их одновременного использования в рамках одного языка программирования одновременно.

Читать дальше →

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

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

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

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

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

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

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

Давайте разбираться

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

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

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


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


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


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


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

Читать дальше →

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

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

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

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

Ближайшие события

Проблема логических языков программирования

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Давайте рассуждать логически

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

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

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

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

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

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

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

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

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

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

Читать далее

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

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

Навеянное Prolog-ом коммерческое решение пробыло больше 10 лет в эксплуатации

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


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