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
3127
Уфа
По описанию похоже на 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, Супермодераторы



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

Сейчас этот форум просматривают: Yustas


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

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