4 @c OriginalRevision=1.34
5 @c TranslatedBy: (c) 2007-06 Vadim V. Zhytnikov <vvzhyt@gmail.com>
8 * Ведение в работу со списками::
9 * Функции и переменные для работы со списками::
12 @node Ведение в работу со списками, Функции и переменные для работы со списками, Списки, Списки
13 @section Ведение в работу со списками
15 Списки являются основными строительными блоками в Maxima и Lisp. Все типы данных,
16 за исключением массивов, хеш-таблиц и чисел, представлены, как Lisp списки.
24 для обозначения @code{a+2}. На уровне Maxima мы увидим в инфиксной нотации @code{a+2}.
25 Maxima тоже имеет свои собственные списки, которые печатаются как
32 для списка из 4 элементов. Внутренне, это выражение соответствует Lisp списку
35 ((MLIST) 1 2 7 ((MPLUS) $X $Y ))
39 Флаг, который обозначает тип выражения Maxima, сам является списком, и после
40 упрощения, данный список приобретет вид
43 ((MLIST SIMP) 1 2 7 ((MPLUS SIMP) $X $Y))
46 @node Функции и переменные для работы со списками, , Ведение в работу со списками, Списки
47 @section Функции и переменные для работы со списками
49 @c NEED ANOTHER deffn FOR GENERAL EXPRESSIONS ARGUMENTS
50 @c NEEDS CLARIFICATION AND EXAMPLES
52 @deffn {Функция} append (@var{list_1}, ..., @var{list_n})
53 Возвращает новый список элементов @var{list_1} с последующими элементами @var{list_2} и т.д.
54 @code{append} работает и с выражениями общего вида, например, @code{append (f(a,b), f(c,d,e));} дает
57 См. @code{example(append);} для примера.
59 @opencatbox{Категории:}
65 @c NEEDS CLARIFICATION AND EXAMPLES
66 @deffn {Функция} assoc (@var{key}, @var{list}, @var{default})
67 @deffnx {Функция} assoc (@var{key}, @var{list})
68 Эта функция ищет ключ @var{key} в правых частях списка @var{list},
69 имеющего форму @code{[x,y,z,...]}, где каждый элемент @var{list} есть выражение с бинарным
70 оператором и двумя операндами. Например, @code{x=1}, @code{2^3}, @code{[a,b]} и т.д.
71 Ключ @var{key} сравнивается с первым операндом.
72 Если ключ @code{key} найден, то @code{assoc} возвращает второй операнд.
73 В противном случае возвращается значение @var{default}. Параметр @var{default} не
74 обязателен и по умолчанию равен @code{false}.
76 @opencatbox{Категории:}
83 @c SPLIT OFF EXAMPLES INTO EXAMPLE SECTION
84 @deffn {Функция} atom (@var{expr})
85 Возвращает @code{true} если @var{expr} является атомарным (т.е. число, имя или строка) и @code{false}
86 в противном случае. Т.е. @code{atom(5)} равно @code{true}, тогда как @code{atom(a[1])} и @code{atom(sin(x))}
87 равны @code{false} (предполагая, что @code{a[1]} и @code{x} не имеют значения).
89 @opencatbox{Категории:}
90 @category{Функции предикаты}
95 @c NEED ANOTHER deffn FOR GENERAL EXPRESSIONS ARGUMENTS
96 @c SPLIT OFF EXAMPLES INTO EXAMPLE SECTION
97 @deffn {Функция} cons (@var{expr}, @var{list})
98 Возвращает новый список, составленный из первого элемента равного @var{expr} с последующими
99 элементами @var{list}. Функция @code{cons} работает и с произвольными выражениями,
100 например, @code{cons(x, f(a,b,c));} -> @code{f(x,a,b,c)}.
102 @opencatbox{Категории:}
108 @deffn {Функция} copylist (@var{list})
109 Возвращает копию списка @var{list}.
111 @opencatbox{Категории:}
116 @deffn {Функция} create_list (@var{form}, @var{x_1}, @var{list_1}, ..., @var{x_n}, @var{list_n})
118 Создает список, вычисляя выражение @var{form} с @var{x_1} последовательно равным элементам
119 @var{list_1}, @var{x_2} последовательно равным элементам @var{list_2} и т.д.
120 Общее число элементов в результирующем списке равно произведению числа
121 элементов во всех списках.
122 Каждая переменная @var{x_i} должна быть символом. Переменные не вычисляются.
123 Списки вычисляются однажды в начале итерации.
126 (%i1) create_list(x^i,i,[1,3,7]);
135 (%i1) create_list([i,j],i,[a,b],j,[e,f,h]);
136 (%o1) [[a, e], [a, f], [a, h], [b, e], [b, f], [b, h]]
139 Вместо списка @var{list_i} можно использовать два параметра, которые
140 должны иметь числовые значения. Они будут рассматриваться как нижняя и верхняя
141 границы итерации (включительно).
144 (%i1) create_list([i,j],i,[1,2,3],j,1,i);
145 (%o1) [[1, 1], [2, 1], [2, 2], [3, 1], [3, 2], [3, 3]]
148 Отметим, что пределы для переменной @code{j} могут зависеть от @code{i}.
150 @opencatbox{Категории:}
155 @deffn {Функция} delete (@var{expr_1}, @var{expr_2})
156 @deffnx {Функция} delete (@var{expr_1}, @var{expr_2}, @var{n})
157 Удаляет все элементы, равные @var{expr_1}, из @var{expr_2}. При этом @var{expr_1}
158 может быть слагаемым @var{expr_2} (если это сумма) или множителем @var{expr_2}
159 (если это произведение).
162 @c delete(sin(x), x+sin(x)+y);
165 (%i1) delete(sin(x), x+sin(x)+y);
170 Вызов @code{delete(@var{expr_1}, @var{expr_2}, @var{n})} удаляет первые @var{n} случаев
171 @var{expr_1} из @var{expr_2}. Если число включений @var{expr_1} в @var{expr_2} меньше @var{n},
172 то будут удалены все.
175 @c delete(a, f(a,b,c,d,a));
176 @c delete(a, f(a,b,a,c,d,a), 2);
179 (%i1) delete(a, f(a,b,c,d,a));
181 (%i2) delete(a, f(a,b,a,c,d,a), 2);
186 @opencatbox{Категории:}
192 @deffn {Функция} eighth (@var{expr})
193 Возвращает восьмой элемент выражения или списка @var{expr}.
194 См. @code{first} по поводу подробностей.
196 @opencatbox{Категории:}
202 @c NEED ANOTHER deffn FOR GENERAL EXPRESSIONS ARGUMENTS
203 @c SPLIT OFF EXAMPLES INTO EXAMPLE SECTION
204 @deffn {Функция} endcons (@var{expr}, @var{list})
205 Возвращает новый список, состоящий из элементов @code{list} с последующим @var{expr}.
206 Функция @code{endcons} работает и с общими выражениями, например,
207 @code{endcons(x, f(a,b,c));} -> @code{f(a,b,c,x)}.
209 @opencatbox{Категории:}
215 @deffn {Функция} fifth (@var{expr})
216 Возвращает пятый элемент выражения или списка @var{expr}.
217 См. @code{first} по поводу подробностей.
219 @opencatbox{Категории:}
225 @c NEEDS CLARIFICATION AND EXAMPLES
226 @deffn {Функция} first (@var{expr})
227 Возвращает первый элемент @var{expr}, что может быть первым элементом списка,
228 первой строкой в матрице, первым слагаемым суммы и т.д.
229 Заметим, что @code{first} и другие подобные функции, такие как @code{rest} и @code{last},
230 работают с внешней (печатной) формой выражения @var{expr},
231 а не с тем, как это выражение было введено.
232 Если значение @code{inflag} равно @code{true}, то эти функции будут
233 работать с внутренним представлением выражения @var{expr}. Отметим, что упрощатель
234 изменяет порядок членов в выражениях. Так, @code{first(x+y)} будет равно @code{x}, если @code{inflag}
235 равна @code{true}, и @code{y}, если @code{inflag} равна @code{false} (@code{first(y+x)} даст одинаковый
236 результат в обоих случаях). Функции @code{second} .. @code{tenth} дают со второго по десятый
239 @opencatbox{Категории:}
245 @deffn {Функция} fourth (@var{expr})
246 Возвращает четвертый элемент выражения или списка @var{expr}.
247 См. @code{first} по поводу подробностей.
249 @opencatbox{Категории:}
255 @deffn {Функция} get (@var{a}, @var{i})
256 Возвращает определенное пользователем свойство атома @var{a}, обозначенное @var{i}, или
257 @code{false}, если атом не имеет свойства @var{i}.
259 Функция @code{get} вычисляет свои аргументы.
262 @c put (%e, 'transcendental, 'type);
263 @c put (%pi, 'transcendental, 'type)$
264 @c put (%i, 'algebraic, 'type)$
265 @c typeof (expr) := block ([q],
267 @c then return ('algebraic),
268 @c if not atom (expr)
269 @c then return (maplist ('typeof, expr)),
270 @c q: get (expr, 'type),
272 @c then errcatch (error(expr,"is not numeric.")) else q)$
273 @c typeof (2*%e + x*%pi);
274 @c typeof (2*%e + %pi);
277 (%i1) put (%e, 'transcendental, 'type);
279 (%i2) put (%pi, 'transcendental, 'type)$
280 (%i3) put (%i, 'algebraic, 'type)$
281 (%i4) typeof (expr) := block ([q],
283 then return ('algebraic),
285 then return (maplist ('typeof, expr)),
286 q: get (expr, 'type),
288 then errcatch (error(expr,"is not numeric.")) else q)$
289 (%i5) typeof (2*%e + x*%pi);
291 (%o5) [[transcendental, []], [algebraic, transcendental]]
292 (%i6) typeof (2*%e + %pi);
293 (%o6) [transcendental, [algebraic, transcendental]]
297 @opencatbox{Категории:}
298 @category{Факты и выводы}
302 @deffn {Функция} join (@var{l}, @var{m})
303 Возвращает новый список, состоящий из чередующихся элементов списков @var{l} и @var{m}.
304 Результат будет иметь вид @code{[@var{l}[1], @var{m}[1], @var{l}[2], @var{m}[2], ...]}.
305 Списки @var{l} и @var{m} могут иметь элементы любого типа.
307 Если списки имеют разную длину, то @code{join} отбросит последние элементы более длинного списка.
309 Ситуация, когда либо @var{l}, либо @var{m} не является списком, считается ошибкой.
314 @c L1: [a, sin(b), c!, d - 1];
315 @c join (L1, [1, 2, 3, 4]);
316 @c join (L1, [aa, bb, cc, dd, ee, ff]);
319 (%i1) L1: [a, sin(b), c!, d - 1];
320 (%o1) [a, sin(b), c!, d - 1]
321 (%i2) join (L1, [1, 2, 3, 4]);
322 (%o2) [a, 1, sin(b), 2, c!, 3, d - 1, 4]
323 (%i3) join (L1, [aa, bb, cc, dd, ee, ff]);
324 (%o3) [a, aa, sin(b), bb, c!, cc, d - 1, dd]
327 @opencatbox{Категории:}
333 @c HOW IS "LAST" PART DETERMINED ??
334 @deffn {Функция} last (@var{expr})
335 Возвращает последний элемент @var{expr} (элемент, слагаемое, множитель, строку и т.п.).
337 @opencatbox{Категории:}
343 @c NEEDS CLARIFICATION AND EXAMPLES
344 @deffn {Функция} length (@var{expr})
345 По умолчанию возвращает число частей внешней (печатной) формы выражения @var{expr}.
346 Для списка -- это число элементов, для матрицы -- число строк, для суммы -- число
347 слагаемых (см. @code{dispform}).
349 Результат @code{length} зависит от переключателя @code{inflag}.
350 Например, @code{length(a/(b*c));} дает 2, если @code{inflag} равен @code{false}
351 (предполагается, что @code{exptdispflag} равна @code{true}), и дает 3, если @code{inflag}
352 равен @code{true}, т.к. внутренние представление есть @code{a*b^-1*c^-1}.
354 @opencatbox{Категории:}
361 @defvr {Управляющая переменная} listarith
362 Значение по умолчанию: @code{true}
363 Если равна @code{false}, то все арифметические операции со списками не работают.
364 Если равна @code{true}, то все операции список-матрица вызывают преобразование списков
365 в матрицы и дают результат матричного типа. Однако, операции список-список
366 продолжают давать списки.
368 @opencatbox{Категории:}
370 @category{Глобальные флаги}
374 @deffn {Функция} listp (@var{expr})
375 Возвращает @code{true}, если @var{expr} является списком и @code{false} в противном случае.
377 @opencatbox{Категории:}
379 @category{Функции предикаты}
383 @deffn {Функция} makelist (@var{expr}, @var{i}, @var{i_0}, @var{i_1})
384 @deffnx {Функция} makelist (@var{expr}, @var{x}, @var{list})
385 Создает и возвращает список, каждый элемент которого
386 построен из выражения @var{expr}.
388 Вызов @code{makelist (@var{expr}, @var{i}, @var{i_0}, @var{i_1})} возвращает список,
389 с @code{j}-м элементом равным @code{ev (@var{expr}, @var{i}=j)} для
390 @code{j}, пробегающего значения от @var{i_0} до @var{i_1}.
392 Вызов @code{makelist (@var{expr}, @var{x}, @var{list})} возвращает список,
393 с @code{j}-м элементом равным @code{ev (@var{expr}, @var{x}=@var{list}[j])}
394 для @code{j}, пробегающего значения от 1 до @code{length (@var{list})}.
399 @c makelist(concat(x,i),i,1,6);
400 @c makelist(x=y,y,[a,b,c]);
403 (%i1) makelist(concat(x,i),i,1,6);
404 (%o1) [x1, x2, x3, x4, x5, x6]
405 (%i2) makelist(x=y,y,[a,b,c]);
406 (%o2) [x = a, x = b, x = c]
410 @opencatbox{Категории:}
415 @deffn {Функция} member (@var{expr_1}, @var{expr_2})
417 Возвращает @code{true} если @code{is(@var{expr_1} = @var{a})},
418 для некоторого элемента @var{a} из @code{args(@var{expr_2})},
419 и @code{false} в противном случае.
421 Обычно, @code{expr_2} является списком.
422 В этом случае @code{args(@var{expr_2}) = @var{expr_2}}
423 и @code{is(@var{expr_1} = @var{a})} для некоторого элемента @var{a} из @code{expr_2}.
425 Функция @code{member} не анализирует составные части аргументов @code{expr_2},
426 и может возвратить @code{false} даже если @code{expr_1} является частью какого-либо из
427 аргументов @code{expr_2}.
429 См. также @code{elementp}.
434 @c member (8, [8, 8.0, 8b0]);
435 @c member (8, [8.0, 8b0]);
436 @c member (b, [a, b, c]);
437 @c member (b, [[a, b], [b, c]]);
438 @c member ([b, c], [[a, b], [b, c]]);
439 @c F (1, 1/2, 1/4, 1/8);
441 @c member ("ab", ["aa", "ab", sin(1), a + b]);
444 (%i1) member (8, [8, 8.0, 8b0]);
446 (%i2) member (8, [8.0, 8b0]);
448 (%i3) member (b, [a, b, c]);
450 (%i4) member (b, [[a, b], [b, c]]);
452 (%i5) member ([b, c], [[a, b], [b, c]]);
454 (%i6) F (1, 1/2, 1/4, 1/8);
458 (%i7) member (1/8, %);
460 (%i8) member ("ab", ["aa", "ab", sin(1), a + b]);
464 @opencatbox{Категории:}
467 @category{Функции предикаты}
471 @deffn {Функция} ninth (@var{expr})
472 Возвращает девятый элемент выражения или списка @var{expr}.
473 См. @code{first} по поводу подробностей.
475 @opencatbox{Категории:}
482 @deffn {Функция} unique (@var{L})
484 Возвращает уникальные элементы списка @var{L}.
486 Если все элементы списка @var{L} уникальны, то
487 @code{unique} возвращает копию верхнего уровня
488 списка @var{L}, а не сам список @var{L}.
490 Если @var{L} не является списком, то @code{unique} возвращает @var{L}.
495 @c unique ([1, %pi, a + b, 2, 1, %e, %pi, a + b, [1]]);
498 (%i1) unique ([1, %pi, a + b, 2, 1, %e, %pi, a + b, [1]]);
499 (%o1) [1, 2, %e, %pi, [1], b + a]
502 @opencatbox{Категории:}
509 @deffn {Функция} rest (@var{expr}, @var{n})
510 @deffnx {Функция} rest (@var{expr})
511 Возвращает @var{expr} без первых @var{n} элементов, если @var{n} положительно,
512 или без последних @code{- @var{n}} элементов, если @var{n} отрицательно.
513 Если @var{n} равен 1, то он может быть опущен.
514 Выражение @var{expr} может быть списком, матрицей или выражением.
516 @opencatbox{Категории:}
522 @c NEED ANOTHER deffn FOR GENERAL EXPRESSIONS ARGUMENTS
523 @c SPLIT OFF EXAMPLES INTO EXAMPLE SECTION
525 @deffn {Функция} reverse (@var{list})
526 Изменяет порядок членов @var{list} (но не сами члены) на обратный.
527 Функция @code{reverse} также работает с выражениями общего вида,
528 например, @code{reverse(a=b);} дает @code{b=a}.
530 @opencatbox{Категории:}
536 @deffn {Функция} second (@var{expr})
537 Возвращает второй элемент выражения или списка @var{expr}.
538 См. @code{first} по поводу подробностей.
540 @opencatbox{Категории:}
546 @deffn {Функция} seventh (@var{expr})
547 Возвращает седьмой элемент выражения или списка @var{expr}.
548 См. @code{first} по поводу подробностей.
550 @opencatbox{Категории:}
556 @deffn {Функция} sixth (@var{expr})
557 Возвращает шестой элемент выражения или списка @var{expr}.
558 См. @code{first} по поводу подробностей.
560 @opencatbox{Категории:}
566 @deffn {Функция} sublist_indices (@var{L}, @var{P})
568 Возвращает список индексов элементов @code{x} списка @var{L}, для которых
569 предикат @code{maybe(@var{P}(x))} возвращает @code{true},
570 за исключением элементов @code{unknown} и @code{false}.
571 Параметр @var{P} может быть именем функции или лямбда-выражением.
572 Параметр @var{L} должен быть списком.
577 @c sublist_indices ('[a, b, b, c, 1, 2, b, 3, b],
578 @c lambda ([x], x='b));
579 @c sublist_indices ('[a, b, b, c, 1, 2, b, 3, b], symbolp);
580 @c sublist_indices ([1 > 0, 1 < 0, 2 < 1, 2 > 1, 2 > 0],
583 @c map (maybe, [x > 0, x < 0, x < -2]);
584 @c sublist_indices ([x > 0, x < 0, x < -2], identity);
588 (%i1) sublist_indices ('[a, b, b, c, 1, 2, b, 3, b],
591 (%i2) sublist_indices ('[a, b, b, c, 1, 2, b, 3, b], symbolp);
592 (%o2) [1, 2, 3, 4, 7, 9]
593 (%i3) sublist_indices ([1 > 0, 1 < 0, 2 < 1, 2 > 1, 2 > 0],
596 (%i4) assume (x < -1);
598 (%i5) map (maybe, [x > 0, x < 0, x < -2]);
599 (%o5) [false, true, unknown]
600 (%i6) sublist_indices ([x > 0, x < 0, x < -2], identity);
604 @opencatbox{Категории:}
609 @deffn {Функция} tenth (@var{expr})
610 Возвращает десятый элемент выражения или списка @var{expr}.
611 См. @code{first} по поводу подробностей.
613 @opencatbox{Категории:}
619 @deffn {Функция} third (@var{expr})
620 Возвращает третий элемент выражения или списка @var{expr}.
621 См. @code{first} по поводу подробностей.
623 @opencatbox{Категории:}