Здравствуйте, недавно прочитал на лоре один пост и пальцы загорелись ответить.
Пост был о практическом кодировании одного из теоретических методов ИИ. Неожиданно для себя обнаружил что получилась у меня достаточно стройная схема построения современных программ, включая программы с ИИ с точки зрения методологии применения предметной области и кодирования теоретических алгоритмов.
Проще говоря, получилась у меня точная и формализованная инструкция для тех кто мучается очередным вопросами «А что имели в виду авторы вот этого математического труда, как это понимать и как это закодировать», «А как мне лучше реализовать такую-то функцию в моей программе, где это посмотреть», «А какая библиотека лучше и какой язык программирования использовать».
По предложенной мною ниже формальной системе можно даже сделать небольшую программку для автоматического ответа на этот вопрос. Уровень экспертной системы этой программки не выйдет за уровень ИИ игры морской бой, или пятнашки. Фактически это будет просто алгоритм, который с легкостью соорудит каждый выпускник ССУЗ или профильного (по информатике) класса средней школы. Единственно что, возможно, придется провести сбор реальных данных, в том числе через тесты и интервью, данных автоматизированных систем интернета и рейтинговых агентств, поскольку алгоритм потребует простого сравнения по численным атрибутам табличных данных.
Итак теперь к сути моей модели. Моя модель рассматривает программу как сущность состоящую из компонентов:
(список 1, далее [С1] )
1. Предметная область в которой работает программа
2. Желаемый результат программы
3. Требование, которое в рамках предметной области объясняет что нужно от программы и что программа должна сделать
4. Список научных и математических или нормативных источников, которые объясняют предметную область
5. Математическая или алгоритмическая модель решения задачи, которая стоит перед программой.
Здесь нужно сделать небольшое отступление и объяснить что по моей новой теории, ЯВУ сам по себе есть готовая корректная и доказанная алгебра, на дискретном множестве чисел. Множества дискретных чисел ЯВУ и множества настоящих чисел частично пресекаются, а также в ЯВУ используется классические действия над числами. Это дает нам возможность составить правила перехода из одной алгебры в другую, из классических, бумажных алгебр в алгебру ЯВУ и обратно. Переход от аналоговой алгебры в алгебру ЯВУ называется дискретизацией, а переход обратный назову «аналогизацией». И дискретизация и аналогизация это правила перехода, которые сами по себе являются алгеброй.
6. Записанные алгебры модели и алгебры переходов (подробнее что это такое далее)
7. Готовый ЯВУ, который способны исполнять имеющиеся РЭА, у ЯВУ естественно определена алгебра
8. Код решения задачи в виде программы на языке ЯВУ
9. Тестовые наборы данных, их вероятно много вариантов, напишу что знаю:
a. Уравнения, с помощью которых можно проверить корректность решения путем подстановки неизвестных
b. Таблицы соответствия входных и соответствующих им выходных данных
c. Экспертная оценка результата человеком-экспертом
10. Исполняемые коды, библиотеки, рантаймы, ОС, в общем все то что обеспечивает ожидаемое нами выполнение программного кода [С1:6]
11. Реальные данные, которые программа будет обрабатывать в процессе своей работы на благо постановщика задачи. А также различные устройства ввода-вывода цифровой информации.
Далее я буду употреблять термин «алгебра», подразумевая не отрасль науки, а формально описание единицы научного смысла из раздела математики «абстрактная алгебра». Если кто не помнит этот раздел математики рассматривает и формализует такие сущности как, поля, кольца, группы, множества и «алгебра». Вот это последнее я и буду иметь ввиду ниже.
Итак, процесс создания любой программы (здесь исключим неалгоритмические методики типа нейросетей, программ квантовых компьютеров и всего такого, всего что вычисляет задачу «очень хитрым методом») можно представить как:
(Список 2, далее [С2])
1. Составление приблизительной математической или формальной словесной модели решаемой задачи в контексте предметной области. С использованием набора сущностей и инструментария и в контексте:
a. Формального словесного описания модели предметной области
b. Физической модели предметной области
c. Другой научной модели предметной области
d. Математической модели предметной области
Здесь часто проводится большая подготовительная работа, результатом которой является список книг по тематике, перечень нормативных документов, техническое задание, научное обоснование и прочий как правило текстово-графический материал с максимальной конкретизаций предметной области и задачи, которая должна решить программа внутри этой предметной области
2. Составление точной математической модели задачи с указанием применяемой алгебры
3. Решение задачи в формулах этой алгебры [C2:2]
4. Составление правил дискретизации для множеств алгебры [C2:2] и алгебры нашего ЯВУ [C2:5]. Возможно эти правила встроены в систему вввода-вывода ЯВУ.
5. Этап на котором мы должны иметь готовую алгебру ЯВУ, работающую и вычисляемую РЭА, на базе которых сделан ЯВУ
6. Перевод решения [C2:2] в алгебру ЯВУ [C2:5]. Этот процесс называется сейчас кодированием, а раньше его называли программированием
7. Дискретизация наборов данных [C1:9]
8. Тестирование программы на ЯВУ на наборах данных [C2:7]
9. Установка и поставка готовой программы заказчику
10. Эксплуатация программы заказчиком
Во время когда мы выполняем пункт [C2:10] любая программа работает по следующей схеме:
(Список 3, далее [С3])
1. Дискретизация реальных данных[C2:9] эксплуататора
2. Выполнение операций алгебры [C2:5] процессором или процессорами РЭА
3. Аналогизация полученных результатов работы программы для нужд эксплуататора
А теперь к практическому применению такой схемы, при любых проблемах сначала выясняем к какому из список принадлежит проблема, к [С1],[С2] или [С3].
Далее определяем к какому пункту относится проблема ( приближенно принимая что списки требует последовательного линейного выполнения своих пунктов для реализации заданной программы ). Определив этот пункт с легкостью понимаем что нужно сделать для решения задачи на данном этапе её постановки.
Типичные задачи:
«Как мне повернуть картинку на пиксельном контексте?» — Вычисляем недостающие компоненты для решения задачи. Понимаем что человеку недостает знаний в области матричных, афинных преобразований систем координат то есть у него нет пунктов [C1:4], [C1:5], [C1:6]. Даем ему эту информацию в виде ссылок.
«Какую библиотеку лучше всего использовать для написания моего сайта?». Понимаем что человек вероятнее всего уже знаком с основными концепциями веб-программирования, и ему нужно только помочь с выбором библиотеки. Значит ему следует определиться только с пунктами [C1:7], [C1:8]. Большинстов ответов на такие вопросы могут быть даны на основании простых статистических данных и простого автоматизированного тестирования вопрошающего. К примеру статистическими данными могут быть рейтинги языков программирования, или процент применяемости фреймворков на продакшене, а также спецификации разных ЯП.
В общем если кому и нтересно, то я утверждаю что по предлагаемой мною схеме можно построить автоматический отвечальщик на большинство вопросов технических программистских форумов, в том числе построить отвечальщик на самые кодерские вопросы по синтаксису и семантике ЯП и библиотек. Главное это формально представить алгебры задачи из предметной области. алгебры ЯП, и алгебры переходов от предметной области к ЯП (сниппеты как частный пример ).
Автор: ryzkot