Âåäåíèå â ðàáîòó ñî ñïèñêàìè
============================

Ñïèñêè ÿâëÿþòñÿ îñíîâíûìè ñòðîèòåëüíûìè áëîêàìè â Maxima è Lisp.   Âñå òèïû äàííûõ, çà èñêëþ÷åíèåì ìàññèâîâ, õåø-òàáëèö è ÷èñåë, ïðåäñòàâëåíû, êàê Lisp ñïèñêè. Ýòè ñïèñêè èìåþò âèä

     ((MPLUS) $A 2)

äëÿ îáîçíà÷åíèÿ a+2.  Íà óðîâíå Maxima ìû óâèäèì â èíôèêñíîé íîòàöèè a+2. Maxima òîæå èìååò ñâîè ñîáñòâåííûå ñïèñêè, êîòîðûå ïå÷àòàþòñÿ êàê

     [1, 2, 7, x+y]

äëÿ ñïèñêà èç 4 ýëåìåíòîâ.  Âíóòðåííå, ýòî âûðàæåíèå ñîîòâåòñòâóåò Lisp ñïèñêó

     ((MLIST) 1  2  7  ((MPLUS)  $X $Y ))

Ôëàã, êîòîðûé îáîçíà÷àåò òèï âûðàæåíèÿ Maxima, ñàì ÿâëÿåòñÿ ñïèñêîì, è ïîñëå óïðîùåíèÿ, äàííûé ñïèñîê ïðèîáðåòåò âèä

     ((MLIST SIMP) 1 2 7 ((MPLUS SIMP) $X $Y))

Ôóíêöèè è ïåðåìåííûå äëÿ ðàáîòû ñî ñïèñêàìè
===========================================

 -- Ôóíêöèÿ: append (LIST_1, ..., LIST_N)
     Âîçâðàùàåò íîâûé ñïèñîê ýëåìåíòîâ LIST_1 ñ ïîñëåäóþùèìè ýëåìåíòàìè LIST_2 è ò.ä. append ðàáîòàåò è ñ âûðàæåíèÿìè îáùåãî âèäà, íàïðèìåð, append (f(a,b), f(c,d,e)); äàåò f(a,b,c,d,e).

     Ñì. example(append); äëÿ ïðèìåðà.

     Ñïèñêè Âûðàæåíèÿ

 -- Ôóíêöèÿ: assoc (KEY, LIST, DEFAULT)
 -- Ôóíêöèÿ: assoc (KEY, LIST)
     Ýòà ôóíêöèÿ èùåò êëþ÷ KEY â ïðàâûõ ÷àñòÿõ ñïèñêà LIST, èìåþùåãî ôîðìó [x,y,z,...], ãäå êàæäûé ýëåìåíò LIST åñòü âûðàæåíèå ñ áèíàðíûì îïåðàòîðîì è äâóìÿ îïåðàíäàìè.  Íàïðèìåð, x=1, 2^3, [a,b] è ò.ä. Êëþ÷ KEY ñðàâíèâàåòñÿ ñ ïåðâûì îïåðàíäîì. Åñëè êëþ÷ key íàéäåí, òî assoc âîçâðàùàåò âòîðîé îïåðàíä. Â ïðîòèâíîì ñëó÷àå âîçâðàùàåòñÿ çíà÷åíèå DEFAULT.  Ïàðàìåòð DEFAULT íå îáÿçàòåëåí è ïî óìîë÷àíèþ ðàâåí false.

     Ñïèñêè Âûðàæåíèÿ

 -- Ôóíêöèÿ: atom (EXPR)
     Âîçâðàùàåò true åñëè EXPR ÿâëÿåòñÿ àòîìàðíûì (ò.å. ÷èñëî, èìÿ èëè ñòðîêà) è false â ïðîòèâíîì ñëó÷àå.  Ò.å. atom(5) ðàâíî true, òîãäà êàê atom(a[1]) è atom(sin(x)) ðàâíû false (ïðåäïîëàãàÿ, ÷òî a[1] è x íå èìåþò çíà÷åíèÿ).

     Ôóíêöèè ïðåäèêàòû Âûðàæåíèÿ

 -- Ôóíêöèÿ: cons (EXPR, LIST)
     Âîçâðàùàåò íîâûé ñïèñîê, ñîñòàâëåííûé èç ïåðâîãî ýëåìåíòà ðàâíîãî EXPR ñ ïîñëåäóþùèìè ýëåìåíòàìè LIST.  Ôóíêöèÿ cons ðàáîòàåò è ñ ïðîèçâîëüíûìè âûðàæåíèÿìè, íàïðèìåð, cons(x, f(a,b,c));  ->  f(x,a,b,c).

     Ñïèñêè Âûðàæåíèÿ

 -- Ôóíêöèÿ: copylist (LIST)
     Âîçâðàùàåò êîïèþ ñïèñêà LIST.

     Ñïèñêè

 -- Ôóíêöèÿ: create_list (FORM, X_1, LIST_1, ..., X_N, LIST_N)

     Ñîçäàåò ñïèñîê, âû÷èñëÿÿ âûðàæåíèå FORM ñ X_1 ïîñëåäîâàòåëüíî ðàâíûì ýëåìåíòàì LIST_1, X_2 ïîñëåäîâàòåëüíî ðàâíûì ýëåìåíòàì LIST_2 è ò.ä. Îáùåå ÷èñëî ýëåìåíòîâ â ðåçóëüòèðóþùåì ñïèñêå ðàâíî ïðîèçâåäåíèþ ÷èñëà ýëåìåíòîâ âî âñåõ ñïèñêàõ. Êàæäàÿ ïåðåìåííàÿ X_I äîëæíà áûòü ñèìâîëîì.  Ïåðåìåííûå íå âû÷èñëÿþòñÿ. Ñïèñêè âû÷èñëÿþòñÿ îäíàæäû â íà÷àëå èòåðàöèè.

          (%i1) create_list(x^i,i,[1,3,7]);
                           3   7
          (%o1)       [x, x , x ]

     Äâîéíàÿ èòåðàöèÿ:

          (%i1) create_list([i,j],i,[a,b],j,[e,f,h]);
          (%o1) [[a, e], [a, f], [a, h], [b, e], [b, f], [b, h]]

     Âìåñòî ñïèñêà LIST_I ìîæíî èñïîëüçîâàòü äâà ïàðàìåòðà, êîòîðûå äîëæíû èìåòü ÷èñëîâûå çíà÷åíèÿ.  Îíè áóäóò ðàññìàòðèâàòüñÿ êàê íèæíÿÿ è âåðõíÿÿ ãðàíèöû èòåðàöèè (âêëþ÷èòåëüíî).

          (%i1) create_list([i,j],i,[1,2,3],j,1,i);
          (%o1) [[1, 1], [2, 1], [2, 2], [3, 1], [3, 2], [3, 3]]

     Îòìåòèì, ÷òî ïðåäåëû äëÿ ïåðåìåííîé j ìîãóò çàâèñåòü îò i.

     Ñïèñêè

 -- Ôóíêöèÿ: delete (EXPR_1, EXPR_2)
 -- Ôóíêöèÿ: delete (EXPR_1, EXPR_2, N)
     Óäàëÿåò âñå ýëåìåíòû, ðàâíûå EXPR_1, èç EXPR_2.  Ïðè ýòîì EXPR_1 ìîæåò áûòü ñëàãàåìûì EXPR_2 (åñëè ýòî ñóììà) èëè ìíîæèòåëåì EXPR_2 (åñëè ýòî ïðîèçâåäåíèå).

          (%i1) delete(sin(x), x+sin(x)+y);
          (%o1)                         y + x

     Âûçîâ delete(EXPR_1, EXPR_2, N) óäàëÿåò ïåðâûå N ñëó÷àåâ EXPR_1 èç EXPR_2.  Åñëè ÷èñëî âêëþ÷åíèé EXPR_1 â EXPR_2 ìåíüøå N, òî áóäóò óäàëåíû âñå.

          (%i1) delete(a, f(a,b,c,d,a));
          (%o1)                      f(b, c, d)
          (%i2) delete(a, f(a,b,a,c,d,a), 2);
          (%o2)                     f(b, c, d, a)

     Ñïèñêè Âûðàæåíèÿ

 -- Ôóíêöèÿ: eighth (EXPR)
     Âîçâðàùàåò âîñüìîé ýëåìåíò âûðàæåíèÿ èëè ñïèñêà EXPR. Ñì. first ïî ïîâîäó ïîäðîáíîñòåé.

     Ñïèñêè Âûðàæåíèÿ

 -- Ôóíêöèÿ: endcons (EXPR, LIST)
     Âîçâðàùàåò íîâûé ñïèñîê, ñîñòîÿùèé èç ýëåìåíòîâ list ñ ïîñëåäóþùèì EXPR. Ôóíêöèÿ endcons ðàáîòàåò è ñ îáùèìè âûðàæåíèÿìè, íàïðèìåð, endcons(x, f(a,b,c));  ->  f(a,b,c,x).

     Ñïèñêè Âûðàæåíèÿ

 -- Ôóíêöèÿ: fifth (EXPR)
     Âîçâðàùàåò ïÿòûé ýëåìåíò âûðàæåíèÿ èëè ñïèñêà EXPR. Ñì. first ïî ïîâîäó ïîäðîáíîñòåé.

     Ñïèñêè Âûðàæåíèÿ

 -- Ôóíêöèÿ: first (EXPR)
     Âîçâðàùàåò ïåðâûé ýëåìåíò EXPR, ÷òî ìîæåò áûòü ïåðâûì ýëåìåíòîì ñïèñêà, ïåðâîé ñòðîêîé â ìàòðèöå, ïåðâûì ñëàãàåìûì ñóììû è ò.ä. Çàìåòèì, ÷òî first è äðóãèå ïîäîáíûå ôóíêöèè, òàêèå êàê rest è last, ðàáîòàþò ñ âíåøíåé (ïå÷àòíîé) ôîðìîé âûðàæåíèÿ EXPR, à íå ñ òåì, êàê ýòî âûðàæåíèå áûëî ââåäåíî. Åñëè çíà÷åíèå inflag ðàâíî true, òî ýòè ôóíêöèè áóäóò ðàáîòàòü ñ âíóòðåííèì ïðåäñòàâëåíèåì âûðàæåíèÿ EXPR.  Îòìåòèì, ÷òî óïðîùàòåëü èçìåíÿåò ïîðÿäîê ÷ëåíîâ â âûðàæåíèÿõ.  Òàê, first(x+y) áóäåò ðàâíî x, åñëè inflag ðàâíà true, è y, åñëè inflag ðàâíà false (first(y+x) äàñò îäèíàêîâûé ðåçóëüòàò â îáîèõ ñëó÷àÿõ).  Ôóíêöèè second .. tenth äàþò ñî âòîðîãî ïî äåñÿòûé ýëåìåíò âûðàæåíèÿ.

     Ñïèñêè Âûðàæåíèÿ

 -- Ôóíêöèÿ: fourth (EXPR)
     Âîçâðàùàåò ÷åòâåðòûé ýëåìåíò âûðàæåíèÿ èëè ñïèñêà EXPR. Ñì. first ïî ïîâîäó ïîäðîáíîñòåé.

     Ñïèñêè Âûðàæåíèÿ

 -- Ôóíêöèÿ: get (A, I)
     Âîçâðàùàåò îïðåäåëåííîå ïîëüçîâàòåëåì ñâîéñòâî àòîìà A, îáîçíà÷åííîå I, èëè false, åñëè àòîì íå èìååò ñâîéñòâà I.

     Ôóíêöèÿ get âû÷èñëÿåò ñâîè àðãóìåíòû.

          (%i1) put (%e, 'transcendental, 'type);
          (%o1)                    transcendental
          (%i2) put (%pi, 'transcendental, 'type)$
          (%i3) put (%i, 'algebraic, 'type)$
          (%i4) typeof (expr) := block ([q],
                  if numberp (expr)
                  then return ('algebraic),
                  if not atom (expr)
                  then return (maplist ('typeof, expr)),
                  q: get (expr, 'type),
                  if q=false
                  then errcatch (error(expr,"is not numeric.")) else q)$
          (%i5) typeof (2*%e + x*%pi);
          x is not numeric.
          (%o5)  [[transcendental, []], [algebraic, transcendental]]
          (%i6) typeof (2*%e + %pi);
          (%o6)     [transcendental, [algebraic, transcendental]]

     Ôàêòû è âûâîäû

 -- Ôóíêöèÿ: join (L, M)
     Âîçâðàùàåò íîâûé ñïèñîê, ñîñòîÿùèé èç ÷åðåäóþùèõñÿ ýëåìåíòîâ ñïèñêîâ L è M. Ðåçóëüòàò áóäåò èìåòü âèä [L[1], M[1], L[2], M[2], ...]. Ñïèñêè L è M ìîãóò èìåòü ýëåìåíòû ëþáîãî òèïà.

     Åñëè ñïèñêè èìåþò ðàçíóþ äëèíó, òî join îòáðîñèò ïîñëåäíèå ýëåìåíòû áîëåå äëèííîãî ñïèñêà.

     Ñèòóàöèÿ, êîãäà ëèáî L, ëèáî M íå ÿâëÿåòñÿ ñïèñêîì, ñ÷èòàåòñÿ îøèáêîé.

     Ïðèìåðû:

          (%i1) L1: [a, sin(b), c!, d - 1];
          (%o1)                [a, sin(b), c!, d - 1]
          (%i2) join (L1, [1, 2, 3, 4]);
          (%o2)          [a, 1, sin(b), 2, c!, 3, d - 1, 4]
          (%i3) join (L1, [aa, bb, cc, dd, ee, ff]);
          (%o3)        [a, aa, sin(b), bb, c!, cc, d - 1, dd]

     Ñïèñêè

 -- Ôóíêöèÿ: last (EXPR)
     Âîçâðàùàåò ïîñëåäíèé ýëåìåíò EXPR (ýëåìåíò, ñëàãàåìîå, ìíîæèòåëü, ñòðîêó è ò.ï.).

     Ñïèñêè Âûðàæåíèÿ

 -- Ôóíêöèÿ: length (EXPR)
     Ïî óìîë÷àíèþ âîçâðàùàåò ÷èñëî ÷àñòåé âíåøíåé (ïå÷àòíîé) ôîðìû âûðàæåíèÿ EXPR. Äëÿ ñïèñêà -- ýòî ÷èñëî ýëåìåíòîâ, äëÿ ìàòðèöû -- ÷èñëî ñòðîê, äëÿ ñóììû -- ÷èñëî ñëàãàåìûõ (ñì. dispform).

     Ðåçóëüòàò length çàâèñèò îò ïåðåêëþ÷àòåëÿ inflag. Íàïðèìåð, length(a/(b*c)); äàåò 2, åñëè inflag ðàâåí false (ïðåäïîëàãàåòñÿ, ÷òî exptdispflag ðàâíà true), è äàåò 3, åñëè inflag ðàâåí true, ò.ê. âíóòðåííèå ïðåäñòàâëåíèå åñòü a*b^-1*c^-1.

     Ñïèñêè Âûðàæåíèÿ

 -- Óïðàâëÿþùàÿ ïåðåìåííàÿ: listarith
     Çíà÷åíèå ïî óìîë÷àíèþ: true Åñëè ðàâíà false, òî âñå àðèôìåòè÷åñêèå îïåðàöèè ñî ñïèñêàìè íå ðàáîòàþò. Åñëè ðàâíà true, òî âñå îïåðàöèè ñïèñîê-ìàòðèöà âûçûâàþò ïðåîáðàçîâàíèå ñïèñêîâ â ìàòðèöû è äàþò ðåçóëüòàò ìàòðè÷íîãî òèïà.  Îäíàêî, îïåðàöèè ñïèñîê-ñïèñîê ïðîäîëæàþò äàâàòü ñïèñêè.

     Ñïèñêè Ãëîáàëüíûå ôëàãè

 -- Ôóíêöèÿ: listp (EXPR)
     Âîçâðàùàåò true, åñëè EXPR ÿâëÿåòñÿ ñïèñêîì è false â ïðîòèâíîì ñëó÷àå.

     Ñïèñêè Ôóíêöèè ïðåäèêàòû

 -- Ôóíêöèÿ: makelist (EXPR, I, I_0, I_1)
 -- Ôóíêöèÿ: makelist (EXPR, X, LIST)
     Ñîçäàåò è âîçâðàùàåò ñïèñîê, êàæäûé ýëåìåíò êîòîðîãî ïîñòðîåí èç âûðàæåíèÿ EXPR.

     Âûçîâ makelist (EXPR, I, I_0, I_1) âîçâðàùàåò ñïèñîê, ñ j-ì ýëåìåíòîì ðàâíûì ev (EXPR, I=j) äëÿ j, ïðîáåãàþùåãî çíà÷åíèÿ îò I_0 äî I_1.

     Âûçîâ makelist (EXPR, X, LIST) âîçâðàùàåò ñïèñîê, ñ j-ì ýëåìåíòîì ðàâíûì ev (EXPR, X=LIST[j]) äëÿ j, ïðîáåãàþùåãî çíà÷åíèÿ îò 1 äî length (LIST).

     Ïðèìåðû:

          (%i1) makelist(concat(x,i),i,1,6);
          (%o1)               [x1, x2, x3, x4, x5, x6]
          (%i2) makelist(x=y,y,[a,b,c]);
          (%o2)                 [x = a, x = b, x = c]

     Ñïèñêè

 -- Ôóíêöèÿ: member (EXPR_1, EXPR_2)

     Âîçâðàùàåò true åñëè is(EXPR_1 = A), äëÿ íåêîòîðîãî ýëåìåíòà A èç args(EXPR_2), è false â ïðîòèâíîì ñëó÷àå.

     Îáû÷íî, expr_2 ÿâëÿåòñÿ ñïèñêîì. Â ýòîì ñëó÷àå args(EXPR_2) = EXPR_2 è is(EXPR_1 = A) äëÿ íåêîòîðîãî ýëåìåíòà A èç expr_2.

     Ôóíêöèÿ member íå àíàëèçèðóåò ñîñòàâíûå ÷àñòè àðãóìåíòîâ expr_2, è ìîæåò âîçâðàòèòü false äàæå åñëè expr_1 ÿâëÿåòñÿ ÷àñòüþ êàêîãî-ëèáî èç àðãóìåíòîâ expr_2.

     Ñì. òàêæå elementp.

     Ïðèìåðû:

          (%i1) member (8, [8, 8.0, 8b0]);
          (%o1)                         true
          (%i2) member (8, [8.0, 8b0]);
          (%o2)                         false
          (%i3) member (b, [a, b, c]);
          (%o3)                         true
          (%i4) member (b, [[a, b], [b, c]]);
          (%o4)                         false
          (%i5) member ([b, c], [[a, b], [b, c]]);
          (%o5)                         true
          (%i6) F (1, 1/2, 1/4, 1/8);
                                         1  1  1
          (%o6)                     F(1, -, -, -)
                                         2  4  8
          (%i7) member (1/8, %);
          (%o7)                         true
          (%i8) member ("ab", ["aa", "ab", sin(1), a + b]);
          (%o8)                         true

     Ñïèñêè Âûðàæåíèÿ Ôóíêöèè ïðåäèêàòû

 -- Ôóíêöèÿ: ninth (EXPR)
     Âîçâðàùàåò äåâÿòûé ýëåìåíò âûðàæåíèÿ èëè ñïèñêà EXPR. Ñì. first ïî ïîâîäó ïîäðîáíîñòåé.

     Ñïèñêè Âûðàæåíèÿ

 -- Ôóíêöèÿ: unique (L)

     Âîçâðàùàåò óíèêàëüíûå ýëåìåíòû ñïèñêà L.

     Åñëè âñå ýëåìåíòû ñïèñêà L óíèêàëüíû, òî unique âîçâðàùàåò êîïèþ âåðõíåãî óðîâíÿ ñïèñêà L, à íå ñàì ñïèñîê L.

     Åñëè L íå ÿâëÿåòñÿ ñïèñêîì, òî unique âîçâðàùàåò L.

     Ïðèìåð:

          (%i1) unique ([1, %pi, a + b, 2, 1, %e, %pi, a + b, [1]]);
          (%o1)              [1, 2, %e, %pi, [1], b + a]

     Ñïèñêè Âûðàæåíèÿ

 -- Ôóíêöèÿ: rest (EXPR, N)
 -- Ôóíêöèÿ: rest (EXPR)
     Âîçâðàùàåò EXPR áåç ïåðâûõ N ýëåìåíòîâ, åñëè N ïîëîæèòåëüíî, èëè áåç ïîñëåäíèõ - N ýëåìåíòîâ, åñëè N îòðèöàòåëüíî. Åñëè N ðàâåí 1, òî îí ìîæåò áûòü îïóùåí. Âûðàæåíèå EXPR ìîæåò áûòü ñïèñêîì, ìàòðèöåé èëè âûðàæåíèåì.

     Ñïèñêè Âûðàæåíèÿ

 -- Ôóíêöèÿ: reverse (LIST)
     Èçìåíÿåò ïîðÿäîê ÷ëåíîâ LIST (íî íå ñàìè ÷ëåíû) íà îáðàòíûé. Ôóíêöèÿ reverse òàêæå ðàáîòàåò ñ âûðàæåíèÿìè îáùåãî âèäà, íàïðèìåð,  reverse(a=b); äàåò b=a.

     Ñïèñêè Âûðàæåíèÿ

 -- Ôóíêöèÿ: second (EXPR)
     Âîçâðàùàåò âòîðîé ýëåìåíò âûðàæåíèÿ èëè ñïèñêà EXPR. Ñì. first ïî ïîâîäó ïîäðîáíîñòåé.

     Ñïèñêè Âûðàæåíèÿ

 -- Ôóíêöèÿ: seventh (EXPR)
     Âîçâðàùàåò ñåäüìîé ýëåìåíò âûðàæåíèÿ èëè ñïèñêà EXPR. Ñì. first ïî ïîâîäó ïîäðîáíîñòåé.

     Ñïèñêè Âûðàæåíèÿ

 -- Ôóíêöèÿ: sixth (EXPR)
     Âîçâðàùàåò øåñòîé ýëåìåíò âûðàæåíèÿ èëè ñïèñêà EXPR. Ñì. first ïî ïîâîäó ïîäðîáíîñòåé.

     Ñïèñêè Âûðàæåíèÿ

 -- Ôóíêöèÿ: sublist_indices (L, P)

     Âîçâðàùàåò ñïèñîê èíäåêñîâ ýëåìåíòîâ x ñïèñêà L, äëÿ êîòîðûõ ïðåäèêàò maybe(P(x)) âîçâðàùàåò true, çà èñêëþ÷åíèåì ýëåìåíòîâ unknown è false. Ïàðàìåòð P ìîæåò áûòü èìåíåì ôóíêöèè èëè ëÿìáäà-âûðàæåíèåì. Ïàðàìåòð L äîëæåí áûòü ñïèñêîì.

     Ïðèìåðû:

          (%i1) sublist_indices ('[a, b, b, c, 1, 2, b, 3, b],
                                 lambda ([x], x='b));
          (%o1)                     [2, 3, 7, 9]
          (%i2) sublist_indices ('[a, b, b, c, 1, 2, b, 3, b], symbolp);
          (%o2)                  [1, 2, 3, 4, 7, 9]
          (%i3) sublist_indices ([1 > 0, 1 < 0, 2 < 1, 2 > 1, 2 > 0],
                                 identity);
          (%o3)                       [1, 4, 5]
          (%i4) assume (x < -1);
          (%o4)                       [x < - 1]
          (%i5) map (maybe, [x > 0, x < 0, x < -2]);
          (%o5)                [false, true, unknown]
          (%i6) sublist_indices ([x > 0, x < 0, x < -2], identity);
          (%o6)                          [2]

     Ñïèñêè

 -- Ôóíêöèÿ: tenth (EXPR)
     Âîçâðàùàåò äåñÿòûé ýëåìåíò âûðàæåíèÿ èëè ñïèñêà EXPR. Ñì. first ïî ïîâîäó ïîäðîáíîñòåé.

     Ñïèñêè Âûðàæåíèÿ

 -- Ôóíêöèÿ: third (EXPR)
     Âîçâðàùàåò òðåòèé ýëåìåíò âûðàæåíèÿ èëè ñïèñêà EXPR. Ñì. first ïî ïîâîäó ïîäðîáíîñòåé.

     Ñïèñêè Âûðàæåíèÿ