Автор: гость Есть два калькулятора - первый и второй. Первый умеет только умножать. Результат его есть функция от двух переменных:
результат1 = F1(x1,x2), где x1 и x2 - перемножаемые числа
и есть второй калькулятор, умеющий четыре действия арифметики, его результат есть функция от трех переменных:
результат2 = F2(x1,x2,x3), где x1 и x2 - числа, над которыми проводится выбранное действие, x3 - номер арифметического действия (1-сложение 2-умножение итд)
Поясните, в чем отличие операции от аргумента. |
|
Разница в отношении к этому параметру х3. Если мы говорим об умном калькуляторе, пользование (управление) им должно быть построено немного по другому принципу. Для интеллектуального калькулятора интерфейс взаимодействия человека с ним подразумевает 3й тип управления, т.к. первые два типа управления не требуют никакого интеллекта. Подробнее
тут. Как уже отмечалось, интеллект нужен не всегда, поэтому повторюсь, для первых двух типов управления наличие интеллекта у управляемой стороны не требуется. А раз используется 3й тип управления то и отношение к параметрам функции должно быть другим. Более того, это уже будет не совсем функция, у нее не будет содержимого (кода) до тех пор, пока задача не будет решена. Но сейчас не об этом, а о параметре х3. Вы со своей императивной колокольни воспринимаете его как приказ, как нечто необсуждаемое. В отношении 3го типа управления такое мышление не есть правильное. Интеллект в управляемой стороне тем и интересен, что ему можно делегировать проблему в общих чертах, а детальные решения он будет принимать сам. Причем,
чем меньше времени затрачено на делегирование управляемому проблемы, по отношению ко времени, которое управляемому понадобилось для решения этой проблемы, тем управляемый полезнее. Это конечно же при условии, что качество и скорость решения удовлетворительные. Еще раз, объясняли что нужно в результате получить - недолго, выполнял - дольше, чем объясняли.
Так вот, параметр х3, для первого и второго типов управления будет означать "выполнить операцию умножения двух чисел", именно ее и никакую другую. То есть примитивизм первых двух типов управления заключается в том, что мы не даем управляемому никакой свободы действий. Мы ему сразу же говорим и что делать и КАК делать. Чем отличается 3й тип управления. Тем, что мы не указываем (без необходимости) четко что (а уж тем более как) делать. Мы указываем что нужно получить в результате. Ведь делегирование проблем (задач) тем и привлекательно, что исполнитель имеет более серьезную экспертизу в этой проблеме и он сам решает КАК ее решать. При таком подходе, параметр x3 будет означать не "выполнить операцию умножения двух чисел", а "получить произведение двух чисел". В чем же отличие. Обратите внимание во второй формулировке не указывается то, КАК получить. Ведь как известно, произведение можно получить сложением первого числа х1 столько раз, сколько указали во втором аргументе - х2 (минус один). Ну или наоборот. Наверное уже понятно, что я имею в виду. Но я стараюсь не голословить и для всего искать примеры.
На вашем (почти) примере. Я только его немного переиначу. Допустим есть функция F(x1,x2,x3), которая умеет складывать и умножать. Это аналог вашей F2. И есть две функции: F1 (x1,x2) - умножает, и F2 (x1,x2) - складывает. Ну и соответственно, чтобы не путаться, значения параметра x3: 1-умножение 2-сложение. Одно но, функция F сама ничего не делает, она делегирует выполнение арифм. действий функциям F1 и F2.
Как тело функции F(x1,x2,x3) выглядит в вашем представлении:
if(x3 == 1) return F1(x1,x2);
else if(x3 == 2) return F2(x1,x2);
else ...
Но поскольку мы говорим об интеллектуальном калькуляторе, то в моем представлении у функции F(x1,x2,x3) тела нет. Понимаете, нет кода у нее. Это и есть тот алгоритм А2, из моего предыдущего поста. Он порождается уже после старта работы над решением задачи неким универсальным алгоритмом А1. И построение это выполняется пошагово. То есть сначала, при параметре x3 = 1 будет попытка вызова функции F1(), и если вызов был успешным, то возвращаем результат. Но предположим, что при вызове функции F1 что-то пошло не так. Функция F1() является инструментом для функции F(). Думаю это должно быть понятно, что функция F() делегирует проблему перемножения функции F1(), она использует ее как инструмент. Ей не важно знать как перемножать числа, ей важно знать какой инструмент (какая функция) умеет это делать и проще поручить это дело инструменту. Итак, предположим, что при вызове функции F1 из функции F, случилась ошибка: исключение, зацикливание, функция в данный момент недоступна и т.д., что мог бы сделать умный алгоритм А1, если в него заложили перед этим соответствующие правила, объясняющие что умножение можно заменить сложением. Он бы после неудачного вызова F1(), сделал бы цепочку вызовов функции F2(). То есть результирующий алгоритм А2, в таком случае был бы совсем другим, а функция F содержала бы тело примерно такое:
F (2,3,1)
{
return F2(F2(2,2),2);
}
Другими словами, отвечая на ваш вопрос, разницу я вижу как минимум в том, что в умном калькуляторе параметр х3 влияет на выбор инструмента для решения задачи (F1 или F2), а параметры х1 и х2 не влияют. Но реализация умного калькулятора будет сильно не такой, как ее делают для обычного калькулятора. Повторюсь, не будет даже функций никаких, и параметров не будет, я их использовал для того, чтобы у вас была возможность хоть как-то понять написанное. Интерфейс взамодействия в 3м уровне управление это никакой не вызов функций, и не передача команд, это что-то такое, чего еще нет, со своим полностью декларативным языком.