123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- module forder;
- % Author: Eberhard Schruefer;
- global '(keepl!* wedgemtch!* lftshft!* indxl!*);
- fluid '(kord!* subfg!*);
- symbolic procedure add2l(u,v);
- !*a2k u . if u memq v then delete(u,v) else v;
- symbolic procedure forder u;
- forder1 u;
- symbolic procedure forder1 u;
- (lambda x;
- while x do
- <<kord!* := add2l(car x,kord!*);
- if eqcar(car x,'wedge) then
- for each j in reverse cdar x do
- kord!* := add2l(j,kord!*);
- x:=cdr x>>)
- reverse u;
- symbolic procedure remforder u;
- for each j in u do kord!* := delete(j,kord!*);
- symbolic procedure isolate u;
- rerror(excalc,2,"Sorry, ISOLATE not supported in this version");
- % for each j in u do
- % <<lftshft!* := !*a2k car u . lftshft!*;
- % kord!* := !*a2k car u . kord!*>>;
- symbolic procedure remisolate u;
- for each j in u do lftshft!* := delete(j,lftshft!*);
- symbolic procedure worderp(x,y);
- if null atom x and flagp(car x,'indexvar) and
- null atom y and flagp(car y,'indexvar)
- then indexvarordp(x,y)
- else if atom x or (x memq kord!*) then
- if atom y or (y memq kord!*) then ordop(x,y)
- else (if x eq z then t
- else worderp(x,z)) where z = peel y
- else if atom y or (y memq kord!*)
- then (if z eq y then nil
- else worderp(z,y)) where z = peel x
- else worderp(peel x,peel y);
- symbolic procedure indexvarordp(u,v);
- if not(car u eq car v) or (u memq kord!*) or (v memq kord!*) then
- ordop(u,v)
- else ((if boundindp(x,indxl!*) then
- if boundindp(y,indxl!*) then indordlp(cdr u,cdr v)
- else t
- else if boundindp(y,indxl!*) then nil
- else ordop(u,v))
- where x = flatindxl cdr u, y = flatindxl cdr v);
- symbolic procedure indordlp(u,v);
- if null u then nil
- else if null v then t
- else if car u = car v then indordlp(cdr u, cdr v)
- else if atom car u then
- if atom car v then indordp(car u,car v)
- else t
- else if atom car v then nil
- else indordp(cadar u,cadar v);
- symbolic procedure peel u;
- if car u memq '(liedf innerprod) then caddr u
- else if car u eq 'quotient then
- if worderp(cadr u,caddr u) then cadr u
- else caddr u
- else cadr u;
- symbolic procedure indordp(u,v);
- begin scalar x;
- x := indxl!*;
- if null(u memq x) then return t;
- a: if null x then return orderp(u,v);
- if u eq car x then return t
- else if v eq car x then return nil;
- x := cdr x;
- go to a
- end;
- symbolic procedure indordn u;
- if null u then nil
- else if null cdr u then u
- else if null cddr u then indord2(car u,cadr u)
- else indordad(car u,indordn cdr u);
- symbolic procedure indord2(u,v);
- if indordp(u,v) then list(u,v) else list(v,u);
- symbolic procedure indordad(a,u);
- if null u then list a
- else if indordp(a,car u) then a . u
- else car u . indordad(a,cdr u);
- symbolic procedure keep u;
- while u do
- <<if not eqexpr car u then errpri2(car u,'hold)
- else begin scalar x,y,z;
- z := subfg!*;
- subfg!* := nil;
- x := !*a2k cadar u;
- y := !*a2k caddar u;
- forder1 list(x,y);
- keepl!* := (x . y) . keepl!*;
- flag(list x,'keep);
- put(x,'keepl,list y);
- subfg!* := z;
- putdep(x,y);
- if null exdfk y then flag(list x,'closed);
- if eqcar(y,'wedge) then
- <<wedgemtch!*:=(cdr y . x) . wedgemtch!*;
- for each j in cdr y do
- wedgemtch!* := (list(x,j) . nil) . wedgemtch!*>>
- else let2(y,x,nil,t)
- end;
- u := cdr u>>;
- symbolic procedure putdep(u,v);
- for each j in cdr v do
- if atom j then depend1(u,j,t) else putdep(u,j);
- endmodule;
- end;
|