Для интересующихся новыми концепциями
Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті
1. Введение Я сегодня хотел бы остановиться на одной серьезной проблеме, которую, как мне кажется, решил или как минимум, на пути к решению. Перед тем как программист примется за свое любимое дело, обычно происходит формулировка решаемой задачи. Проблема возникает как раз в этом месте. Ибо возникает необходимость организовать свои (а еще проблемнее когда чужие) мысли в виде алгоритмов и объектов. Т.е. в форму, которую «понимает» компьютер. Этот язык однозначен и жестко регламентирован, чего не скажешь о том, что творится в голове, даже если она собственная. А если это голова заказчика, то проблем возникает еще больше. Формулируется это как «семантическая разница» между языком и мышлением человека и языком компьютера. Попытки приблизить образ мышления человека и компьютера реализованы в так называемых декларативных языках. Например, в языке Prolog (парадигма логического разбора) и в функциональном программировании Lisp, Nemerle (функциональная парадигма). Я предложу свое решение, объединяющее некоторые из этих парадигм и заодно нейронные сети. 2. События. Высказывания. Понятия. Для начала сформулируем определение события. Интуитивно мы понимаем и даже успешно работаем с событиями, но я здесь выскажу свои соображения, и начнем с истины по Тарскому. «Высказывание Р истинно тогда и только тогда, когда "Р"» Это не масло масляное, а глубокая или простая мысль в зависимости от интеллекта читателя и я немного на ней остановлюсь. Высказывание «Снег белый» может быть и истинным и ложным в зависимости от того какой, собственно, цвет снега. Т.е. вопрос об истинности высказывания решается на другом логическом уровне, а не в самом высказывании. Это говорит об иерархичности семантики языка. Бертран Рассел писал об логических уровнях. Но, мы эту философию пропустим, а поговорим о программировании и компьютерах. Набор всех высказываниях (базовый набор) о памяти ограничен (=0, >0 и т.п.) Так вот проверка этих (и других) высказываний и назовем событием. (Это определение требует развернутого анализа, но это сделаем позже). Любое высказывание в программировании это выражение. Любое выражение, в конечном счете, сводится к анализу памяти, и к базовому набору высказываний. Имя этого выражения можно назвать новым событием или понятием. Так, например, события Key_Down и Key_Up это не что иное, как проверка на ноль или единицу. Приобретая новое имя, событие приобретает новый семантический смысл, оставаясь тем же процессом проверки ячейки памяти. Одновременно с приобретением нового смысла событие порождает новое понятие. Так, например, понятие Positive есть не что иное, как событие >0. Осталось два шага до понимания, что такое логический разбор и интерпретация как в Prolog. 3. Подписки, взаимодействие. Организация взаимодействия событий с концептами (объектами) происходит с помощью подписок. Подписка определяет действия по выполнению события (реакция) и начинается с стрелки вправо «→» после интересующего нас выражения, за которой следует имя состояния и далее реакция на него. Подписка имеет секцию Else, которая определяет реакцию на не истинность высказывания. Синтаксис подписки Подписка = «→»"Имя события" Реакция {«Else» Реакция }01 Пример. 1. Вычисление НОД Nod a ~ b→ > {a=a-b Nod} Else {a=b-a Nod} Данный пример выполняет сравнение а и b и присваивает а, в случае a>b разность a-b, и b-a в противном случае. После чего опять производит сравнение (переход по адресу Nod). Знак «~»- операция сравнения. Знак «>»-это не операция, а имя класса события. Работа событийной машины заключается в адресации концепта (с параметрами или без), проверку на наличие подписок и, если они есть выполнения концепта, после чего проверка на события указанные в подписке и ее реализация при выполнении события. Выполнение концепта зависит от типа контента, а их три. Атрибуты, выражения и события. Выполнение атрибута заключается в выполнении операций чтения/записи, операции просто в выполнении и в событии выполняется выражение этого события. Если адресуемый контент объединен в группу, то выполняется группа. 4. Сортировка. Классическим примером начинающего программиста (после «Hello Word») является программа сортировки. Каждый может вспомнить свои ощущения при работе с этим шедевром человеческой мысли и изменения в сознании от постановки задачи до реализации программы. И на этом моменте я хотел бы остановиться. Постановка задачи элементарная. Отсортированный массив предполагает упорядочивание элементов массива в порядке убывания (или возрастания). Но, вот циклы, проверки, перестановки и все что называется алгоритмом, далось далеко не сразу. Превратить постановку задачи в алгоритм потребовало некоторых усилий. Повторюсь. Задача то элементарная. Вот бы такой язык, что бы сразу определить проверки и перестановки (т.е. написать формулировку в терминах постановки задачи) и что не морочить голову. И у нас такое предложение есть!!! Вот оно: Пример 2. Сортировка массива A ‘Создаем массив Integer A Integer A [] → “Change Value” ‘Две подписки на событие “Change Value” ‘В первой сравниваем текущий элемент со следующим {A [Index] ~ A [Index+1]) → > A [Index+1]:=: A [Index] ‘Если событие > то меняем. ‘Во второй подписке сравниваем текущий элемент с предыдущим A [Index] ~ A [Index-1]) → < A [Index]:=: A [Index -1] ‘Если < то меняем } Из незнакомого здесь только знаки операции сравнения «~» и перестановки «:=:». Выполнение начинается с изменения значения какого-то элемента массива. Так как определены подписки на события больше/меньше то, выполняются операция сравнения и реакция на произошедшие события – обмен соседними значениями, что приводит в свою очередь к изменению значения соседнего элемента массива. И так до тех пор, пока элемент не найдет свое место в массиве. 5. Анализ текста. Постановка задачи. Проанализировать текст А и посчитать количество комбинаций букв «аб», «ав», «авс» в с1, с2, с3. Длина текста N. Индекс текущей буквы i. Текущая буква А[i] Попробуем решить эту задачу без алгоритмов, только определяя события. Пример 3 Text A ‘Текстовый массив A Integer N=A.Length-1 ‘Длина массива Integer I =0 → Change More2 ‘Счетчик текста. При изменении значения на проверку конца текста Integer (C1=0, C2=0, C3=0) ‘Счетчики с начальными значениями. ‘Создаем события контролирующие конец текста More2 (N-I) ~1 → > FirstA ‘До конца текста більше 2-х букв. Подписка на проверку первуй буквы а More3 (N-I) ~2 → > Thirdc Else {C2+=1} ‘До конца текста більше 3-х букв. На проверку третьей буквы FirstA A[I] ~ «а» → ={Secondб Secondв} Else i+=1 ‘Первая буква а-на проверку вторых букв б и в Secondб A[I+1] ~ «б» →= {С2+=1 I+=2} Else i+=1 ‘вторая буква б-наращиваем счетчик C1 на 1 и индекс на 2 Secondв A[I+1] ~ «в» →=More3 ‘вторая буква в-на проверку конца текста Thirdc A[I+2] ~ «с» →={C3+=1 I+=3} Else {C2+=1 I+=2} ‘третья буква c-наращиваем счетчик С3 или счетчик С2 если не с Анализ инициируется присвоением 0 счетчику I и запуском проверки на наличие не меньше двух букв до конца текста(More2). Если букв больше чем 2, то проверяем на букву «а» выражением FirstA. Если буква а, то проверяем на вторую букву (Secondб и Secondв), если нет, то наращиваем счетчик текста на 1, чем инициируем проверку More2 Проверка на вторую букву «б» либо заканчивается успехом и наращиваем счетчик С1 и счетчик текста на 2, либо не успешно, тогда наращиваем счетчик текста на 1 для продолжения анализа. Успешная проверка на букву «в» подписана на проверку наличия третьей буквы до конца текста. Если третьей буквы нет, то наращиваем счетчик С2 чем и заканчиваем анализ. Если есть третья буква, то если это «с» то изменяем счетчик C3. В противном случае С2 с советующими изменениями счетчика текста для продолжения анализа. Может с непривычки покажется решение этой задачи сложноватым, но нашей целью продемонстрировать метод решения без построения алгоритма. И этот метод решения при известной сноровке легче как для программирования, так и для сопровождения. 6. Понятия (Define). Логический разбор. Понятия определяются как высказывания над событиями и понятиями согласно правилам формальной логики и высказываний при общем синтаксисе языка и имеют события True и False. Операции формальной логики «&»-И, «|»-Или, «¬»-Нет. Пример 3 Define Квадрат {Многоугольник & 4 ребра & все ребра равны} Квантификация переменных. @ (Integer X) Define R (A, B(X)) Параметры определяют универсальную квантификацию, и читается так Для любого целого X понятие R (A, B(X)) – истинно Экзистенциональная переменная имеет имя понятия и определяется двоеточием после определяемого понятия с областью определения. @ (Integer X) Define R (A, B(X)): Integer Читается так: для любого целого X существует целое R такое что R (A, B(X)) истинно. Истинность понятия определяется как следование из его определения. Сейчас попробуем определить выполнение события в том случае, когда выполнение выражение императивно невозможно. Определим множество, на котором будет выполняться интерпретация. В нашем случае это множества целых чисел и значения I и Y. Integer (I=-50000, N=108) Positive (I ^ N) К операции возведения в степень "^" добавим к событиям следующее высказывание. @ Integer (X, Y) Define Positive {Positive X |Четное Y} (1) Анализируемое высказывание называется целевым высказыванием. В нашей системе запуск анализа понятия происходит при адресации и называется интерпретацией. Для нашей задачи оно выглядит так: Высказывание(1) нужно читать так: Для любых параметров X и Y типа Integer операция "^" является Positive тогда, когда выполняется событие Positive X, либо событие Четное Y. Знак «|»-операция Или. Шаг логического разбора называется резолюцией. На первом шаге резолюции ищем высказывания Positive относительно функции "^". Оказывается, у нас есть такое высказывание (1) . Разбираем по правилам операции Или проверяя событие Positive X. Делаем вычисление. Вместо параметра X подставляем значение -5000 и получаем негативный результат. Значит, делать выводы на основе этого высказывания нельзя. При положительном результате вопрос был бы закрыт, но не все потеряно, у нас есть еще не проанализированное определение Четное (Y) и область действия нас устраивает. Вычисляем его на истинность, подставляя в качестве параметра значение 108, и получаем положительный результат. Делаем вывод, что целевое высказывание Positive (-50000 ^ 108)? =True. В общем случае, если мы не получим результат с помощью интерпретации, то у нас остается вариант просчитать непосредственно значение с помощью функции возведения в степень. (Императивное решение). Хотя вопрос запуска логического разбора можно решить и иначе. В некоторых источниках процесс преобразования предикатов называется редукция.Кого заинтересовало
138 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів