Декларативность и зависимость вычисления выражения от контекста
От: _hum_ Беларусь  
Дата: 04.01.13 12:56
Оценка:
Стоит задача создания специализированного языка для задания программы действий некоторому устройству по схеме: фиксируемая ситуация -> действие на нее. При этом ставятся ограничения, чтобы язык был достаточно простым для обучения и экспрессивным (программы на нем просты и читабельны). Выбрал декларативный подход (без использования понятия именованных изменяемых ячеек памяти) с реализацией просто по схеме: задается логическое условие на ситуацию и после него прописывается действие. Но столкнулся со следующей трудностью. Мне нужно, чтобы в этом языке можно было легко задавать следующее условие: "для определения ситуации вычисли данное выражение E в контексте С1, затем в контексте C2 и сравни результат". Вопрос, как в декларативном программировании проще и естественнее ввести понятие контекста (будет ли это тогда вообще декларативным программированием?). Какие подводные камни здесь могут быть (по аналогии с подводными камнями в виде побочных эффектов в нечистых функциональных языках программирования). Может быть, есть какой-то известный язык, где подобное реализовано?
Re: Декларативность и зависимость вычисления выражения от контекста
От: deniok Россия  
Дата: 04.01.13 13:17
Оценка:
Здравствуйте, _hum_, Вы писали:

__>Стоит задача создания специализированного языка для задания программы действий некоторому устройству по схеме: фиксируемая ситуация -> действие на нее. При этом ставятся ограничения, чтобы язык был достаточно простым для обучения и экспрессивным (программы на нем просты и читабельны). Выбрал декларативный подход (без использования понятия именованных изменяемых ячеек памяти) с реализацией просто по схеме: задается логическое условие на ситуацию и после него прописывается действие. Но столкнулся со следующей трудностью. Мне нужно, чтобы в этом языке можно было легко задавать следующее условие: "для определения ситуации вычисли данное выражение E в контексте С1, затем в контексте C2 и сравни результат". Вопрос, как в декларативном программировании проще и естественнее ввести понятие контекста (будет ли это тогда вообще декларативным программированием?). Какие подводные камни здесь могут быть (по аналогии с подводными камнями в виде побочных эффектов в нечистых функциональных языках программирования). Может быть, есть какой-то известный язык, где подобное реализовано?


Если явная передача контекста в каждое вычисление слишком замусоривает код, то можно посмотреть в сторону монады Reader (Хаскелл). С помощью нее легко описать вычисление, допускающее чтение значений из заданного окружения (контекста).

type User = String
type Password = String
type UsersTable = [(User,Password)]

-- контекстом служит таблица
pwds :: UsersTable
pwds = [("Bill","123"),("Ann","qwerty"),("John","2sRq8P")]

-- возвращает длину пароля пользователя  или -1, если такого пользователя нет
getPwdLen :: User -> Reader UsersTable Int
getPwdLen person = do
  mbPwd <- asks $ lookup person 
  let mbLen = fmap length mbPwd
  let len = fromMaybe (-1) mbLen
  return len

Используем
> runReader (getPwdLen "Ann") pwds
6
> runReader (getPwdLen "Ann") []
-1
Re: Декларативность и зависимость вычисления выражения от контекста
От: AlexCab LinkedIn
Дата: 04.01.13 14:21
Оценка:
Здравствуйте, _hum_, Вы писали:
__>Стоит задача создания специализированного языка для задания программы действий некоторому устройству по схеме: фиксируемая ситуация -> действие на нее. При этом ставятся ограничения, чтобы язык был достаточно простым для обучения и экспрессивным (программы на нем просты и читабельны). Выбрал декларативный подход (без использования понятия именованных изменяемых ячеек памяти)
ИМХО, "без использования понятия именованных изменяемых ячеек памяти" это не про декларативный подход, это про функциональный.
__>с реализацией просто по схеме: задается логическое условие на ситуацию и после него прописывается действие. Но столкнулся со следующей трудностью. Мне нужно, чтобы в этом языке можно было легко задавать следующее условие: "для определения ситуации вычисли данное выражение E в контексте С1, затем в контексте C2 и сравни результат". Вопрос, как в декларативном программировании проще и естественнее ввести понятие контекста (будет ли это тогда вообще декларативным программированием?). Какие подводные камни здесь могут быть (по аналогии с подводными камнями в виде побочных эффектов в нечистых функциональных языках программирования). Может быть, есть какой-то известный язык, где подобное реализовано?

На вскидку два варианта:
1)Передавать контекст через аргументы выражения(как это принято в ФП).
2)Скрыть контекст за какой ни будь абстракцией(какой именно зависит от того что это за устройство, какие возможности требуются от ЯП и т.п.).
Между тем,что я думаю,тем,что я хочу сказать,тем,что я,как мне кажется,говорю,и тем,что вы хотите услышать,тем,что как вам кажется,вы слышите,тем,что вы понимаете,стоит десять вариантов возникновения непонимания.Но всё-таки давайте попробуем...(Э.Уэллс)
Re: Декларативность и зависимость вычисления выражения от контекста
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.01.13 15:50
Оценка: 1 (1)
Здравствуйте, _hum_, Вы писали:

__>Мне нужно, чтобы в этом языке можно было легко задавать следующее условие: "для определения ситуации вычисли данное выражение E в контексте С1, затем в контексте C2 и сравни результат". Вопрос, как в декларативном программировании проще и естественнее ввести понятие контекста (будет ли это тогда вообще декларативным программированием?). Какие подводные камни здесь могут быть (по аналогии с подводными камнями в виде побочных эффектов в нечистых функциональных языках программирования). Может быть, есть какой-то известный язык, где подобное реализовано?


Описанная тобой задача прекрасно решается на Прологе.

Чтобы сказать что-то большее нужно больше информации.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Декларативность и зависимость вычисления выражения от контекста
От: _hum_ Беларусь  
Дата: 05.01.13 12:19
Оценка:
2deniok

Хотелось бы обойтись без введения таких сложных понятий, как монада (язык должен быть рассчитан на усвоение людьми, имеющими за плечами только школьный курс информатики). Да и побочных эффектов у меня не предвидится, только зависимость от контекста, потому, кажется, что это будет стрельба из пушки по воробьям.

2AlexCab
Под декларативным я понимал язык, не задействующий ячейки памяти и работу с потоком управления. В этом смысле функциональный язык — частный случай декларативного. Декларативное — это все то, что "не императивное"

VD>На вскидку два варианта:

VD>1)Передавать контекст через аргументы выражения(как это принято в ФП).

Это как? Можно поподробнее? Как в функциональных языках вводится понятие контекста и как синтаксически осуществляется работа с ним?


2VladD2

VD>Описанная тобой задача прекрасно решается на Прологе.


А можно примерчик для имеющих только общее представление о Прологе? Что там понимается под контекстом, и как оформляется работа с ним.

VD>Чтобы сказать что-то большее нужно больше информации.


Значит так:

контекст в моем случае однозначно задается целым числом (С0, C1, C2,....). Предполагается наличие built-in функций, вычисление которых зависит от контекста. И предполагается, что пользователь языка сможет писать арифметические выражения, включающие в том числе и эти зависящие от контекста функции. И вот нужно как-то так определить синтаксис и семантику, чтобы достаточно просто было задавать вычисление выражения в заданном контексте.


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

1. Блок определения синонимов арифметических выражений (для сокращения записи повторно использующихся выражений)

E1: fun_foo[1] + fun_foo[3]
E2: fun_foo[2] + fun_foo[4]
E3: 2*E1 + 3*E2

2. Блок определения синонимов логических выражений:

L1: (E1 < E2)
L2: L1 OR (E3 > 10)

3. Основной блок (условие на ситуацию -> действие на ситуацию)

[@C0 E3] < [@C2 E3] -> "ускорить процесс"
[@C0 L2] OR [@C0 L1 AND L2] -> "замедлить процесс"

Здесь fun_foo — некоторая встроенная функция, зависящая от контекста; конструкция [@<context_id> <expression>@] является выражением, вычисление которого сводится к вычислению выражения <expression> в контексте <context_id>.

Но это все мои "придумки", а потому я не уверен, что здесь нет граблей, например, в виде зависимости результата вычисления от порядка вычисления выражений (аппликативного/нормального), ведь в моем случае есть же зависимость функций от контекста, а это очень близко к побочным эффектам (которые, как известно, как раз-таки делают зависимым результат от порядка вычисления).
Хотелось бы все-таки узнать, как это решается стандартным способом. К тому же хочется ввести механизм для уменьшения дублирования выражений. А тут тоже — подходов много (например, введение классического механизма функций, введение макросов, введение шблонов правил вывода выражений как в Mathematica) и какой из них выбрать так, чтобы был прост и в семантическом, и в синтаксическом плане, и не наплодил ловушек для неискушенного программиста...
Re[3]: Декларативность и зависимость вычисления выражения от контекста
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.01.13 15:10
Оценка:
Здравствуйте, _hum_

Это древеснын форум. В нем нужно отвечать отдельно каждому собеседнику.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Декларативность и зависимость вычисления выражения от контекста
От: _hum_ Беларусь  
Дата: 05.01.13 18:15
Оценка:
Здравствуйте, deniok, Вы писали:

D>Если явная передача контекста в каждое вычисление слишком замусоривает код, то можно посмотреть в сторону монады Reader (Хаскелл). С помощью нее легко описать вычисление, допускающее чтение значений из заданного окружения (контекста).


Хотелось бы обойтись без введения таких сложных понятий, как монада (язык должен быть рассчитан на усвоение людьми, имеющими за плечами только школьный курс информатики). Да и побочных эффектов у меня не предвидится, только зависимость от контекста, потому, кажется, что это будет стрельба из пушки по воробьям.
Re[2]: Декларативность и зависимость вычисления выражения от контекста
От: _hum_ Беларусь  
Дата: 05.01.13 18:16
Оценка:
Здравствуйте, AlexCab, Вы писали:

AC>ИМХО, "без использования понятия именованных изменяемых ячеек памяти" это не про декларативный подход, это про функциональный.


Под декларативным я понимал язык, не задействующий ячейки памяти и работу с потоком управления. В этом смысле функциональный язык — частный случай декларативного. Декларативное — это все то, что "не императивное"

AC>На вскидку два варианта:

AC>1)Передавать контекст через аргументы выражения(как это принято в ФП).

Это как? Можно поподробнее? Как в функциональных языках вводится понятие контекста и как синтаксически осуществляется работа с ним?
Re[2]: Декларативность и зависимость вычисления выражения от контекста
От: _hum_ Беларусь  
Дата: 05.01.13 18:16
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Описанная тобой задача прекрасно решается на Прологе.


А можно примерчик для имеющих только общее представление о Прологе? Что там понимается под контекстом, и как оформляется работа с ним.

VD>Чтобы сказать что-то большее нужно больше информации.


Значит так:

контекст в моем случае однозначно задается целым числом (С0, C1, C2,....). Предполагается наличие built-in функций, вычисление которых зависит от контекста. И предполагается, что пользователь языка сможет писать арифметические выражения, включающие в том числе и эти зависящие от контекста функции. И вот нужно как-то так определить синтаксис и семантику, чтобы достаточно просто было задавать вычисление выражения в заданном контексте.


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

1. Блок определения синонимов арифметических выражений (для сокращения записи повторно использующихся выражений)

E1: fun_foo[1] + fun_foo[3]
E2: fun_foo[2] + fun_foo[4]
E3: 2*E1 + 3*E2

2. Блок определения синонимов логических выражений:

L1: (E1 < E2)
L2: L1 OR (E3 > 10)

3. Основной блок (условие на ситуацию -> действие на ситуацию)

[@C0 E3] < [@C2 E3] -> "ускорить процесс"
[@C0 L2] OR [@C0 L1 AND L2] -> "замедлить процесс"

Здесь fun_foo — некоторая встроенная функция, зависящая от контекста; конструкция [@<context_id> <expression>@] является выражением, вычисление которого сводится к вычислению выражения <expression> в контексте <context_id>.

Но это все мои "придумки", а потому я не уверен, что здесь нет граблей, например, в виде зависимости результата вычисления от порядка вычисления выражений (аппликативного/нормального), ведь в моем случае есть же зависимость функций от контекста, а это очень близко к побочным эффектам (которые, как известно, как раз-таки делают зависимым результат от порядка вычисления).
Хотелось бы все-таки узнать, как это решается стандартным способом. К тому же хочется ввести механизм для уменьшения дублирования выражений. А тут тоже — подходов много (например, введение классического механизма функций, введение макросов, введение шблонов правил вывода выражений как в Mathematica) и какой из них выбрать так, чтобы был прост и в семантическом, и в синтаксическом плане, и не наплодил ловушек для неискушенного программиста...
Re[3]: Декларативность и зависимость вычисления выражения от контекста
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.01.13 19:22
Оценка:
Здравствуйте, _hum_, Вы писали:

__>А можно примерчик для имеющих только общее представление о Прологе? Что там понимается под контекстом, и как оформляется работа с ним.


Пролог это логический язык общего назначения. Так что специализированны контекстов в нем нет. Но для решения там используется алгоритм перебора с откатами и унификация, что позволяет решать задачу разными способами и сравнивать (унифицировать) результаты.

VD>>Чтобы сказать что-то большее нужно больше информации.


__>Значит так:


__>контекст в моем случае однозначно задается целым числом (С0, C1, C2,....). Предполагается наличие built-in функций, вычисление которых зависит от контекста. И предполагается, что пользователь языка сможет писать арифметические выражения, включающие в том числе и эти зависящие от контекста функции. И вот нужно как-то так определить синтаксис и семантику, чтобы достаточно просто было задавать вычисление выражения в заданном контексте.


В Прологе твой контекст может быть представлен переменной. В общем, погляди какой-нибудь курс по прологу. Там много подобных задач решается.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Декларативность и зависимость вычисления выражения от контекста
От: AlexCab LinkedIn
Дата: 06.01.13 07:23
Оценка:
AC>>1)Передавать контекст через аргументы выражения(как это принято в ФП).
__>Это как? Можно поподробнее? Как в функциональных языках вводится понятие контекста и как синтаксически осуществляется работа с ним?
Например:
  myContext = <some context>
  myFun(myContext,<some other arguments>)

Но, думаю лучше было бы обойтись без контекстов, опишите подробней задачу и предметную область, я постараюсь помочь с дизайном ЯП.
Между тем,что я думаю,тем,что я хочу сказать,тем,что я,как мне кажется,говорю,и тем,что вы хотите услышать,тем,что как вам кажется,вы слышите,тем,что вы понимаете,стоит десять вариантов возникновения непонимания.Но всё-таки давайте попробуем...(Э.Уэллс)
Re[4]: Декларативность и зависимость вычисления выражения от контекста
От: _hum_ Беларусь  
Дата: 06.01.13 12:25
Оценка:
Здравствуйте, AlexCab, Вы писали:

AC>>>1)Передавать контекст через аргументы выражения(как это принято в ФП).

__>>Это как? Можно поподробнее? Как в функциональных языках вводится понятие контекста и как синтаксически осуществляется работа с ним?
AC>Например:
AC>
AC>  myContext = <some context>
AC>  myFun(myContext,<some other arguments>)
AC>


Явная передача контекста в функцию плоха тем, что для сложного выражения, задействующего несколько функций, но которые должны быть вычислены в одном и том же контексте, придется все равно многократно указывать этот контекст для каждой в отдельности.

AC>Но, думаю лучше было бы обойтись без контекстов, опишите подробней задачу и предметную область, я постараюсь помочь с дизайном ЯП.


Задача состоит в создании достаточно простого языка программирования для задания алгоритма работы некоторого устройства управления (микроконтроллера, регулирующего определенный физический процесс). Это устройство способно по датчикам оценивать текущие характеристики процесса. Кроме того, имеется возможность прогнозировать результат управляющих воздействий.

В простейшем случае для таких устройств управления достаточно "реактивной стратегии", то есть, контроллеру в явном виде прописывается конечный набор ситуаций и реакции на каждую из них (какое управляющее воздействие должен подать контроллер, если окажется в заданной ситуации). Ситуации задаются логическими условиями, которые этот контроллер проверяет; выполнение условия означает наличие ситуации, и соответственно, влечет за собой определенное воздействие на процесс. В простейшем случае ситуации задаются по показаниям датчиков. В этом случае программа выглядит наподобие:

1) если ($intencity_sensor > 100), то воздействие A1 /*отключить питание по каналу 1*/;
2) если ...
...


(Здесь $<sensor_name> — текущее значение датчика <sensor_name>.)

Но хотелось бы еще дать возможность контроллеру реагировать не только на текущие параметры процесса, но еще и учитывать, к чему могут привести его действия в будущем, наподобие

1) если ($intencity_sensor > 100) AND "при воздействии A1 интенсивность процесса будет не меньше 50", то воздействие A1;
2) если ...
...


Значения прогнозных показателей дают функции, например, get_intensity[], но ясно, что значения этих функций зависят от того, "в контексте какого будущего" они вычисляются. И тут, как мне видится, все-таки экспрессивнее задавать контекст для функций, а не передавать его аргументом, поскольку одно и то же условие может проверяться для нескольких вариантов "будущего":

1) если ($intencity_sensor > 100) AND [@A1 NOT (get_intensity[]  < 50) @], то воздействие A1
2) если ($intencity_sensor > 100) AND [@A2 NOT (get_intensity[]  < 50) @], то воздействие A2


Это можно было бы тогда оформить более коротко:

L1:= $intencity_sensor > 100 /*условие выхода за верхнюю границу номинального диапазона*/
L2:= get_intensity[]  < 50   /*прогнозное условие выхода за нижнюю границу номинального диапазона*/

1) если L1 AND [@A1 NOT L2 @], то воздействие A1
2) если L1 AND [@A2 NOT L2 @], то воздействие A2



П.С. Обращаю еще раз внимание, что язык должен быть как можно более простым (содержащим минимум базовых концептов) и экспрессивным (в наиболее естественной для человека форме передающим суть), поскольку работать на нем будут люди, не специализирующиеся на программировании (в общем случае имеющие за плечами только школьный курс информатики). Кроме того, программы на нем должны быть небольшими, легко поддающимися чтению и редактированию сторонними людьми.
"Железом" является микроконтроллер, потому память и время работы тоже достаточно критичны.

П.П.С. Склоняюсь к языку наподобие языка выражений в Mathematica, который позволяет сократить программу, не вводя механизма пользовательских функций, а обходясь только механизмом подстановок "/.". Но пока изучаю данный вопрос.
Re[5]: Декларативность и зависимость вычисления выражения от контекста
От: AlexCab LinkedIn
Дата: 06.01.13 15:27
Оценка:
__> Значения прогнозных показателей дают функции, например, get_intensity[], но ясно, что значения этих функций зависят от того, "в контексте какого будущего" они вычисляются. И тут, как мне видится, все-таки экспрессивнее задавать контекст для функций, а не передавать его аргументом, поскольку одно и то же условие может проверяться для нескольких вариантов "будущего":

__>
__>1) если ($intencity_sensor > 100) AND [@A1 NOT (get_intensity[]  < 50) @], то воздействие A1
__>2) если ($intencity_sensor > 100) AND [@A2 NOT (get_intensity[]  < 50) @], то воздействие A2
__>


Вот эту часть про "контексты будущего" я не совсем понял, расскажите подробнее как работает get_intensity[].
Между тем,что я думаю,тем,что я хочу сказать,тем,что я,как мне кажется,говорю,и тем,что вы хотите услышать,тем,что как вам кажется,вы слышите,тем,что вы понимаете,стоит десять вариантов возникновения непонимания.Но всё-таки давайте попробуем...(Э.Уэллс)
Re[6]: Декларативность и зависимость вычисления выражения от контекста
От: _hum_ Беларусь  
Дата: 06.01.13 17:09
Оценка:
Здравствуйте, AlexCab, Вы писали:

__>> Значения прогнозных показателей дают функции, например, get_intensity[], но ясно, что значения этих функций зависят от того, "в контексте какого будущего" они вычисляются. И тут, как мне видится, все-таки экспрессивнее задавать контекст для функций, а не передавать его аргументом, поскольку одно и то же условие может проверяться для нескольких вариантов "будущего":


__>>
__>>1) если ($intencity_sensor > 100) AND [@A1 NOT (get_intensity[]  < 50) @], то воздействие A1
__>>2) если ($intencity_sensor > 100) AND [@A2 NOT (get_intensity[]  < 50) @], то воздействие A2
__>>


AC>Вот эту часть про "контексты будущего" я не совсем понял, расскажите подробнее как работает get_intensity[].


Механизм таков: по заданному воздействию A1 производится моделирование развития процесса в будущем с учетом этого воздействия, после чего функция get_intensity[] из результата моделирования "достает" нужную характеристику процесса, в данном случае интенсивность.

Выражение [@<action> <expression> @] фактически означает "промоделируй процесс с учетом воздействия <action> и в контексте полученного результата моделирования вычисли <expression>".
Re[7]: Декларативность и зависимость вычисления выражения от контекста
От: _hum_ Беларусь  
Дата: 06.01.13 17:30
Оценка:
Да, навtрное не совсем удачно назвал. Надо бы вместо get_intensity[] использовать более подходящее по смыслу get_intensity_prospective[].
Re: Декларативность и зависимость вычисления выражения от контекста
От: rfq  
Дата: 06.01.13 17:55
Оценка:
Здравствуйте, _hum_, Вы писали:
Вопрос, как в декларативном программировании проще и естественнее ввести понятие контекста (будет ли это тогда вообще декларативным программированием?).

Контекст (в контексте вашей задачи ) — это вычислитель, которому передается задание на вычисление. Задание на вычисление проще всего оформить в виде указателя на функцию. Обращение к вычислителю — в виде вызова функции:


task=(){do something; return 1};
res1=context1.compute(task);
res2=context2.compute(task);


В процессе вычисления задание обращается к каким-то стандартным функциям контекста, и у разных контекстов эти функции могут быть разными. Таким образом, сам контекст передавать во все вызовы функций не нужно.
Re[2]: Декларативность и зависимость вычисления выражения от контекста
От: _hum_ Беларусь  
Дата: 06.01.13 19:23
Оценка:
Здравствуйте, rfq, Вы писали:

rfq>Здравствуйте, _hum_, Вы писали:

rfq> Вопрос, как в декларативном программировании проще и естественнее ввести понятие контекста (будет ли это тогда вообще декларативным программированием?).

rfq>Контекст (в контексте вашей задачи ) — это вычислитель, которому передается задание на вычисление. Задание на вычисление проще всего оформить в виде указателя на функцию. Обращение к вычислителю — в виде вызова функции:



rfq>
rfq>task=(){do something; return 1};
rfq>res1=context1.compute(task);
rfq>res2=context2.compute(task);
rfq>


rfq>В процессе вычисления задание обращается к каким-то стандартным функциям контекста, и у разных контекстов эти функции могут быть разными. Таким образом, сам контекст передавать во все вызовы функций не нужно.


Это псевдо-код с какого языка? Ибо, например, в том же С++, насколько я себе представляю, при передаче функции по указателю контекст ее исполнения при вызове не изменяется.

//////////////////////////////////////////////////
class CContext
{
public:
  std::string do_something(){return "Context scope";}

  std::string compute(std::string (*task)(void)){ return (*task)();}
};
//////////////////////////////////////////////////

std::string do_something(){return "Global scope";}

std::string task(void){ return do_something();}

void main(void)
{
   cout<<CContext().compute(&task);
}

//> Global scope
Re[5]: Декларативность и зависимость вычисления выражения от контекста
От: AlexCab LinkedIn
Дата: 07.01.13 21:31
Оценка:
AC>>Но, думаю лучше было бы обойтись без контекстов, опишите подробней задачу и предметную область, я постараюсь помочь с дизайном ЯП.
__> Задача состоит в создании достаточно простого языка программирования для задания алгоритма работы некоторого устройства управления (микроконтроллера, регулирующего определенный физический процесс). Это устройство способно по датчикам оценивать текущие характеристики процесса. Кроме того, имеется возможность прогнозировать результат управляющих воздействий.

Итак, в общем:
Вашими пользовательскими будут люди далёкие от программирования и в тоже время специалисты в своей предметной области, потому стоит опираться на известные им языки: естественный(в т.ч. жаргон и сленг принятые в пр. области) и математический. В частности, думаю стоит избавится от редкоиспользуемых символов вроде "$", "@", "[]" и т.п. И давить сущностным такие имена которые наиболее часто используются в переметной области, например обычно говорят просто "если интенсивность больше..." а не "если значение датчика интенсивности больше...".

и в частности:
Как я понял модель тех процесса(с помощью которой в т.ч. будет выполнятся моделирование) будет "под капотом", т.е. пользователям будет доступен набор моделей("модель" не очень удачное название, но пока я буду использовать его) типовых решений, например "регулятор температуры", "управление скоростью конвейерной ленты" и т.д., каждое из которых они дополнительно смогут расширить некоторой своей логикой, чтобы получит конкретное решение(программу, которую я далее буду называть "виртуальное устройство") своей конкретной проблемы. Именно эти модели (и решения созданные на их базе) предлагаю считать контекстами(а не конкретное воздействие). Каждая из таких моделей содержит некоторый специфический синтаксис(являющийся подмножеством общего для всех моделей) и семантику, например встроенные функции, константы и прочее.
Для простоты можно выделить каждому в. устройству по файлу(одна программа — один файл), примерно следующей структуры:
<заглавие с именем модели>
<параметры>
<описание входов-выходов>
<тело программы>

В одном контроллере можно разместить несколько в. устройств, но если вы решите позволить пользователям собрать сложные схемы из таких устройств то стоит перейти к диаграммному представлению как это например сделано здесь.

Пример:
Задача: сделать регулятор температуры, который при помощи пары нагревателей(сильного и слабого), поддерживающий +23*(+2-1), и выдающий сигналы "холодно" и "жарко" при +13* и +33* соответственно.
Есть контроллер имеющий четыре входа(I0..I3) и четыре выхода(O0..O3), и модель "hot objects with two heaters". Эта модель не имеет алгоритма регулирования, а только позволяет пересказывать температуру объекта нагреваемого парой нагревателей, и содержит следующий специфический синтаксис:
Входы-выходы(обязательно должны быть назначены на какие ни будь реальные входы-выходы контроллера):
"temperature" — значение температуры,
"first_heater", "second_heater" — первый и второй нагреватели.
Парамтры:
"object_coefficient" — некий коэффициент характеризующей нагреваемый объект,
"first_heater_power", "second_heater_power" — мощьность первого и второго нагреватиля,
ну так далее.
А так же функцию "be" вычисляющую какой будет температура, если произойдёт действие указанное в том же выражении.
Программа на основе этой модели может выглядеть примерно так:
hot_objects_with_two_heaters                                   //Заглавие
Parameters:
  object_coefficient = 123
  first_heater_power = 1000
  second_heater_power = 500
Ins-outs:
  I1 = temperature                                             //Вариант синтаксиса: I1:temperature
  O1 = first_heater
  O2 = second_heater
  O3 = coldly
  O4 = hot
Program:
  check = temperature < 22 and temperature be < 25             //Вариант синтаксиса: check = (temperature < 22) and (temperature be < 25)
  on first_heater if check                                     //Подстановка ранее определённого выражения как если бы оно было написано здесь(как в математике). 
  on second_heater if check 
  off first_heater if temperature > 23                         //Вариант синтаксиса: (temperature > 23) -> first_heater off
  off second_heater if temperature > 24 and temperature be < 25  
  on coldly if temperature < 13
  off coldly if temperature > 13
  on hot if temperature > 33
  off hot if temperature < 33

Можно так-же добавить возможность предсказывать и по отношению к другим событиям, например:
  off second_heater if temperature > 24 and if off first_heater temperature be < 25 
     //Как вариант синтаксиса: (temperature > 24)and(temperature be(if off first_heater) < 25) -> second_heater off

PS: Если вам что-то пригодится из этого, не забудьте отписать что именно и как, интересно же! .
Между тем,что я думаю,тем,что я хочу сказать,тем,что я,как мне кажется,говорю,и тем,что вы хотите услышать,тем,что как вам кажется,вы слышите,тем,что вы понимаете,стоит десять вариантов возникновения непонимания.Но всё-таки давайте попробуем...(Э.Уэллс)
Re[6]: Декларативность и зависимость вычисления выражения от контекста
От: _hum_ Беларусь  
Дата: 08.01.13 21:17
Оценка:
Здравствуйте, AlexCab, Вы писали:


AC>Как я понял модель тех процесса(с помощью которой в т.ч. будет выполнятся моделирование) будет "под капотом", т.е. пользователям будет доступен набор моделей


К сожалению, вы не так поняли. Модель одна. А пользователю, грубо говоря, надо дать возможность задавать условия вида
1) если "температура < 30" AND "давление < 100, при поднятии контроллером температуры на 70 градусов", то поднять температуру на 70 градусов;
2) если "температура < 30" AND "давление < 100, при поднятии контроллером температуры на 35 градусов", то поднять температуру на 35 градусов;

По смыслу — если датчик показывает низкую температуру, контроллер должен ее поднять, но это можно делать только в том случае, если повышение не приведет в будущем к критическому росту давления. Поэтому в условии помимо проверки текущего состояния системы выполняется также проверка "будущего состояния" (выделено подчеркиванием).

Кратко это записывается:

1) если "температура < 30" AND [давление < 100 | в контексте повышения температуры на 70 градусов], то ...
2) если "температура < 30" AND [давление < 100 | в контексте повышения температуры на 735 градусов], то ...
Re[7]: Декларативность и зависимость вычисления выражения от контекста
От: AlexCab LinkedIn
Дата: 09.01.13 08:12
Оценка:
На всяк случай: Модель это набор данных(например, скорость, давление etc.) отражающих состояние тех. процесса(например, процесса поддержания температуры некоторого объекта), и алгоритмов отражающих поведение тех. процесса(включая алгоритм(ы) предсказания "что будет если..."), некоторые или все из которых доступны пользователю ЯП посредством соответствующих идентификаторов (т.е. синтаксиса ЯП).

AC>>Как я понял модель тех процесса(с помощью которой в т.ч. будет выполнятся моделирование) будет "под капотом", т.е. пользователям будет доступен набор моделей

__>К сожалению, вы не так поняли. Модель одна.
Т.е. ваше устройство будет строго специализированным для одного тех. процесса?
__>По смыслу — если датчик показывает низкую температуру, контроллер должен ее поднять, но это можно делать только в том случае, если повышение не приведет в будущем к критическому росту давления. Поэтому в условии помимо проверки текущего состояния системы выполняется также проверка "будущего состояния" (выделено подчеркиванием).
А как вы, планируете реализовать проверку будущего состояния?
Между тем,что я думаю,тем,что я хочу сказать,тем,что я,как мне кажется,говорю,и тем,что вы хотите услышать,тем,что как вам кажется,вы слышите,тем,что вы понимаете,стоит десять вариантов возникновения непонимания.Но всё-таки давайте попробуем...(Э.Уэллс)
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.