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

Комментарии 15

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

Спасибо большое!

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

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

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

А можно уточню?: в методе резолюций на прологе (или других логических ЯП) возможно написать переводчик, решающий, скажем, некоторые задачки школьной геометрии по шаблонам, принимая на вход/-человеческий текст условия-/?

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

Мэри любит яблоки. Бэт любит то же, что и Мэри. Запрос: Что любит Бэт?

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

likes(mary, apples). likes(beth, X):- likes(mary, X).

goal likes(beth, Y), write(Y).

интересно. Просто ради завершенности статьи скажу то, чего в ней еще не звучало:
1.В моем переводчике нет абсолютно никаких требований к синтаксису (правила задаются как множества, знак = здесь чисто для наглядности)
2.Таким образом, он одинаково хорошо работает с любыми правилами
3.Что самое удивительное и, на мой взгляд, главное, - мне удалось упростить идею на столько, что она могла бы уместиться в 100 строк кода на Питоне

Так что еще раз спасибо за наводку - начну изучать. Но (снова вопрос опустошения чаш) и мое решение - не совсем велосипед :)

Ниже пример на прологе (кавычки опущены ради краткости):

нет_требований_к_синтаксису([м,а,м,а|input],[р,а,м,а|result]):-нет_требований_к_синтаксису(input,result).
нет_требований_к_синтаксису([р,а,м,у|input],[м,а,м,у|result]):-нет_требований_к_синтаксису(input,result).
нет_требований_к_синтаксису([],[]).

Пример меняет фразу "мама мыла раму" на "рама мыла маму". В произвольном множестве. Без требований к синтаксису.

Я имел в виду немного другое, сейчас поясню
Можно ли на прологе (/др. ЯП)
а) написать программу, которая обрабатывала целый текста, /-буквально, как я его сейчас пишу-/? (верю, что можно, если постараться)
б) написать программу, которая при этом выглядит как такой же текст, программировать текстом? Если да, то такая машина может самопрограммироваться - пишет выход, получает его на вход, и т.д.
Вот мой переводчик можно. В вашей программе я все еще вижу синтаксис, только не во входном условии - а в самом коде: скобки, запятые, input, result... В программируемом коде переводчика нужно лишь писать любые конструкции символов, надо только не перепутать графу в интерфейсе, в которую эти символы писать

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

Для примера возьмите язык форт, в нём можно дополнять языковые конструкции "на лету", но кто сегодня использует форт? Практически никто. Чуть шире аудитория у лиспа, но и там нет никаких значимых достижений, связанных с изменчивостью программ.

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

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

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

Как ни жаль, но вы сильно отстали от своего времени. Если не наверстаете упущенные десятилетия, то будете выглядеть просто смешно, повторно изобретая всё новые и новые велосипеды.

окей, я не все понял из вашего сообщения, но задам вопрос не об этом:

Как вы думаете, какие темы изучить, и с чего начать?
Мой предположительный перечень:
-логические языки: лисп, пролого, форт
-то, о чем я только слышал: як, бизон (если можно, поясните, пожалуйста)

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

Как ещё один математичный вариант можно рассмотреть марковский алгоритм (ссылка в комментарии ниже). Хотя и этот подход можно встретить в некоторых учебниках по мат.логике.

Собственно программирование заменой частей программы при помощи алгоритма, адаптированного именно к подстановкам, похожего на ваши предложения, реализована где-то в 60-х в языке Рефал. Но этот язык не нашёл массового применения. Хотя сам принцип преобразования входной строки повторяющимися заменами в нём отражён очень наглядно.

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

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

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

У пролог- системы встроенный обратный логический вывод. Если вы сами уже запрограммировали машину логического вывода, то вам и пролог не нужен, имхо. И одно небольшое замечание про бесконечный алфавит. Символы счётного алфавита занумеруем натуральными двоичными числами - получили конечный алфавит))

про алфавит - красиво! Впрочем, я уже написал об этом: пишется добавочный Язык-утилита, который производит алфавит другого Языка, - ровно то, о чем вы пишите :)

Да, теперь поняла. То есть как для U-машины Тьюринга (интерпретатора) алфавит и состояния любой другой машины Т кодируются в виде последовательностей из ее (U-машины) символов (сам принцип кодировки описан у Кузнецова, Адельсона-Вельского "Дискретная математика для инженера").

То, что предлагает автор, больше всего напоминает Нормальный алгоритм Маркова

Да, он полный по Тьюрингу. Да, на нём можно реализовать любой алгоритм. Но смысл? Всё равно, это ручное программирование. А значит, миллион часов кропотливого труда (что собственно и обходит ChatGPT - он убирает ручной труд, заставляя пахать железку). Вручную, гораздо продуктивнее писать на современных языках: питонах-хаскелях-джаваскриптах, с большой экосистемой, библиотеками, тулзами. Сложность никуда не денется. Если для перевода с языка X на язык Y нужно 100 тысяч правил (и никуда от этого не деться, такова предметная область), лучше их писать на языке с хорошей структурируемостью и модульностью, а не на брейнфаке или машине тьюринга.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории