1610912777-ff63a1b83b9ac0b597c9346050946007 (824719), страница 2
Текст из файла (страница 2)
Списки, массивы, матрицы . . .1: s1 := {a, b, c}$2: s2 := list(d, e)$3: first(s1);a4: second(s1);b5:6:7:11cons(x, s2);{x, d, e}append(s1, s2);{a, b, c, d, e}reverse(s1);{c, b, a}Следующий диалог демонстрирует, как можно изменить элемент списка.s := {1,2,3}$part(s,2) := part(s,2) + 3;{1,5,3}3: s;{1,2,3}1:2:3.24: s := part(s,2) := part(s,2) + 3;{1,5,3}5: s;{1,5,3}МассивыМассивы объявляет декларация array. Область действия объявления массива всегда глобальна, даже если массив объявляется внутрипроцедуры или блока. При переопределении массива «Reduce» выводитпредупреждение. Применение оператора clear перед переопределениемизбавит от предупреждения. Пример:y(21) := 301: array x(2, 5), y(22), z(3, 4, 5);5: clear y;2: array x(78);∗ ∗ ∗ array x redefined6: array y(1, 1);7: length(z);3: y(21);0{4, 5, 6}4: y(21) := 30;Нумерация элементов массива в каждом измерении начинается с нуля, т.е., например, массив y после второго определения имеет четыре элемента: y(0, 0), y(0, 1), y(1, 0), y(1, 1).
Команда length возвращает списокразмерностей массива.При объявлении элементы массивов инициализируются нулевыми значениями. Поэтому к элементам массивов пока им не присвоены какиенибудь переменные нельзя применять оператор let. Пример:Глава 3. Списки, массивы, матрицы . . .1: array a(10);2: let aa(5) = f ;∗ ∗ ∗ ∗ ∗ Substitution for 0 not allowed3: aa(5) := x$4: let aa(5) = f ;3.3125:6:aa(5);fx;fМатрицыМатричные переменные могут определяться декларацией matrix (раздел 10.17, стр. 43), а также возвращаться некоторыми функциями. Область действия объявления матрицы всегда глобальна, даже если матрица объявляется внутри процедуры или блока.На множестве матриц определены алгебраические операции сложения, вычитания, умножения и возведения в целочисленную степень (втом числе и отрицательную).3.3.1MatФункция mat создает матрицу и одновременно инициализирует ееэлементы.
Строки «Reduce»1: m := mat((1,2,3),(4,5,6))$2: u := mat((x), (y))$3: v := mat((x, y))$создадут следующие матрицы: 1 2 3xm=, u=,4 5 6y3.3.2v = (x y) .DetФункция det(x) вычисляет детерминант матрицы x. Пример:1: m := mat((a, b), (c, d))$2: e2 := mat((1, 0), (0, 1))$3: det(m − s ∗ e2);a ∗ d − a ∗ s − b ∗ c − d ∗ s + s ∗ ∗2Глава 3. Списки, массивы, матрицы . . .3.3.313MateigenФункция mateigen(m, lam) вычисляет собственные значения и собственные вектора матрицы m.
Результат выдает в виде двухуровнегосписка. Внутренние списки состоят из трех элементов: левая часть неприводимого уравнения от переменной lam, которому удовлетворяет собственное значение; кратность собственного значения; собственный вектор.Пример:m := mat((−1, 0), (0, 1))$mateigen(m, s);{{s + 1,1,mat((arbcomplex(1)),(0))$},{s − 1,1,mat((0),(arbcomplex(1)))$}}3: m := mat((0, 1), (0, 0))$4: mateigen(m, s);{{s,2,mat((arbcomplex(2)),(0))$}}5: m := mat((0, −1), (1, 0))$6: mateigen(m, s);{{s ∗ ∗2 + 1,1,mat(((− arbcomplex(3))/s),(arbcomplex(3)))$}}1:2:3.3.4TpФункция tp(x) вычисляет транспонированную матрицу аргумента x.Пример:1:3.3.5tp(mat((x, y)));mat((x), (y))TraceФункция trace(x) вычисляет след матрицы x. Пример:1:3.3.6trace(mat((a, b), (c, d)));a+dCofactorФункция cofactor(a, j, k) вычисляет дополнительный минор к элементу ajk матрицы a.
Пример:Глава 3. Списки, массивы, матрицы . . .1:3.3.714cofactor(mat((a1, a2, a3), (b1, b2, b3), (c1, c2, c3)), 2, 2);a1 ∗ c3 − a3 ∗ c1NullspaceФункция nullspace(a) возвращает линейно независимые решения уравнения ax = 0. Допустимо использовать в качестве аргумента двухуровневый список, который можно интерпретировать как матрицу. Пример:1:2:3.3.8nullspace(mat((1,2,3,4),(5,6,7,8)));mat((1), (0), (−3), (2))$,mat((0), (1), (−2), (1))$nullspace({{1, 2, 3, 4}, {5, 6, 7, 8}});{{1, 0, −3, 2}, {0, 1, −2, 1}}RankФункция rank(x) вычисляет ранг матрицы x. Аналогично функцииnullspace здесь также допустимо использовать в качестве аргументадвухуровневый список. Пример:1:3.4rank(mat((a, b), (c, d));22:rank({{a, b}, {c, d}};2Уравнения и правила подстановкиУравнением называется пара выражений связанных операцией «=»,а правилом подстановки называется пара выражений связанных операцией «=>».
К обоим этим конструкциям применимы функции lhs и rhs— взятия левой и правой частей конструкции. Уравнения имеют двойноеназначение: в качестве собственно уравнений в функции solve и в подстановках. Правила подстановки используются только в подстановках.Пример:1:2:3:4:3:s1 := x = y$s2 := u => v$lhs(s1);xrhs(s1);ylhs(s2);4:5:5:urhs(s2);vpart(s1, 0);equalpart(s2, 0);replacebyГлава 4Операторы4.1Операторы присвоенияДля присвоения переменной значения используются операторы «:=»и «Let». Различие между этими операторами в том, что оператор «:=»присваивает значение выражения из правой части, а оператор «Let» присваивает само выражение. Следующий фрагмент диалога с «Reduce» демонстрирует различия в работе этих операторов:1: off nat;2: a:=2∗b$3: c:=a∗x$4: let d=a∗x$5: c;2∗b∗x6:7:8:9:d;2∗b∗xa:=0$c;2∗b∗xd;010: clear a;11: c;2∗b∗x12: d;a∗xДопустима конструкция последовательного присвоенияa := b := c := d;при этом вычисления и присвоения осуществляются справа налево.
Оператор «let» может применяться к списку.Оператор «set» также, как и оператор «:=» присваивает значение, нодополнительно может присваивать это значение вычисляемому выражению:1: k := 35$3: a35;2: set(mkid(a,k), x)$xВ левой части операторов присвоения допустимы не только переменные, но и выражения.15Глава 4. Операторы4.216Сложный операторСложным оператором называется объединение последовательностиоператоров наделенное некоторыми свойствами одного оператора. «Reduce» имеет две конструкции позволяющие осуществить такое объединение.Первая конструкция, которую иногда называют простым блоком, заключает последовательность операторов в операторные скобки << и >>.Вторая конструкция, которую иногда называют жестким блоком, заключает последовательность операторов между begin и end.
В обоих блокахпосле каждого оператора последовательности, кроме последнего, долженстоять терминатор — точка с запятой или символ $ (причем, не имеетзначения какой).Значение простого блока совпадает со значением последнего оператора из блока. Значение жесткого блока, если в нем нет оператора return,всегда равно нулю. При наличии оператора return значение блока совпадает со значением этого return.Декларации scalar, integer и real позволяют вводить в жестком блоке локальные переменные.Внутри жесткого блока (и только в нем) можно использовать оператор перехода goto.Простой блок всегда может быть заменен подходящим жестким блоком, но не наоборот.4.3Условный операторУсловный оператор имеет видif bool_exp then op1 else op2; или if bool_exp then op1;Здесь bool_exp — условное выражение, op1 и op2 — операторы. Еслиbool_exp имеет значение true, то выполняется оператор op1, в противном случае в первом варианте — оператор op2, а во втором вариантеничего не выполняется.Условный оператор право ассоциативен, т.е.
выражениеif bool_exp1 then op1 else if bool_exp2 then op2 else op3;эквивалентно выражениюif bool_exp1 then op1 else << if bool_exp2 then op2 else op3 >>;Глава 4. Операторы17а выражениеif bool_exp1 then if bool_exp2 then op1 else op2;эквивалентно выражениюif bool_exp1 then << if bool_exp2 then op1 else op2 >>;4.4Оператор for . . .Оператор цикла for записывается в одной из следующих формfor j := n1 step n2 until n3 action op;for j := n1:n3 action op;for each var in list action op;Здесь n1, n2, n3 — целые числа, op — некоторый оператор, а action одиниз следующих операторов: do, product, sum, collect, join.Пример:1: x := 0$2: for j:=1:5 do x := x + j^2;3: x;554: for j:=1:5 sum j^2;555: for j:=1:5 product j;1206: for each j in {a,b,c} collect j^2;{a ∗ ∗2, b ∗ ∗2, c ∗ ∗2}7: for each j in {a,b,c} join {j^j};{a ∗ ∗a, b ∗ ∗b, c ∗ ∗c}4.5Оператор while .
. . doОператор цикла while . . . имеет видwhile bool_exp do op;Здесь bool_exp — условное выражение, а op — оператор. Оператор opбудет выполняться до тех пор пока bool_exp имеет значение true.Глава 4. Операторы4.618Оператор repeat. . . untilОператор цикла repeat . . . имеет видrepeat op until bool_exp;Здесь bool_exp — условное выражение, а op — оператор. Оператор opбудет выполняться до тех пор пока bool_exp имеет значение false.4.7Оператор gotoОператор goto осуществляет переход на метку и может применятьсятолько внутри жесткого блока, т.е. между begin и end.
Единственнаяситуация, где использование оператора goto оправдано и полезно, — этоорганизация досрочного выхода из цикла (тем более, что более удобныхспособов это сделать в «Reduce» нет). Пример:procedure get_item(s, x);beginscalar s_out, i, j, k;s_out := {};for i := 1:length(s) dofor j := 1:length(part(s, i)) dofor k := 1:length(part(s, i, j)) doif part(s,i,j,k) = x thenbegins_out := {i,j,k};goto m1;end;m1:;return s_out;end;В этом примере описана процедура, которая находит в трехуровневом списке s первый элемент равный x и возвращает список индексов,определяющих его расположение. Если такого элемента в списке s нет,то будет возвращен пустой список.Глава 5Подстановки5.1Оператор SubОператор sub осуществляет локальные подстановки в выраженияили списки выражений.
Первый аргумент оператора задает подстановки в виде списка уравнений. В левых частях уравнений могут быть какпеременные, так и выражения. Пример:1:2:5.2sub({x = a + y, y = y + 1}, x ∗ ∗2 + y ∗ ∗2);a ∗ ∗2 + 2 ∗ a ∗ y + 2 ∗ y ∗ ∗2 + 2 ∗ y + 1sub({x = a + y, y = y + 1}, x ∗ ∗2);a ∗ ∗2 + 2 ∗ a ∗ y + y ∗ ∗2Оператор LetОператор let осуществляет глобальные подстановки. В качестве аргумента может выступать уравнение, правило подстановки или списокправил подстановки.
В левых частях уравнений и правил подстановкимогут быть как переменные, так и выражения. Пример:19Глава 5. Подстановки1:2:3:4:5:5.320let {y = 6};∗ ∗ ∗ Please use => instead of = in ruleslet {y => 6};let y => 6;let y = 6;let {y => 6, z => 5};Оператор For All . . . LetОператор for all . . . let позволяет определять функции и операторы.Пример:1: operator f ;2: for all x,y let f (x, y) = x ∗ ∗2 + y ∗ ∗2;3: f (a, b);a ∗ ∗2 + b ∗ ∗25.4Оператор For All . .