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
51 @deffn {Функция} append (@var{list_1}, ..., @var{list_n})
52 Возвращает новый список элементов @var{list_1} с последующими элементами @var{list_2} и т.д.
53 @code{append} работает и с выражениями общего вида, например, @code{append (f(a,b), f(c,d,e));} дает
56 См. @code{example(append);} для примера.
58 @opencatbox{Категории:}
64 @c NEEDS CLARIFICATION AND EXAMPLES
65 @deffn {Функция} assoc (@var{key}, @var{list}, @var{default})
66 @deffnx {Функция} assoc (@var{key}, @var{list})
67 Эта функция ищет ключ @var{key} в правых частях списка @var{list},
68 имеющего форму @code{[x,y,z,...]}, где каждый элемент @var{list} есть выражение с бинарным
69 оператором и двумя операндами. Например, @code{x=1}, @code{2^3}, @code{[a,b]} и т.д.
70 Ключ @var{key} сравнивается с первым операндом.
71 Если ключ @code{key} найден, то @code{assoc} возвращает второй операнд.
72 В противном случае возвращается значение @var{default}. Параметр @var{default} не
73 обязателен и по умолчанию равен @code{false}.
75 @opencatbox{Категории:}
82 @c SPLIT OFF EXAMPLES INTO EXAMPLE SECTION
83 @deffn {Функция} atom (@var{expr})
84 Возвращает @code{true} если @var{expr} является атомарным (т.е. число, имя или строка) и @code{false}
85 в противном случае. Т.е. @code{atom(5)} равно @code{true}, тогда как @code{atom(a[1])} и @code{atom(sin(x))}
86 равны @code{false} (предполагая, что @code{a[1]} и @code{x} не имеют значения).
88 @opencatbox{Категории:}
89 @category{Функции предикаты}
94 @c NEED ANOTHER deffn FOR GENERAL EXPRESSIONS ARGUMENTS
95 @c SPLIT OFF EXAMPLES INTO EXAMPLE SECTION
96 @deffn {Функция} cons (@var{expr}, @var{list})
97 Возвращает новый список, составленный из первого элемента равного @var{expr} с последующими
98 элементами @var{list}. Функция @code{cons} работает и с произвольными выражениями,
99 например, @code{cons(x, f(a,b,c));} -> @code{f(x,a,b,c)}.
101 @opencatbox{Категории:}
107 @deffn {Функция} copylist (@var{list})
108 Возвращает копию списка @var{list}.
110 @opencatbox{Категории:}
115 @deffn {Функция} create_list (@var{form}, @var{x_1}, @var{list_1}, ..., @var{x_n}, @var{list_n})
117 Создает список, вычисляя выражение @var{form} с @var{x_1} последовательно равным элементам
118 @var{list_1}, @var{x_2} последовательно равным элементам @var{list_2} и т.д.
119 Общее число элементов в результирующем списке равно произведению числа
120 элементов во всех списках.
121 Каждая переменная @var{x_i} должна быть символом. Переменные не вычисляются.
122 Списки вычисляются однажды в начале итерации.
125 (%i1) create_list(x^i,i,[1,3,7]);
134 (%i1) create_list([i,j],i,[a,b],j,[e,f,h]);
135 (%o1) [[a, e], [a, f], [a, h], [b, e], [b, f], [b, h]]
138 Вместо списка @var{list_i} можно использовать два параметра, которые
139 должны иметь числовые значения. Они будут рассматриваться как нижняя и верхняя
140 границы итерации (включительно).
143 (%i1) create_list([i,j],i,[1,2,3],j,1,i);
144 (%o1) [[1, 1], [2, 1], [2, 2], [3, 1], [3, 2], [3, 3]]
147 Отметим, что пределы для переменной @code{j} могут зависеть от @code{i}.
149 @opencatbox{Категории:}
154 @deffn {Функция} delete (@var{expr_1}, @var{expr_2})
155 @deffnx {Функция} delete (@var{expr_1}, @var{expr_2}, @var{n})
156 Удаляет все элементы, равные @var{expr_1}, из @var{expr_2}. При этом @var{expr_1}
157 может быть слагаемым @var{expr_2} (если это сумма) или множителем @var{expr_2}
158 (если это произведение).
161 @c delete(sin(x), x+sin(x)+y);
164 (%i1) delete(sin(x), x+sin(x)+y);
169 Вызов @code{delete(@var{expr_1}, @var{expr_2}, @var{n})} удаляет первые @var{n} случаев
170 @var{expr_1} из @var{expr_2}. Если число включений @var{expr_1} в @var{expr_2} меньше @var{n},
171 то будут удалены все.
174 @c delete(a, f(a,b,c,d,a));
175 @c delete(a, f(a,b,a,c,d,a), 2);
178 (%i1) delete(a, f(a,b,c,d,a));
180 (%i2) delete(a, f(a,b,a,c,d,a), 2);
185 @opencatbox{Категории:}
191 @deffn {Функция} eighth (@var{expr})
192 Возвращает восьмой элемент выражения или списка @var{expr}.
193 См. @code{first} по поводу подробностей.
195 @opencatbox{Категории:}
201 @c NEED ANOTHER deffn FOR GENERAL EXPRESSIONS ARGUMENTS
202 @c SPLIT OFF EXAMPLES INTO EXAMPLE SECTION
203 @deffn {Функция} endcons (@var{expr}, @var{list})
204 Возвращает новый список, состоящий из элементов @code{list} с последующим @var{expr}.
205 Функция @code{endcons} работает и с общими выражениями, например,
206 @code{endcons(x, f(a,b,c));} -> @code{f(a,b,c,x)}.
208 @opencatbox{Категории:}
214 @deffn {Функция} fifth (@var{expr})
215 Возвращает пятый элемент выражения или списка @var{expr}.
216 См. @code{first} по поводу подробностей.
218 @opencatbox{Категории:}
224 @c NEEDS CLARIFICATION AND EXAMPLES
225 @deffn {Функция} first (@var{expr})
226 Возвращает первый элемент @var{expr}, что может быть первым элементом списка,
227 первой строкой в матрице, первым слагаемым суммы и т.д.
228 Заметим, что @code{first} и другие подобные функции, такие как @code{rest} и @code{last},
229 работают с внешней (печатной) формой выражения @var{expr},
230 а не с тем, как это выражение было введено.
231 Если значение @code{inflag} равно @code{true}, то эти функции будут
232 работать с внутренним представлением выражения @var{expr}. Отметим, что упрощатель
233 изменяет порядок членов в выражениях. Так, @code{first(x+y)} будет равно @code{x}, если @code{inflag}
234 равна @code{true}, и @code{y}, если @code{inflag} равна @code{false} (@code{first(y+x)} даст одинаковый
235 результат в обоих случаях). Функции @code{second} .. @code{tenth} дают со второго по десятый
238 @opencatbox{Категории:}
244 @deffn {Функция} fourth (@var{expr})
245 Возвращает четвертый элемент выражения или списка @var{expr}.
246 См. @code{first} по поводу подробностей.
248 @opencatbox{Категории:}
254 @deffn {Функция} get (@var{a}, @var{i})
255 Возвращает определенное пользователем свойство атома @var{a}, обозначенное @var{i}, или
256 @code{false}, если атом не имеет свойства @var{i}.
258 Функция @code{get} вычисляет свои аргументы.
261 @c put (%e, 'transcendental, 'type);
262 @c put (%pi, 'transcendental, 'type)$
263 @c put (%i, 'algebraic, 'type)$
264 @c typeof (expr) := block ([q],
266 @c then return ('algebraic),
267 @c if not atom (expr)
268 @c then return (maplist ('typeof, expr)),
269 @c q: get (expr, 'type),
271 @c then errcatch (error(expr,"is not numeric.")) else q)$
272 @c typeof (2*%e + x*%pi);
273 @c typeof (2*%e + %pi);
276 (%i1) put (%e, 'transcendental, 'type);
278 (%i2) put (%pi, 'transcendental, 'type)$
279 (%i3) put (%i, 'algebraic, 'type)$
280 (%i4) typeof (expr) := block ([q],
282 then return ('algebraic),
284 then return (maplist ('typeof, expr)),
285 q: get (expr, 'type),
287 then errcatch (error(expr,"is not numeric.")) else q)$
288 (%i5) typeof (2*%e + x*%pi);
290 (%o5) [[transcendental, []], [algebraic, transcendental]]
291 (%i6) typeof (2*%e + %pi);
292 (%o6) [transcendental, [algebraic, transcendental]]
296 @opencatbox{Категории:}
297 @category{Факты и выводы}
301 @deffn {Функция} join (@var{l}, @var{m})
302 Возвращает новый список, состоящий из чередующихся элементов списков @var{l} и @var{m}.
303 Результат будет иметь вид @code{[@var{l}[1], @var{m}[1], @var{l}[2], @var{m}[2], ...]}.
304 Списки @var{l} и @var{m} могут иметь элементы любого типа.
306 Если списки имеют разную длину, то @code{join} отбросит последние элементы более длинного списка.
308 Ситуация, когда либо @var{l}, либо @var{m} не является списком, считается ошибкой.
313 @c L1: [a, sin(b), c!, d - 1];
314 @c join (L1, [1, 2, 3, 4]);
315 @c join (L1, [aa, bb, cc, dd, ee, ff]);
318 (%i1) L1: [a, sin(b), c!, d - 1];
319 (%o1) [a, sin(b), c!, d - 1]
320 (%i2) join (L1, [1, 2, 3, 4]);
321 (%o2) [a, 1, sin(b), 2, c!, 3, d - 1, 4]
322 (%i3) join (L1, [aa, bb, cc, dd, ee, ff]);
323 (%o3) [a, aa, sin(b), bb, c!, cc, d - 1, dd]
326 @opencatbox{Категории:}
332 @c HOW IS "LAST" PART DETERMINED ??
333 @deffn {Функция} last (@var{expr})
334 Возвращает последний элемент @var{expr} (элемент, слагаемое, множитель, строку и т.п.).
336 @opencatbox{Категории:}
342 @c NEEDS CLARIFICATION AND EXAMPLES
343 @deffn {Функция} length (@var{expr})
344 По умолчанию возвращает число частей внешней (печатной) формы выражения @var{expr}.
345 Для списка -- это число элементов, для матрицы -- число строк, для суммы -- число
346 слагаемых (см. @code{dispform}).
348 Результат @code{length} зависит от переключателя @code{inflag}.
349 Например, @code{length(a/(b*c));} дает 2, если @code{inflag} равен @code{false}
350 (предполагается, что @code{exptdispflag} равна @code{true}), и дает 3, если @code{inflag}
351 равен @code{true}, т.к. внутренние представление есть @code{a*b^-1*c^-1}.
353 @opencatbox{Категории:}
359 @defvr {Управляющая переменная} listarith
360 Значение по умолчанию: @code{true}
361 Если равна @code{false}, то все арифметические операции со списками не работают.
362 Если равна @code{true}, то все операции список-матрица вызывают преобразование списков
363 в матрицы и дают результат матричного типа. Однако, операции список-список
364 продолжают давать списки.
366 @opencatbox{Категории:}
368 @category{Глобальные флаги}
372 @deffn {Функция} listp (@var{expr})
373 Возвращает @code{true}, если @var{expr} является списком и @code{false} в противном случае.
375 @opencatbox{Категории:}
377 @category{Функции предикаты}
381 @deffn {Функция} makelist (@var{expr}, @var{i}, @var{i_0}, @var{i_1})
382 @deffnx {Функция} makelist (@var{expr}, @var{x}, @var{list})
383 Создает и возвращает список, каждый элемент которого
384 построен из выражения @var{expr}.
386 Вызов @code{makelist (@var{expr}, @var{i}, @var{i_0}, @var{i_1})} возвращает список,
387 с @code{j}-м элементом равным @code{ev (@var{expr}, @var{i}=j)} для
388 @code{j}, пробегающего значения от @var{i_0} до @var{i_1}.
390 Вызов @code{makelist (@var{expr}, @var{x}, @var{list})} возвращает список,
391 с @code{j}-м элементом равным @code{ev (@var{expr}, @var{x}=@var{list}[j])}
392 для @code{j}, пробегающего значения от 1 до @code{length (@var{list})}.
397 @c makelist(concat(x,i),i,1,6);
398 @c makelist(x=y,y,[a,b,c]);
401 (%i1) makelist(concat(x,i),i,1,6);
402 (%o1) [x1, x2, x3, x4, x5, x6]
403 (%i2) makelist(x=y,y,[a,b,c]);
404 (%o2) [x = a, x = b, x = c]
408 @opencatbox{Категории:}
413 @deffn {Функция} member (@var{expr_1}, @var{expr_2})
415 Возвращает @code{true} если @code{is(@var{expr_1} = @var{a})},
416 для некоторого элемента @var{a} из @code{args(@var{expr_2})},
417 и @code{false} в противном случае.
419 Обычно, @code{expr_2} является списком.
420 В этом случае @code{args(@var{expr_2}) = @var{expr_2}}
421 и @code{is(@var{expr_1} = @var{a})} для некоторого элемента @var{a} из @code{expr_2}.
423 Функция @code{member} не анализирует составные части аргументов @code{expr_2},
424 и может возвратить @code{false} даже если @code{expr_1} является частью какого-либо из
425 аргументов @code{expr_2}.
427 См. также @code{elementp}.
432 @c member (8, [8, 8.0, 8b0]);
433 @c member (8, [8.0, 8b0]);
434 @c member (b, [a, b, c]);
435 @c member (b, [[a, b], [b, c]]);
436 @c member ([b, c], [[a, b], [b, c]]);
437 @c F (1, 1/2, 1/4, 1/8);
439 @c member ("ab", ["aa", "ab", sin(1), a + b]);
442 (%i1) member (8, [8, 8.0, 8b0]);
444 (%i2) member (8, [8.0, 8b0]);
446 (%i3) member (b, [a, b, c]);
448 (%i4) member (b, [[a, b], [b, c]]);
450 (%i5) member ([b, c], [[a, b], [b, c]]);
452 (%i6) F (1, 1/2, 1/4, 1/8);
456 (%i7) member (1/8, %);
458 (%i8) member ("ab", ["aa", "ab", sin(1), a + b]);
462 @opencatbox{Категории:}
465 @category{Функции предикаты}
469 @deffn {Функция} ninth (@var{expr})
470 Возвращает девятый элемент выражения или списка @var{expr}.
471 См. @code{first} по поводу подробностей.
473 @opencatbox{Категории:}
480 @deffn {Функция} unique (@var{L})
482 Возвращает уникальные элементы списка @var{L}.
484 Если все элементы списка @var{L} уникальны, то
485 @code{unique} возвращает копию верхнего уровня
486 списка @var{L}, а не сам список @var{L}.
488 Если @var{L} не является списком, то @code{unique} возвращает @var{L}.
493 @c unique ([1, %pi, a + b, 2, 1, %e, %pi, a + b, [1]]);
496 (%i1) unique ([1, %pi, a + b, 2, 1, %e, %pi, a + b, [1]]);
497 (%o1) [1, 2, %e, %pi, [1], b + a]
500 @opencatbox{Категории:}
507 @deffn {Функция} rest (@var{expr}, @var{n})
508 @deffnx {Функция} rest (@var{expr})
509 Возвращает @var{expr} без первых @var{n} элементов, если @var{n} положительно,
510 или без последних @code{- @var{n}} элементов, если @var{n} отрицательно.
511 Если @var{n} равен 1, то он может быть опущен.
512 Выражение @var{expr} может быть списком, матрицей или выражением.
514 @opencatbox{Категории:}
520 @c NEED ANOTHER deffn FOR GENERAL EXPRESSIONS ARGUMENTS
521 @c SPLIT OFF EXAMPLES INTO EXAMPLE SECTION
522 @deffn {Функция} reverse (@var{list})
523 Изменяет порядок членов @var{list} (но не сами члены) на обратный.
524 Функция @code{reverse} также работает с выражениями общего вида,
525 например, @code{reverse(a=b);} дает @code{b=a}.
527 @opencatbox{Категории:}
533 @deffn {Функция} second (@var{expr})
534 Возвращает второй элемент выражения или списка @var{expr}.
535 См. @code{first} по поводу подробностей.
537 @opencatbox{Категории:}
543 @deffn {Функция} seventh (@var{expr})
544 Возвращает седьмой элемент выражения или списка @var{expr}.
545 См. @code{first} по поводу подробностей.
547 @opencatbox{Категории:}
553 @deffn {Функция} sixth (@var{expr})
554 Возвращает шестой элемент выражения или списка @var{expr}.
555 См. @code{first} по поводу подробностей.
557 @opencatbox{Категории:}
563 @deffn {Функция} sublist_indices (@var{L}, @var{P})
565 Возвращает список индексов элементов @code{x} списка @var{L}, для которых
566 предикат @code{maybe(@var{P}(x))} возвращает @code{true},
567 за исключением элементов @code{unknown} и @code{false}.
568 Параметр @var{P} может быть именем функции или лямбда-выражением.
569 Параметр @var{L} должен быть списком.
574 @c sublist_indices ('[a, b, b, c, 1, 2, b, 3, b],
575 @c lambda ([x], x='b));
576 @c sublist_indices ('[a, b, b, c, 1, 2, b, 3, b], symbolp);
577 @c sublist_indices ([1 > 0, 1 < 0, 2 < 1, 2 > 1, 2 > 0],
580 @c map (maybe, [x > 0, x < 0, x < -2]);
581 @c sublist_indices ([x > 0, x < 0, x < -2], identity);
585 (%i1) sublist_indices ('[a, b, b, c, 1, 2, b, 3, b],
588 (%i2) sublist_indices ('[a, b, b, c, 1, 2, b, 3, b], symbolp);
589 (%o2) [1, 2, 3, 4, 7, 9]
590 (%i3) sublist_indices ([1 > 0, 1 < 0, 2 < 1, 2 > 1, 2 > 0],
593 (%i4) assume (x < -1);
595 (%i5) map (maybe, [x > 0, x < 0, x < -2]);
596 (%o5) [false, true, unknown]
597 (%i6) sublist_indices ([x > 0, x < 0, x < -2], identity);
601 @opencatbox{Категории:}
606 @deffn {Функция} tenth (@var{expr})
607 Возвращает десятый элемент выражения или списка @var{expr}.
608 См. @code{first} по поводу подробностей.
610 @opencatbox{Категории:}
616 @deffn {Функция} third (@var{expr})
617 Возвращает третий элемент выражения или списка @var{expr}.
618 См. @code{first} по поводу подробностей.
620 @opencatbox{Категории:}