Данная тема способна вызвать скорее негативную реакцию благодаря тому, что большинство разработчиков являются ее противниками. Все потому, что интенциональное программирование, по сравнению с классическим, имеет существенные недостатки:
Но у него есть и существенные достоинства:
Для меня наибольший интерес представляет последний пункт, позволяющий изменять поведение механизированной системы на лету в процессе коммуникации. В этом случае язык может выступать и как средство для манипуляций с данными и как средство для обмена данными. Это наделяет интенциональное программирование способностью к реализации своего потенциала в нишевых областях, таких, как робототехника, когда механизм сможет получать описание поведенческих алгоритмов, а так же любую другую информацию через единый коммуникационный интерфейс, при помощи единого языка.
На самом деле в загловке я слукавил и речь пойдет все таки о плановом языке, но основанном на элементах естественного языка, и который, в процессе развития, имеет возможность трансформироваться практически в естественный.
Что касается недостатков программирования на естественном языке, то проблема скорости работы в какой-то мере решается предобработкой во время загрузки инструкции в память, чтобы при повторном ее вызове исключить ресурсоемкие процедуры. Проблема длины инструкциий при наборе решается умным предикативным вводом в среде разработки. Проблема единообразия исходного кода решается цветной раскраской инструкций. Например, так:
Для решения проблемы слабой детерминированности естественного языка предлагается ввести правило постройки программной инструкции на основе так называемых валентностей и триад на их основе. Идея заключается в постоении всех инструкций из триад — строительных блоков, которые состоят из трех компонент:
Триада состоит из двух понятий, соединенных между собой смысловой связкой. Такая смысловая связка в лингвистике называется валентностью. В качестве понятий могут выступать материальные и нематериальные объекты, действия, свойства, числовые значения, и пр. В качестве примера можно рассмотреть художественную фразу: «Он положил книгу туда.» В этой конструкции глагол «положил» имеет три заполненных валентности: кто положил, что положили, куда положили. Валентности потенциально позволяют образовывать смысловые связи одного понятия с другими. Так, в данном примере понятие «положил» образовывает связь с понятием «Он» через валентность «кто», с понятием «книга», через валентность «что», с понятием «туда» через валентность «куда». Понятие «Он» называется актором (кто выполняет действие), а понятие «книга» называется актантом (над чем выполняется действие).
Разные глаголы имеют разное количество открытых валентностей, обычно от 1 до 7. Например, у глагола «переместить» по сравнению с глаголом «положить» появляется дополнительная валентность «откуда». Также, валентности могут быть не только у глагола, но и у других понятий. Например в предложении «Он положил большую книгу туда.» у понятия «книга» заполнилась валентность «какая» благодаря понятию «большая».
Корректное определение потенциальных (незаполненных) валентностей не всегда легко реализуемо, особенно, если конструкция предложения достаточно сложная. Поэтому на начальном этапе было бы неплохо указывать в инструкции все валентности. На основе примера это выглядело бы так:
Это предложение является фреймом — содержит один глагол, поэтому именно глагол является началом отсчета, от него распростаняются валентности в обе стороны.
Но введение обязательных валентностей создает проблему, которая заключается в том, что предложение имеет линейный вид, а валентная структура предложения имеет вид разветвленного дерева с одним корнем — глаголом. Для решения этой проблемы в предложение вводятся круглые скобки. Поскольку без скобок валентность «куда» связывала бы понятие «туда» с понятием «книгу», а не с понятием «положил».
Это можно объяснить подробнее на другом, более техническом примере. Допустим, имеется переменная Переменная1, которой нужно присвоить значение «1». На естественном языке такая инструкция выглядела бы так:
На языке с явно указанными валентностями эта инструкция будет выглядеть так:
В этом примере у понятия действия «присвоить» явно заданы две валентности: присвоить что и присвоить чему. Скобки тут необходимы, чтобы иметь возможность задать в линейном предложении древовидную структуру:
Передача информации при помощи таких конструкций с явным указанием семантических связей также возможна. Например, предложение:
можно разложить следующим образом:
Получаем древовидную структуру:
Еще один пример:
можно преобразовать так:
Получаем древовидную структуру:
Выходит что-то вроде «человеческого» ассемблера, который обладает коммуникативной и интуитивно-наглядной функциями естественного языка (так, как использует все те же слова из естественного языка) и в то же время прост в реализации. Для человека же выполнять такое предварительные преобразования труда не составляет. В перспективе можно будет попытаться сделать программную предобработку уже действительно естественного языка с автоматическим выявлением всех велентностей. Предложенный способ вносит некоторые дополнительные ограничения, которые еще не полностью изучены, но он также делает запись инструкций более формальной.
- слабая детерминированность инструкций на естественном языке
- значительная длина каждой инструкции, что заставляет вводить довольно объемный код
- код выглядит единообразным, что может затруднять его восприятие и процесс поиска
- сниженная скорость работы программы за счет анализа большего количества символов
Но у него есть и существенные достоинства:
- человеку интуитивно понятны все инструкции, нет необходимости в предварительном изучения нового языка
- каждая инструкция однозначно отражает намерение разработчика, ее написавшего
- природная способность естественного языка к обобщению и созданию новых уровней абстракции (как для объектов, так и для методов манипуляции с ними) на основе существующих
- процесс программирования на естественном языке возможен не только в чисто императивном виде, но и в виде общения
Для меня наибольший интерес представляет последний пункт, позволяющий изменять поведение механизированной системы на лету в процессе коммуникации. В этом случае язык может выступать и как средство для манипуляций с данными и как средство для обмена данными. Это наделяет интенциональное программирование способностью к реализации своего потенциала в нишевых областях, таких, как робототехника, когда механизм сможет получать описание поведенческих алгоритмов, а так же любую другую информацию через единый коммуникационный интерфейс, при помощи единого языка.
На самом деле в загловке я слукавил и речь пойдет все таки о плановом языке, но основанном на элементах естественного языка, и который, в процессе развития, имеет возможность трансформироваться практически в естественный.
Что касается недостатков программирования на естественном языке, то проблема скорости работы в какой-то мере решается предобработкой во время загрузки инструкции в память, чтобы при повторном ее вызове исключить ресурсоемкие процедуры. Проблема длины инструкциий при наборе решается умным предикативным вводом в среде разработки. Проблема единообразия исходного кода решается цветной раскраской инструкций. Например, так:
Для решения проблемы слабой детерминированности естественного языка предлагается ввести правило постройки программной инструкции на основе так называемых валентностей и триад на их основе. Идея заключается в постоении всех инструкций из триад — строительных блоков, которые состоят из трех компонент:
Триада состоит из двух понятий, соединенных между собой смысловой связкой. Такая смысловая связка в лингвистике называется валентностью. В качестве понятий могут выступать материальные и нематериальные объекты, действия, свойства, числовые значения, и пр. В качестве примера можно рассмотреть художественную фразу: «Он положил книгу туда.» В этой конструкции глагол «положил» имеет три заполненных валентности: кто положил, что положили, куда положили. Валентности потенциально позволяют образовывать смысловые связи одного понятия с другими. Так, в данном примере понятие «положил» образовывает связь с понятием «Он» через валентность «кто», с понятием «книга», через валентность «что», с понятием «туда» через валентность «куда». Понятие «Он» называется актором (кто выполняет действие), а понятие «книга» называется актантом (над чем выполняется действие).
Разные глаголы имеют разное количество открытых валентностей, обычно от 1 до 7. Например, у глагола «переместить» по сравнению с глаголом «положить» появляется дополнительная валентность «откуда». Также, валентности могут быть не только у глагола, но и у других понятий. Например в предложении «Он положил большую книгу туда.» у понятия «книга» заполнилась валентность «какая» благодаря понятию «большая».
Корректное определение потенциальных (незаполненных) валентностей не всегда легко реализуемо, особенно, если конструкция предложения достаточно сложная. Поэтому на начальном этапе было бы неплохо указывать в инструкции все валентности. На основе примера это выглядело бы так:
Он ?кто положил (?что книгу, ?куда туда).
Это предложение является фреймом — содержит один глагол, поэтому именно глагол является началом отсчета, от него распростаняются валентности в обе стороны.
Но введение обязательных валентностей создает проблему, которая заключается в том, что предложение имеет линейный вид, а валентная структура предложения имеет вид разветвленного дерева с одним корнем — глаголом. Для решения этой проблемы в предложение вводятся круглые скобки. Поскольку без скобок валентность «куда» связывала бы понятие «туда» с понятием «книгу», а не с понятием «положил».
Это можно объяснить подробнее на другом, более техническом примере. Допустим, имеется переменная Переменная1, которой нужно присвоить значение «1». На естественном языке такая инструкция выглядела бы так:
присвоить переменной Переменная1 значение 1.
На языке с явно указанными валентностями эта инструкция будет выглядеть так:
присвоить (?чему Переменная1, ?что 1).
В этом примере у понятия действия «присвоить» явно заданы две валентности: присвоить что и присвоить чему. Скобки тут необходимы, чтобы иметь возможность задать в линейном предложении древовидную структуру:
присвоить ?чему Переменная1 ?что 1
Передача информации при помощи таких конструкций с явным указанием семантических связей также возможна. Например, предложение:
Земля это планета солнечной системы.
можно разложить следующим образом:
Земля ?что есть ?что планета ?чего системы ?какой солнечной.
Получаем древовидную структуру:
есть ?что Земля ?что планета ?чего системы ?какой солнечной
Еще один пример:
Атом водорода имеет один электрон.
можно преобразовать так:
водорода ?чего атом ?что имеет (?что электрон, ?сколько 1).
Получаем древовидную структуру:
имеет ?что атом ?чего водорода ?что электрон ?сколько 1
Выходит что-то вроде «человеческого» ассемблера, который обладает коммуникативной и интуитивно-наглядной функциями естественного языка (так, как использует все те же слова из естественного языка) и в то же время прост в реализации. Для человека же выполнять такое предварительные преобразования труда не составляет. В перспективе можно будет попытаться сделать программную предобработку уже действительно естественного языка с автоматическим выявлением всех велентностей. Предложенный способ вносит некоторые дополнительные ограничения, которые еще не полностью изучены, но он также делает запись инструкций более формальной.