invbcomp.red 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512
  1. module invbcomp;
  2. %----------------------------------------------------------------------
  3. symbolic proceDURE C_ZERO(); nil$ % REPRESENTATION OF ZERO
  4. %----------------------------------------------------------------------
  5. symbolic procedure CNEG(C); % - C
  6. negf c$
  7. %----------------------------------------------------------------------
  8. symbolic procedure CSUM(C1,C2); % C1 + C2
  9. addf(c1,c2);
  10. %----------------------------------------------------------------------
  11. symbolic procedure CPROD(C1,C2); % C1 * C2
  12. multf(c1,c2);
  13. %----------------------------------------------------------------------
  14. symbolic procedure CDIV(C1,C2); % C1/C2
  15. numr resimp(c1 . c2);
  16. %----------------------------------------------------------------------
  17. symbolic procedure trass(id,value); % tracing of assignments
  18. << terpri(); write id; write " = "; write value; terpri(); >>$
  19. %----------------------------------------------------------------------
  20. symbolic procedure leftzeros(u); % u : list
  21. if null u or car u neq 0 then 0 else 1 #+ leftzeros cdr u$
  22. %----------------------------------------------------------------------
  23. procedure class(jet);
  24. if ord jet = 0 then 0 else 1
  25. #+ leftzeros reverse (if ordering = 'lex then jet else cdr jet);
  26. %----------------------------------------------------------------------
  27. symbolic procedure ord(jet);
  28. if ordering = 'lex then eval('plus . jet) else car jet$
  29. %----------------------------------------------------------------------
  30. symbolic procedure ljet(p); caar p$
  31. %----------------------------------------------------------------------
  32. symbolic procedure sub01(v,u);
  33. %%% replace each x in u by < if x=v then 1 else 0 >
  34. if u then (if (car u = v) then 1 else 0) . sub01(v,cdr u);
  35. %----------------------------------------------------------------------
  36. symbolic procedure !*v2j(v);
  37. if ordering = 'lex then sub01(v,varlist) else (1 . sub01(v,varlist) );
  38. %----------------------------------------------------------------------
  39. symbolic procedure nonmult(cl); % --> list of vjets
  40. reverse cdr member(nth(reverse vjets,cl),reverse vjets);
  41. %----------------------------------------------------------------------
  42. symbolic procedure insert(x,gg);
  43. begin scalar gg1;
  44. while gg and dless(cdr x,cdar gg) do
  45. << gg1 := car gg . gg1; gg := cdr gg >>;
  46. return append(reversip gg1, x . gg);
  47. end;
  48. %----------------------------------------------------------------------
  49. symbolic procedure addnew(f,ind,ff);
  50. %%% adds element f to set (with index ind), returns modified ff
  51. << putv(gv,ind,f); putv(bv,ind,t);
  52. if null f then ff
  53. else ff := insert(ind . ljet f, ff)
  54. >>$
  55. %----------------------------------------------------------------------
  56. symbolic procedure dlesslex(D1,D2);
  57. %%%% RETURNS T IF D1 < D2 (lex), NIL OTHERWISE
  58. IF NULL D1 THEN NIL ELSE
  59. IF CAR D1 #> CAR D2 THEN NIL ELSE
  60. IF CAR D1 #< CAR D2 THEN T ELSE dlesslex(CDR D1,CDR D2);
  61. %----------------------------------------------------------------------
  62. symbolic procedure dless(d1,d2); % --> T if d1 < d2 , NIL otherwise
  63. if ordering = 'lex then dlesslex(d1,d2) else
  64. if car d1 #< car d2 then t else if car d1 #> car d2 then nil
  65. else if ordering = 'glex then dlesslex(cdr d1,cdr d2)
  66. else if ordering = 'grev then dlesslex(reverse cdr d2, reverse cdr d1);
  67. %-----------------------------------------------------------------------
  68. symbolic procedure DDMULT(D1,D2);
  69. IF NULL D1 THEN NIL ELSE (CAR D1 #+ CAR D2) . DDMULT(CDR D1,CDR D2);
  70. %-----------------------------------------------------------------------
  71. symbolic procedure DQUOT(D2,D1);
  72. %%%% RETURNS D2-D1 IF D1 DIVIDES D2, NIL OTHERWISE
  73. BEGIN SCALAR D3; INTEGER N;
  74. L1:N:=CAR(D2)-CAR(D1);
  75. IF N #< 0 THEN RETURN NIL;
  76. D3:=N . D3;
  77. D1:=CDR D1; D2:=CDR D2;
  78. IF D1 THEN GOTO L1;
  79. RETURN REVERSIP D3;
  80. end;
  81. %-----------------------------------------------------------------------
  82. symbolic procedure PCMULT(P,C); % P*C (C IS NOT ZERO)
  83. FOR EACH X IN P COLLECT CAR X.CPROD(C,CDR X);
  84. %-----------------------------------------------------------------------
  85. symbolic procedure pcdiv(p,c); % P/C (division in ring)
  86. for each x in p collect car x . cdiv(cdr x,c);
  87. %-----------------------------------------------------------------------
  88. symbolic procedure PDMULT(P,D); % P*< D >
  89. FOR EACH X IN P COLLECT
  90. (FOR EACH Y IN PAIR(CAR X,D) COLLECT CAR(Y)#+CDR(Y)).CDR X$
  91. %-----------------------------------------------------------------------
  92. symbolic procedure PSUM(P1,P2); % P1 + P2
  93. BEGIN SCALAR T1,T2,D2,C3,P3,SUM,RET;
  94. IF NULL P1 THEN SUM:=P2 ELSE
  95. IF NULL P2 THEN SUM:=P1 ELSE
  96. WHILE P2 AND NOT RET DO
  97. << T2:=CAR P2; D2:=CAR T2;
  98. WHILE P1 AND DLESS(D2,CAAR P1) DO
  99. << P3:=CAR(P1).P3; P1:=CDR P1 >>;
  100. IF NULL P1 THEN
  101. << SUM:=APPEND(REVERSE P3,P2); RET:=T >> ELSE
  102. << T1:=CAR P1;
  103. IF D2=CAR T1 THEN %%%% NOW T1<=T2
  104. << C3:=CSUM(CDR T1,CDR T2); %%%% LIKE TERM
  105. IF C3 neq C_ZERO() THEN P3:=(D2.C3).P3;
  106. P1:=CDR P1;
  107. T1:=IF P1 THEN CAR P1; %%%% NEW T1
  108. >>
  109. ELSE P3:=T2.P3; %%%% OLD T1
  110. P2:=CDR P2; %%%% NEW T2
  111. IF NULL P2 THEN SUM:= APPEND(REVERSE P3,P1)
  112. >> >>;
  113. RETURN SUM
  114. end;
  115. %-----------------------------------------------------------------------
  116. symbolic procedure PNEG(P); % - P
  117. FOR EACH X IN P COLLECT CAR(X).CNEG(CDR(X));
  118. %-----------------------------------------------------------------------
  119. symbolic procedure PDIF(P1,P2); % P1 - P2
  120. PSUM(P1,PNEG P2);
  121. %-----------------------------------------------------------------------
  122. symbolic procedure DD(D1,D2); % uses fluid VJETS
  123. begin scalar dq,lz;
  124. dq:=dquot(d2,d1);
  125. if not dq then return if dless(d1,d2) then 1 % D1 < D2
  126. else 0; % D1 > D2
  127. if ordering neq 'lex then dq:=cdr dq;
  128. lz := leftzeros dq;
  129. return
  130. if not nc and not(lz #< length varlist #- class d1)
  131. then 3 % D1 divides D2 (mult.)
  132. else if nc and not(lz #< length varlist #- nc)
  133. then 4 % D1 divides D2 in 1:nc classes and coincides in others
  134. else 2; % D1 divides D2 (usual)
  135. end;
  136. %-----------------------------------------------------------------------
  137. symbolic procedure dlcm(d1,d2);
  138. if ordering='lex then for each x in pair(d1,d2) collect max(car x,cdr x)
  139. else addgt( for each x in pair(cdr d1,cdr d2) collect max(car x,cdr x));
  140. %-----------------------------------------------------------------------
  141. symbolic procedure NF(H,GG,sw);
  142. %%%% H = NORMALIZED POLYNOMIAL
  143. %%%% GG = LIST OF KEYED LPP'S OF GG-SET
  144. %%%% RETURNS NORMAL FORM OF H WITH RESPECT TO GG-SET
  145. %%%% ===============================================
  146. IF NULL GG THEN H ELSE
  147. BEGIN SCALAR F,LPF,g,c,cf,cg,NF,G1,G2,U,nr; nr:=0;
  148. F:=H; G1:=GG;
  149. NEXTLPF: IF NULL F THEN goto EXIT;
  150. LPF:=caar F;
  151. % diminish G1 so that LPF >= G1 (and might be reduced !)
  152. % ------------------------------------------------------
  153. WHILE NOT NULL G1 AND DLESS(LPF,CDAR G1) DO G1:=CDR G1;
  154. IF NULL G1 THEN goto EXIT;
  155. G2:=G1; % NOW LPF >= G2
  156. % reduction of LPF
  157. % ----------------
  158. WHILE G2 AND DD(CDAR G2,LPF) #< sw + 2 DO G2:=CDR G2;
  159. IF NULL G2 THEN % LPF NOT REDUCED
  160. ( if redtails then << NF:=(LPF.CDAR F).NF; F:=CDR F >>
  161. else goto EXIT )
  162. ELSE % REDUCTION OF LPF
  163. << G:=getv(gv,caar g2);
  164. C:=gcdf!*(cdar F, cdar G);
  165. cf:=cdiv(cdar f,c); cg:=cdiv(cdar g,c);
  166. f:=pcmult(f,cg); nf:=pcmult(nf,cg); g:=pcmult(g,cf);
  167. U:=PDMULT(CDR G, DQUOT(LPF,CDAR G2));
  168. if tred then
  169. << terpri();
  170. write "r e d u c t i o n : ",lpf,"/",cdar g2;
  171. terpri();
  172. >>;
  173. if stars then write "*";
  174. nr := nr #+ 1;
  175. F:=PDIF(CDR F,U);
  176. >>;
  177. GOTO NEXTLPF;
  178. EXIT:
  179. reductions := reductions #+ nr;
  180. nforms := nforms #+ 1;
  181. u:= gcdout append(reversip nf,f);
  182. if null u then zeros := zeros #+ 1;
  183. return u;
  184. end;
  185. %-----------------------------------------------------------------------
  186. symbolic procedure gcdout(p);
  187. % cancel coeffs of P by their common factor.
  188. if !*modular then p else
  189. if null p then nil else if ord ljet p = 0 then p else
  190. begin scalar c,p1;
  191. p1:=p; c:=cdar p1;
  192. while p1 and c neq 1 do << c:=gcdf!*(c,cdar p1); p1:=cdr p1 >>;
  193. return if c = 1 then p else pcdiv(p,c);
  194. end;
  195. %-----------------------------------------------------------------------
  196. expr PROCEDURE NEWBASIS(gg,sw)$
  197. %%%% SIDE EFFECT: CHANGES CDR'S OF GV(K);
  198. BEGIN SCALAR G1,G2;
  199. G1:=reverse GG;
  200. WHILE G1 DO
  201. << PUTV(GV,caar g1,NF(GETV(GV,caar g1),G2,sw));
  202. g2:=(car g1).g2; g1:=cdr g1;
  203. >>;
  204. END$
  205. %-----------------------------------------------------------------------
  206. symbolic procedure !*f2di(f,varlist);
  207. %%% f: st.f., varlist: kernel list --> f in distributive form
  208. if null f then nil else
  209. if domainp f then
  210. ((addgt for each v in varlist collect 0).(f)).nil else
  211. psum(if member(mvar f,varlist) then
  212. pdmult(!*f2di(lc f,varlist),
  213. addgt for each v in varlist collect
  214. if v = mvar f then ldeg f else 0
  215. )
  216. else pcmult(!*f2di(lc f,varlist),((lpow f.1).nil)),
  217. !*f2di(red f,varlist) );
  218. %-----------------------------------------------------------------------
  219. symbolic procedure !*di2q0(p,varlist);
  220. if null p then nil . 1 else
  221. addsq( (lambda s,u;
  222. << for each x in u do
  223. if cdr x neq 0 then s:=multsq(s,((x.1).nil).1);
  224. s >>
  225. ) (cdar p, pair(varlist,
  226. if ordering='lex then ljet p else cdr ljet p)),
  227. !*di2q0(cdr p,varlist) );
  228. %----------------------------------------------------------------------
  229. symbolic procedure !*di2q(p,varlist);
  230. !*di2q0(for each x in p collect car x . (cdr x . 1), varlist);
  231. %----------------------------------------------------------------------
  232. symbolic procedure show(str,p); % p = poly in a special (dist.) form
  233. if null p then (algebraic write str," := 0")
  234. else algebraic write str," := ",
  235. lisp prepsq !*di2q(list car p, varlist)," + ",
  236. lisp prepsq !*di2q(cdr p, varlist);
  237. %----------------------------------------------------------------------
  238. LISP procedure ADDGT(U);
  239. if ordering = 'lex then u else eval('plus.u) . u$
  240. %-----------------------------------------------------------------------
  241. symbolic procedure printsys(str,gg);
  242. begin scalar i; i:=0;
  243. for each x in gg do
  244. << i:=i+1;
  245. algebraic write str,"(",lisp i,") := ",
  246. lisp prepsq !*di2q(list car getv(gv,car x), varlist)," + ",
  247. lisp prepsq !*di2q(cdr getv(gv,car x), varlist);
  248. >>;
  249. end;
  250. %-----------------------------------------------------------------------
  251. symbolic procedure answer(gg);
  252. << if title then algebraic write "% ",lisp title;
  253. trass("% ORDERING",varlist); printsys("G",reverse gg);
  254. >>$
  255. %-----------------------------------------------------------------------
  256. symbolic procedure wr(file,gg);
  257. << off nat,time; out file;
  258. write "algebraic$"; write "operator g$";
  259. answer(gg);
  260. write "end;"; shut file; on nat,time >>$
  261. %-----------------------------------------------------------------------
  262. symbolic procedure invtest!*();
  263. begin scalar g,c; c:=t;
  264. if !*trinvbase then terpri();
  265. for each x in gg do
  266. if c then
  267. << g:=getv(gv, car x);
  268. for each vj in nonmult(class ljet g) do
  269. if c and nf(pdmult(g,vj),gg,1) then
  270. << c:=nil;
  271. if !*trinvbase then prin2t "INV - t e s t f a i l e d"; >>;
  272. >>;
  273. if c and !*trinvbase then prin2t "I n v o l u t i v e b a s i s";
  274. return c;
  275. end;
  276. %-----------------------------------------------------------------------
  277. symbolic procedure redall(gg,ff,sw);
  278. % side effect : changes flag thirdway.
  279. begin scalar rr,f,f1,lj,k,new;
  280. rr := ff; thirdway:=shortway:=nil; new:=t;
  281. while rr do
  282. << f:=car reverse rr; rr:=delete(f,rr);
  283. k:=car f; f1:=getv(gv,k);
  284. if path then
  285. << % write k,": ";
  286. if new then write ljet f1," ==> "
  287. else write ljet f1," --> ";
  288. >>;
  289. f:=putv(gv,k,nf(f1,gg,sw));
  290. lj:=if f then ljet f else 0;
  291. if path then
  292. << write lj; terpri() >>;
  293. if null f then nil else
  294. if ord lj = 0 then conds := f . conds else
  295. << if ljet f neq ljet f1 then shortway:=t;
  296. if not new and f neq f1 then thirdway:=t;
  297. for each x in gg do if dd(lj,cdr x) >= sw + 2 then
  298. << gg:=delete(x,gg); rr:=insert(x,rr);
  299. putv(bv,car x,t); %
  300. >>;
  301. gg:=insert(k.lj,gg); new:=nil;
  302. >> >>;
  303. return gg;
  304. end;
  305. %-----------------------------------------------------------------------
  306. symbolic procedure remred(ff,sw); % removes redundant elements
  307. begin scalar gg,gg1,f,g,p;
  308. ff:=reverse ff;
  309. while ff do
  310. << f:=car ff; ff:=cdr ff;
  311. p:=t; gg1:=gg;
  312. while p and gg1 do
  313. << g:=car gg1; gg1:=cdr gg1;
  314. if dd(cdr g,cdr f) >= sw + 2 then p:=nil;
  315. >>;
  316. if p then gg := f . gg;
  317. >>;
  318. return gg;
  319. end;
  320. %-----------------------------------------------------------------------
  321. symbolic procedure invbase!*();
  322. begin scalar gg1,g,k,nm,f,thirdway,shortway,fin,p,p0,lb,r;
  323. if !*trinvbase then terpri();
  324. p:=maxord:=-1;
  325. if path then terpri();
  326. gg:=redall(nil,gg,1);
  327. newbasis(gg,1);
  328. lb:=0;
  329. for each x in gg do lb:=lb + ord cdr x;
  330. lb:=lb + length varlist - 1;
  331. l: gg1 := reverse gg;
  332. while gg1 and null getv(bv,caar gg1) do gg1 := cdr gg1;
  333. if gg1 then
  334. << if cadar gg1 = cadar gg then
  335. << p0:=p;
  336. p:=cadar gg1;
  337. if !*trinvbase and p > p0 then
  338. << terpri();
  339. write "---------- ORDER = ",cadar gg," ----------";
  340. terpri(); terpri();
  341. >>;
  342. if p > lb then
  343. << gg:=redall(nil,gg,0);
  344. newbasis(gg,0);
  345. invtempbasis := 'list .
  346. for each x in gg
  347. collect 'plus . for each m in getv(gv,car x)
  348. collect prepsq !*di2q(list m,varlist);
  349. rederr "Maximum degree bound exceeded.";
  350. >>;
  351. maxord:=max(maxord,cadar gg);
  352. if cadar gg < maxord then fin:=t;
  353. >>;
  354. if fin then goto m;
  355. k := caar gg1;
  356. g := getv(gv,k); putv(bv,k,nil);
  357. nm := nonmult(class ljet g);
  358. for each vj in nm do
  359. << ng := ng + 1;
  360. f := pdmult(g,vj); putv(gv,ng,f); putv(bv,ng,t);
  361. gg := redall(gg,list(ng.ljet f),1);
  362. if thirdway then newbasis(gg,1) else
  363. if shortway then for each y in gg do if car y neq ng then
  364. putv(gv,car y,nf(getv(gv,car y),list(ng.ljet getv(gv,ng)),1));
  365. >>;
  366. go to l;
  367. >>;
  368. m: stat(); if p <= lb then dim gg;
  369. end;
  370. %-----------------------------------------------------------------------
  371. symbolic procedure njets(n,q); % number of jets of n vars and order q
  372. combin(q,q+n-1);
  373. %----------------------------------------------------------------------
  374. symbolic procedure combin(m,n); % number of combinations of m from n
  375. if m>n then 0 else
  376. begin integer i1,i2; i1:=i2:=1;
  377. for i:=n-m+1:n do i1:=i1*i; for i:=1:m do i2:=i2*i;
  378. return i1/i2;
  379. end;
  380. %----------------------------------------------------------------------
  381. symbolic procedure dim(gg);
  382. if !*trinvbase then
  383. begin integer q,n,cl,s,y,dim,dp,mon;
  384. q:=cadar gg; n:=length varlist; dim:=0;
  385. for i:=1:n do putv(beta,i,0);
  386. for each x in gg do
  387. << cl:=class cdr x;
  388. for i:=cl step -1 until 1 do
  389. << y:=njets(cl-i+1,q-ord cdr x);
  390. putv(beta,i,getv(beta,i)+y);
  391. >> >>;
  392. terpri();
  393. for i:=1:n do
  394. << putv(alfa,i,combin(n-i,q+n-i)-getv(beta,i));
  395. if getv(alfa,i) neq 0 then dim := dim + 1;
  396. % write "a[",i,",",q,"]=",getv(alfa,i)," ";
  397. >>;
  398. terpri();
  399. terpri(); write "D i m e n s i o n = ",dim; terpri();
  400. if dim = 0 then nroots gg;
  401. end;
  402. %----------------------------------------------------------------------
  403. symbolic procedure nroots(gg);
  404. % number of roots of zero-dimensional Ideal.
  405. if gg then begin integer d;
  406. for each x in gg do d := d + car reverse x;
  407. terpri(); write "N u m b e r o f s o l u t i o n s = ",d;
  408. terpri();
  409. end;
  410. %----------------------------------------------------------------------
  411. symbolic procedure stat();
  412. if !*trinvbase then
  413. << terpri();
  414. write "reductions = ",reductions;
  415. write " zeros = ",zeros; write " maxord = ",maxord;
  416. write " order = ",cadar gg; write " length = ",length gg;
  417. >>$
  418. %----------------------------------------------------------------------
  419. symbolic procedure !*g2lex(p);
  420. % works correctly only when ORDERING= lex.
  421. %%% p: poly in graduate form ---> lexicographic form
  422. begin scalar p1;
  423. for each x in p do p1:=psum(p1,list(cdar x . cdr x));
  424. return p1;
  425. end;
  426. %----------------------------------------------------------------------
  427. symbolic procedure lexorder(lst);
  428. % works correctly only when ORDERING = lex.
  429. begin scalar lst1,lj;
  430. for each x in lst do
  431. << lj:=ljet putv(gv, car x, gcdout !*g2lex getv(gv,car x));
  432. lst1 := insert((car x).lj, lst1);
  433. >>;
  434. return lst1;
  435. end;
  436. %----------------------------------------------------------------------
  437. symbolic procedure gi(gg,i); % subsystem of GG of class = i
  438. begin scalar ff;
  439. for each x in gg do if class cdr x = i then ff := x . ff;
  440. return ff;
  441. end;
  442. %----------------------------------------------------------------------
  443. symbolic procedure monic(jet,cl); % for lexicoraphy only
  444. begin scalar u,n;
  445. jet:=reverse jet;
  446. n:=length varlist;
  447. for i:=1:n do if i neq cl then u:=nth(jet,i).u;
  448. return u = for each v in cdr varlist collect 0$
  449. end;
  450. %----------------------------------------------------------------------
  451. symbolic procedure monicmember(gg,cl);
  452. begin scalar p;
  453. l: if null gg then return nil;
  454. if monic(cdar gg,cl) then return t;
  455. gg:=cdr gg;
  456. go to l;
  457. end;
  458. %----------------------------------------------------------------------
  459. symbolic procedure montest(gg);
  460. begin scalar p,n;
  461. p:=t;
  462. n:=length varlist;
  463. for i:=1:n do if not monicmember(gg,i) then << p:=nil; i:=n+1 >>;
  464. return p;
  465. end;
  466. %----------------------------------------------------------------------
  467. symbolic procedure invlex!*(); % side effect: changes GG
  468. begin scalar gi,n,gginv,ordering;
  469. n:=length varlist; gginv:=mkvect n;
  470. ordering:='lex;
  471. for i:=1:n do putv(gginv,i,lexorder gi(gg,i));
  472. gg:=nil;
  473. for i:=1:n do
  474. << nc:=i;
  475. if path then << trass("i",i); terpri() >>;
  476. gg:=redall(gg,getv(gginv,i),2);
  477. if montest gg then i:=n+1;
  478. >>;
  479. nc:=nil;
  480. gg:=remred(gg,0);
  481. newbasis(gg,0);
  482. end;
  483. %----------------------------------------------------------------------
  484. symbolic procedure readsys(elist,vlist);
  485. begin;
  486. varlist:=cdr vlist;
  487. ng:=reductions:=nforms:=zeros:=0;
  488. alfa:=mkvect length varlist;
  489. beta:=mkvect length varlist;
  490. gg:=nil;
  491. for each x in cdr elist do
  492. gg:=addnew(gcdout !*f2di(numr simp x, varlist), ng:=ng+1, gg);
  493. vjets:=for each v in varlist collect !*v2j(v);
  494. end;
  495. %-----------------------------------------------------------------------
  496. lisp operator readsys$
  497. %-----------------------------------------------------------------------
  498. % D E F A U L T V A L U E S
  499. % ======================================================================
  500. ordering:='grev$ redtails:=t$
  501. tred := path := stars := nil$
  502. % ======================================================================
  503. endmodule;
  504. end;