2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Программирование как решение краевой задачи
Сообщение25.09.2020, 14:00 
Заслуженный участник
Аватара пользователя


11/04/08
2748
Физтех
Здравствуйте! Подскажите пожалуйста одну штуку.

Программирование (особенно в научных целях) обычно является процедурным. Для того, чтобы получить какие-то результаты, ты пишешь код и машина его последовательно исполняет. Можно представить себе, что в каждый момент времени у системы есть какое-то состояние, а каждая строчка в коде это действие. Состояние + действие дает новое состояние. Поэтому на процедурное программирование можно посмотреть как на задачу Коши. Последовательность действий выстраиваешь ты сам и сам несешь ответственность за неверный ввод действий и их последовательностей.

А бывает ли программирование как краевая задача? Например у меня сейчас в памяти хранятся какие-то данные. Я сообщаю компу, что хочу получить какие-то новые или дополнительные данные. Хотелось бы, чтобы машина сама выстроила последовательность действий, которая привела бы к нужному результату. Как бы сама написала и выполнила код. Есть ли что-то подобное в программировании? Как это называется? Известны ли какие-то примеры, как это можно сделать. Не обязательно, чтобы это был какой-то целый язык программирования или какая-то сверхсложная программа с искусственным интеллектом с преобразованием человеческих желаний в действия. Может быть есть какой-то простой пример, в котором есть всего 4-5 действий, последовательность из которых подпрограмма выстраивает автоматически... Может быть написанная на известном языке в конкретной предметной области, как нечто подобное можно было бы сделать?

Я понимаю, что мне нужно смотреть наверное куда-то в сторону метапрограммирования, но может быть есть какие-то более простые идеи?

 Профиль  
                  
 
 Re: Программирование как решение краевой задачи
Сообщение25.09.2020, 14:15 
Заслуженный участник
Аватара пользователя


01/08/06
3128
Уфа
По описанию похоже на Prolog (хотя я его совсем не знаю).

 Профиль  
                  
 
 Re: Программирование как решение краевой задачи
Сообщение25.09.2020, 14:29 


09/05/16
138
ShMaxG в сообщении #1484566 писал(а):
Я сообщаю компу, что хочу получить какие-то новые или дополнительные данные. Хотелось бы, чтобы машина сама выстроила последовательность действий, которая привела бы к нужному результату.

Эта область называется "декларативное программирование".
ShMaxG в сообщении #1484566 писал(а):
Я понимаю, что мне нужно смотреть наверное куда-то в сторону метапрограммирования, но может быть есть какие-то более простые идеи?

SQL-запросы считаются декларативными, поскольку в идеале пользователь задаёт то, что хочет получить, а не как его надо доставать. (В реальности над query planner и формой запроса иногда приходится плясать с бубном, чтобы получить быстрый query plan.)

 Профиль  
                  
 
 Re: Программирование как решение краевой задачи
Сообщение25.09.2020, 15:00 
Заслуженный участник
Аватара пользователя


11/04/08
2748
Физтех
worm2, aitap
Спасибо за наводки. Я погуглил по поводу декларативного программирования на Python, но нашел какую-то ерунду. Почему-то под декларативным программированиям авторы статей понимают векторизацию кода.

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

Теперь мне бы хотелось это обобщить на более общий случай. Я хочу чтобы среди действий были отрисовка графиков, интегрирование систем уравнений, вытаскивание каких-то элементов из каких-то матриц, решение каких-то алгебраических уравнений и так далее. Грубо говоря, я говорю компу -- вот тебе такие данные, хочу график в таких-то переменных. Комп в некотором графе ищет кратчайший путь преобразований и все сам делает: возможно ему придется что-то проинтегрировать, решить какое-то уравнение, и только потом построить график. Мне не интересны языки программирования типа лиспа, пролога и прочих. Я работаю на Python и Matlab, потому что в основном программирование императивное. Декларативное программирование нужно лишь как элемент в больших программах. Поэтому меня больше интересует, как можно реализовать декларативное программирование (через графы и поиск путей в них) в обычных языках программирования. Переходы между системами координат я понимаю как делать. А вот более общие ситуации совсем не понимаю...

 Профиль  
                  
 
 Re: Программирование как решение краевой задачи
Сообщение25.09.2020, 15:28 
Заслуженный участник


09/05/12
25179
aitap в сообщении #1484571 писал(а):
(В реальности над query planner и формой запроса иногда приходится плясать с бубном, чтобы получить быстрый query plan.)
Это в реальности с декларативными языками почти всегда так. Даже на том же Prolog написать чисто декларативную программу редко когда удается.
ShMaxG в сообщении #1484573 писал(а):
Поэтому меня больше интересует, как можно реализовать декларативное программирование (через графы и поиск путей в них) в обычных языках программирования.
В общем-то никак, слишком разные парадигмы. Что-то близкое можно организовать на языках, поддерживающих функциональное программирование, но не далее.

 Профиль  
                  
 
 Re: Программирование как решение краевой задачи
Сообщение25.09.2020, 16:35 


09/05/16
138
ShMaxG в сообщении #1484573 писал(а):
Я погуглил по поводу декларативного программирования на Python, но нашел какую-то ерунду. Почему-то под декларативным программированиям авторы статей понимают векторизацию кода.

Меня с декларативным программированием именно в этом смысле познакомила глава 9 книги Higher-Order Perl by Mark Jason Dominus. Конечно, не Python, но язык родственный. Возможно, Вас на что-нибудь вдохновит.

ShMaxG в сообщении #1484573 писал(а):
Комп в некотором графе ищет кратчайший путь преобразований и все сам делает: возможно ему придется что-то проинтегрировать, решить какое-то уравнение, и только потом построить график.

Возможно, это легче сделать в языках с развитой системой типов, вроде Haskell, но если Вы сами напишете решатель для поиска кратчайшего пути в графе, о котором говорите, ничего невозможного для Python в поставленной задаче нет. Синтаксис может оказаться не очень удобным. По идее, достаточно иметь базовый класс, в котором достаточно умный метод для приведения данного объекта к объекту другого класса (с решателем кратчайшего пути в графе классов и этим всем), и наследовать от него все высокоуровневые объекты. Тогда любое из этих декларативных действий можно будет свести к чему-то вроде myPlot = myEquation.transform_into(Plot2D) (где Plot2D - это класс), а остальное время работать с объектами нужных классов так, как удобно с точки зрения самих этих классов.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group