%======================================================
%	Name:		dummy.red - dummy indecies package
%	Author:		A.Kryukov (kryukov@npi.msu.su)
%	Copyright:	(C), 1993, A.Kryukov
%	Version:	2.10
%	Release:	Nov. 17, 1993
%======================================================

module dummy1$

global '(!*basis)$

symbolic procedure cross(s1,s2)$ cross1(s1,s2,nil)$

symbolic procedure cross1(s1,s2,w)$
  if null s1 then w
  else if car s1 memq s2 
    then cross1(cdr s1,delete(car s1,s2),car s1 . w)
  else cross1(cdr s1,s2,w)$

symbolic procedure suppl(s1,s2)$ suppl1(s1,s2,nil)$
       
symbolic procedure suppl1(s1,s2,w)$
  if null s1 then w
  else if null(car s1 memq s2) then suppl1(cdr s1,s2,car s1 .w)
  else suppl1(cdr s1,delete(car s1,s2),w)$
       
symbolic procedure suppl2(s1,s2,w)$
  if null s1 then (s2 . w)
  else if null(car s1 memq s2) then suppl1(cdr s1,s2,car s1 .w)
  else suppl1(cdr s1,delete(car s1,s2),w)$
       
symbolic procedure tn_equal(tn1,tn2)$
  % tn1,tn2 - tname::=(id1 id2 ...)
  (car x and cdr x) where x=suppl2(tn1,tn2,nil)$
  
symbolic procedure th_equal(th1,th2)$
  % th1,th2 - theader::=(tname . ilist . dlist)
  if tn_equal(car th1,car th2) then il_equal(cadr th1,cadr th2)
  else nil$

symbolic procedure il_equal(il1,il2)$ 
  il_equal1(il2,suppl(il1,il2),nil)$

symbolic procedure il_equal1(il,dl,w)$
  % il,w - ilist
  % dl - dlist
  if null il then reversip w
  else if null get(car il,'dummy) then il_equal1(cdr il,dl,car il . w)
  else ((if null cdr x
           then (il_equal1(cdr il,cdr dl,car dl . w)
                where z=rplacd(rplaca(x,car get(car dl,'dummy)),t)
                )
         else (il_equal1(cdr il,delete(z,dl),z . w) 
              where z=dfind(car x,dl)
              )
        ) where x=get(car il,'dummy)
       )$

symbolic procedure dfind(di,dl)$
  if null dl then nil
  else if di eq get(car dl,'dummy) then car dl
  else dfind(di,cdr dl)$

symbolic procedure il_simp(il)$ il_simp1(il,nil)$

symbolic procedure il_simp1(il,w)$
  if null il then reversip w
  else if car il memq cdr il 
    then il_simp1(di_subst(car il . di_new car il,cdr il)
                 ,di_new car il . w
                 )
  else il_simp1(cdr il, car il . w)$

symbolic procedure di_subst(x,il)$ di_subst1(x,il,nil)$

symbolic procedure di_subst1(x,il,w)$
  if null il then reversip w
  else if car x eq car il then di_subst1(x,cdr il,cdr x . w)
  else di_subst1(x,cdr il,car il . w)$

global '(d_number)$
if null d_number then d_number:=0$

symbolic procedure di_new(x)$
  begin scalar z$
    d_number:=d_number + 1$ 
    z:=mkid('!_,d_number)$
    put(z,'dummy,list x)$
    return z$
  end$

global '(!*dummypri !*windexpri)$
switch dummypri,windexpri$

symbolic procedure di_restore il$ di_restore1(il,nil)$

symbolic procedure di_restore1(il,w)$
  if null il then reversip w
  else ((if null x 
           then ((if null y then di_restore1(cdr il,car il . w)
                  else di_restore1(cdr il
                         ,(if !*windexpri then mkid(car y,car il) 
                           else car y
                          ) . w
                                  )
                 ) where y = get(car il,'windex)
                )
         else di_restore1(cdr il
                ,(if !*dummypri then mkid(car x,car il) else car x) . w
                         )
        ) where x=get(car il,'dummy)
       )$

endmodule;

end;
