============================================================================
  Copyright (C) 1997  Makoto Haraguchi, Tokuyasu Kakuta, Yoshiaki Okubo

        $B%4!<%k$K0MB8$7$?Cj>]2=$rMQ$$$?K!E*N`?d%7%9%F%`(B : GDA-LES

                         $B%W%m%0%i%`9=@.;EMM=q(B

                         $B:G=*99?7(B 1997.5.21
============================================================================

1. $B%7%9%F%`9=@.(B

  $BK\%7%9%F%`$O!"#3$D$N<gMW%b%8%e!<%k$H%f!<%6%$%s%?%U%'!<%9$+$i9=@.$5$l$k!#(B
  $B$3$l$i$K$D$$$F<($9!#(B

    [$B?dO@%(%s%8%s(B]

     $B=g=x%=!<%HO@M}$N%$%s%?%W%j%?$G$"$k!#=g=x%=!<%HC10l2=5!G=$rHw$($?(BSLD$BF3(B
     $B=P$r9T$&!#K!E*%k!<%k$N<:GT8!=P$dJQ?t$X$N=g=x%=!<%HBeF~$NMzNrJ];}5!G=$r(B
     $B;}$D!#$^$?!"2>A[%=!<%H3,AX$HK!E*%k!<%k$NHF2=$K$h$kN`?d$K$bMxMQ$5$l$k!#(B

    [$BA08~$-?dO@It(B]

     $BK!N'$NL\E*$r8!=P$9$k$?$a$NA08~$-?dO@$r9T$&!#1ieh$K$h$kO@>Z<:GT$N860x$H(B
     $B$J$C$?!"6X;_7?$NK!E*%k!<%k$NH]Dj$r2>Dj$H$7$F2C$(!"#C#F=R8l$GM?$($i$l$?(B
     $B%4!<%k$NF3=P$rD4$Y$k!#(B

    [GDA$B=hM}It(B]

     $BK!N'$NL\E*$N>ZL@$rJ]B8$9$kN`;w@-$r5a$a$k!#$3$3$G!"8!=P$5$l$kN`;w@-$O(B
     $B%=!<%H=89g$NJ,3d$GI=8=$5$l$F$$$k!#(B

    [$B%f!<%6%$%s%?!<%U%'!<%9(B]

     $B4J0WN`?d%7%9%F%`$H(BGDA$BN`;w@-8!=PIt$rE}9g$7$F1?MQ$9$k$?$a$N!"%-%c%i%/%?(B
     $B%Y!<%9$N%7%'%k$G$"$k!#(B

2. $B=hM}35MW(B

  $BK\%7%9%F%`$G$O!"%7%'%k$K$h$C$F1ieh!"N`?d!"%k!<%k$NL\E*8!=P!"$*$h$S(BGDA$B$K(B
  $B$h$kN`;w@-8!=P$N3F=hM}$r%I%i%$%V$7$F$$$k!#$3$l$i$N=hM}35MW$r=R$Y$k!#(B

    [$B1ieh(B]
     SLD$BF3=P$N%a%?%$%s%?%W%j%?$r3HD%$7$?$b$N$G$"$k!#%X%C%IC10l2=;~$K!"JQ?t(B
     $B$K3d$jIU$1$i$l$?%=!<%H>pJs$+$i!"=g=x%=!<%HC10l2=$,2DG=$G$"$k>l9g$K$N(B
     $B$_!"%X%C%IC10l2=$r@.8y$5$;!"%\%G%#It$N<B9T$K0\$k!#%W%m%0%i%_%s%0%F%C(B
     $B%/%K%C%/$H$7$F$O!"(BProlog$BJQ?t$rD>@\MQ$$$F!"%G%l%U=hM}$r(BProlog$B$KG$$;$F(B
     $B$$$k!#(B

    [$BN`?d(B]
     $B2>A[%=!<%H$rN`;w%=!<%H$N>e0L%=!<%H$H$7$F0l;~E*$K3,AX$r=q$-49$(!"DL>o$N(B
     $B=g=x%=!<%HO@M}$N1ieh$r9T$&!#N`?dBP>]$N%k!<%k$O2>A[%=!<%H$KHF2=$5$l$F$$(B
     $B$k$b$N$r;HMQ$9$k!#(B

    [$B%k!<%k$NL\E*8!=P(B]
     1) $B1ieh$K$h$k%*%j%8%J%k$NO@>Z$N<:GT860x$N%k!<%k$r8!=P$9$k!#(B
     2) $B$3$N%k!<%k$NH]Dj$r<h$j!"85$N%k!<%k$rCV$-49$($k!#(B
     3) $BA08~$-?dO@$K$h$j!"(BCF$B=R8l$N%4!<%k$NF3=P$r$9$Y$F(B
        $B5a$a$k!#(B
     4) $B$3$N%4!<%k$NO@M}@Q!J%k!<%k$NL\E*!K$H$=$N>ZL@$r<h$j=P$9!#(B

    [GDA$B$K$h$kN`;w@-8!=P(B]
     $B%k!<%k$NL\E*$N>ZL@$rJ]B8$9$k$h$&$J!"N`;w@-$r@8@.(B-$B8!::K!$K$h$j5a$a$k!#(B
     $B>\$7$/$O(B4.$B$N(BGDA$B%"%k%4%j%:%`$r;2>H$N$3$H!#(B

3. $B%W%m%0%i%`9=@.(B

  $B<!$K!"3F%W%m%0%i%`$NFbIt9=@.$N35MW$r<($9!#(B

  [newgda.pl]

    $B!&1ieh%(%s%8%s(B
    $B!&%k!<%kH]Dj:n@.(B
    $B!&A08~$-?dO@It(B
    $B!&(BGDA$B%a%$%s(B
    $B!&(BVRP$B6K>.HF2=(B
    $B!&(BSIC$B3HD%It(B
    $B!&BeBX2DG=@-8!::It(B
    $B!&(BSP$B8!::It(B
    $B!&%/%m!<%8%c:n@.It(B

  [user.pl]

   $B!&%7%'%k%a%$%s%k!<%W(B
   $B!&>uBVI=<((B
   $B!&2>A[3,AX$HHF2=%k!<%k$N=`Hw(B
   $B!&N`?d$HDL>o%b!<%I$N@Z$jBX$((B


4. GDA $B%"%k%4%j%:%`(B

  $BK\%7%9%F%`$NCf?4E*=hM}$G$"$k!"(BGDA$B=hM}$N%"%k%4%j%:%`$r<($9!#(B

4.1 $B%"%k%4%j%:%`$NI=5-K!(B

  $B%"%k%4%j%:%`$NI=5-$K$O!"0J2<$K<($9I=5-K!$rMQ$$$k!#(B

    $B<jB3$-5-=R(B::= begin $B%9%F!<%H%a%s%HNs(B end.
    $B%9%F!<%H%a%s%HNs(B::= $B%9%F!<%H%a%s%H(B | $B%9%F!<%H%a%s%H(B ; $B%9%F!<%H%a%s%HNs(B |
                        $B@)8fJ8(B | $B@)8fJ8(B ; $B%9%F!<%H%a%s%HNs(B
    $B@)8fJ8(B::=
      if $B>r7o<0(B then $B%9%F!<%H%a%s%HNs(B else $B%9%F!<%H%a%s%HNs(B end-if |
      if $B>r7o<0(B then $B%9%F!<%H%a%s%HNs(B end-if |
      while $B>r7o<0(B do $B%9%F!<%H%a%s%HNs(B end-while |
      for e $B":(B $B=89g(B do $B%9%F!<%H%a%s%HNs(B end-for

    $B"((Bfor$BJ8$G$O!"=89g$N$9$Y$F$NMWAG$K$D$$$F%9%F!<%H%a%s%HNs$N<B9T$r9T$&(B
      $B$b$N$H$7!"$5$i$K!"$=$N<B9TCf$K>r7oIt$N!V(Be $B":(B $B=89g!W$N=89g$O:FI>2A(B
      $B$5$l$J$$$b$N$H$9$k!#(B

  $B$^$?!"(B:=$B$OBeF~$rI=$7!"(B%$B$O$=$l0J9_$r%3%a%s%H$H$9$k!#(B


4.2 $B%G!<%?7?$HDj5A$5$l$?1i;;(B

  set  : $B=89g(B
        $B=89g1i;;(B
        Stack: $BE,Ev$J=g=x$G(Bstack$B2=$7$?$b$N$rJV$9(B
  vector : $B0J2<$N1i;;$NDj5A$5$l$?G[Ns(B
        $B=89g1i;;(B
       $B!J$?$@$7!"G[NsFb$N=g=x$rJ]B8$9$k$b$N$H$9$k!#!K(B
  stack : $B0J2<$N1i;;$NDj5A$5$l$?(Bvector
        Clear: $B6u$K$9$k(B
        Pop: $B@hF,$NMWAG$r<h$j=P$7:o=|$9$k(B
        Push: $B;XDj$NMWAG$r@hF,$K2C$($k(B
        Remove: $B;XDj$NMWAG$r:o=|$9$k(B
        Set: set$B2=$7$FJV$9(B
  int  : $B@0?t(B
        $B?tCM1i;;(B 
  sort : $B%=!<%H(B
  cell : sort$B$rMWAG$H$9$k(Bvector
  partition : cell$B$rMWAG$H$9$k(Bvector
  sort_set: sort$B$rMWAG$H$9$k(Bset
        Cell: $B%;%k2=$7$FJV$9(B
  cell_set: cell$B$rMWAG$H$9$k(B set
  partition_set: partition$B$rMWAG$H$9$k(B set
  sort_stack: sort$B$rMWAG$H$9$k(Bstack
  sort_set_stack: sort_set$B$rMWAG$H$9$k(Bstack
  partition_stack: partition$B$rMWAG$H$9$k(B stack


4.3 $B>r7o<0Fb$G;HMQ$5$l$k4X78(B

  $B!&(B $B=89g$*$h$S@0?tCM$KBP$7$F$ODL>oDL$j!#(B
  $B!&(B P <* P' $B$O!"Bg5WJ]$N(BGDA$B$K$*$$$F;HMQ$5$l$F$$$?!"=EJ#$J$/%;%k$r3HBg$9$k(B
     $BJ,3d@8@.J}<0$K$*$1$kAD@h$H;RB9$N4X78$r=g=x$H$7$?$b$N!#(B


4.4 $B4X?t(B

  VRP-Skip: partition |$B"*(B partition_set
    VRP$B$rK~B-$9$k6K>.HF2=$r9T$C$?J,3d$N=89g$rJV$9!#(B
    $B$J$*!"(BVRP$B$rK~$?$9$N$KI,MW$JHs%j!<%U%=!<%H$N>pJs$r(B
    $BI{:nMQ$H$7$FJ];}$5$;$k$b$N$H$9$k!#(B
  ABS-Check: partition |$B"*(B {TRUE,FALSE}
    $BBeBX2DG=@->r7o$N8!::$r9T$&!#(B
  CellSC: cell |$B"*(B {TRUE,FALSE}
    $BK\J8Cf$N(BCellSC$B<jB3$-!#(B
  Id: S |$B"*(B $B@5@0?t(B
    $B3F%=!<%H$KBP$7%f%K!<%/$J@5@0?t$rJV$9!#(B
    $B$J$*!"(BId(s)$B$NCM$r(Bs$B$N(BID$B$H8F$V!#(B 
  MaxId: cell |$B"*(B int
    $B%;%kFb%=!<%H$N;}$D:GBg$N(BID$B$rJV$9!#(B
  MinId: cell |$B"*(B int
    $B%;%kFb%=!<%H$N;}$D:G>.$N(BID$B$rJV$9!#(B
  Init: sort_set, cell_set |$B"*(B partition_set
    $B<:GT5_:Q$rK~$?$96K>.$N%j!<%UJ,3d$r(B
    VRP$B$K$h$C$F6K>.HF2=$7$?$b$N$NCf$G!"(B
    $BBeBX2DG=@-$rK~$?$9J,3d$N=89g$rF@$k!#(B
  Immediate-Super: sort_set |$B"*(B sort_set
    $B3F%=!<%H$N0l$D>e0L$N%=!<%H$r=8$a$k!#(B
  All-Leafs: sort |$B"*(B sort_set
    $B$"$k%=!<%H$N2<0L$K$"$k$9$Y$F$N%j!<%U$r=8$a$k!#(B
  Sort: sort_stack |$B"*(B sort_stack
    $B2<0L$N35G0$+$i=g$KJB$YD>$9!#(B
  NonFocus: partition |$B"*(B cell_set
    $BJ,3dFb$N%U%)!<%+%9$NEv$?$C$F$$$J$$%;%k$N=89g$rJV$9!#(B
  Singletons: sort_set |$B"*(B sort_set_stack
    $B%=!<%H=89g$r%=!<%H$NC1=89g$N=89g$KJQ49$9$k!#(B
  Add-Inferiors: sort_set |$B"*(B cell
    $B3F%=!<%H$N2<0L%=!<%H$r$9$Y$F2C$($?=89g$r:n@.$9$k!#(B


4.5 GDA$B<jB3$-(B


[$BF~NOBg0hJQ?t(B]
  S : sort_set %$B%=!<%H=89g(B ($B35G0$NJq@]=g=x4X78!e$,Dj5A$5$l$F$$$k(B)
  R : cell_set %$B<:GT5_:Q(B($B%;%k(B)$B$N=89g(B
[$B=PNOBg0hJQ?t(B]
  OutStack: partition_stack$B7?(B  % $BE,@Z$5$N4p=`$rK~$?$9(BS$B$NJ,3d$N=89g(B
[$B<jB3$-(B]
GDA-Main:
local var:
  newStack : partition_stack$B7?(B
  p, p*, p** :partition$B7?(B
  cell, cell_0, newCell :cell$B7?(B
  newP :partition$B7?(B
  currentP : partition_set$B7?(B
prog:
begin
  currentP:=Init(R,S);
  while currentP $B!b(B $B&U(B do
    % $B@8@.(B
    Clear(newStack);
    for p$B":(BcurrentP do
      p$BCf$N%^!<%/IU$-$N%;%k$r(Bcell_0$B$H$9$k(B;
      for cell$B":(B p-{cell_0}-NonFocus(p) do
        if MaxId(cell_0)$B!e(BMinId(cell) then
          newCell := cell_0 $B"@(B cell;   %$B=g=x4X78$OJ]B8$9$k(B
          p$B$N(Bcell_0$B$r(BnewCell$B$GCV$-49$($F(BNewP$B$H$9$k(B;
          newP :=  newP - {cell};
          newP$BFb$N(BnewCell$B$K%^!<%/$9$k(B;
          Push(newStack,newP)
        end-if
      end-for
    end-for;
    % $B8!::(B
    for p $B":(B newStack do
      if ABS-Check(p)=TRUE then
        P':=VRP-Skip(p);
        for p'$B":(BP' do
          if p$B!b(Bp' then
            Remove(newStack,p);
            if p<* p' $B"J(B ABS-Check(p')=TRUE then
              p'$B$K(BVRP$B$N$?$a$NHs%j!<%U$rDI2C$7$F(Bp''$B$H$9$k(B;
              if ABS-Check(p'')=TRUE then
                 Push(newStack,p'');
                 Push(OutStack,p'');
                 SI-Generation(p'')
              end-if
            end-if
          else
            Push(OutStack,p);
            SI-Generation(p)
          end-if
        end-for
      else
        Remove(newStack,p)
      end-if
    end-for;
    currentP:=Set(newStack)
  end-while
end.

SI-Generation(p_0):
arg:
  p_0: partition$B7?(B
local-var: 
  e, e*, s: sort$B7?(B
  u, u*: sort_set$B7?(B
  cell, cell_i: cell$B7?(B (0$B!e(B i < |p_0|)
  cellSet_i: cell_set$B7?(B (0$B!e(B i < |p_0|)
  supers, supers*, tmp, hist: sort_stack$B7?(B
  combStack, combStack*: sort_set_stack$B7?(B
  p: partition$B7?(B
  P, P*: partition_set$B7?(B
  N: int$B7?(B
prog:
begin
   for cell_i $B":(B p_0 do
     Clear(hist);
     supers := Immediate-Super(Move(cell_i));
     while supers$B!b&U(Bdo
      while supers$B!b&U(Bdo
         e := Pop(supers);
         if All-Leafs(e) $B"<(B cell_i then 
           Push(hist,e);
           for e'$B":(B Immediate-Super({e})-hist do
             Push(tmp,e')
           end-for
         end-if
       end-while;
       supers := tmp
     end-while;
     tmp := Sort(hist);
     while tmp$B!b&U(B do
       s := Pop(tmp);
       cell := Cell({x| x $B!e(B s $B"J(B x$B":(B hist});
       if CellSC(cell)=TRUE then 
         Push(cellSet_i,cell);
         Push(supers)
       else 
         s$B$N>e0L%=!<%H$r(Btmp$B$+$i=|$/(B
       end-if
     end-while;     
     combStack:=Singleton(supers);
     while combStack$B!b&U(B do
       Clear(combStack');
       for u$B":(BcombStack_n do
         supers':=supers;
         while supers'$B!b&U(B do
           s:=Pop(supers');
           if$B$I$N(Bu$B$NMWAG$KBP$7$F$b(Bs$B$H$NJq@]4X78$,$J$$(B then
             u'=u$B"@(B{s};
             cell:=Add-Inferiors(u');
             if CellSC(cell)=TRUE then
               Push(cellSet_i,cell);
               Push(combStack',u')
             else
               supers'$B$+$i(Bs$B$N>e0L%=!<%H$r<h$j=|$/(B
             end-if
           end-if
         end-while
       end-for;
       combStack:=combStack'
     end-while
   end-for;
   Clear(P);
   Clear(p);
   Push(P,p);
   N:=|p_0|;
   i := 0;
   while i<N do
     Clear(P*);
     for cell $B":(B cellSet_i do
       for p$B":(B P do
         Push(p,cell);
         Push(P*,p)
       end-for
     end-for;
     P := P*;
     i := i+1
   end-while;
   while P$B!b&U(B do 
     p:=Pop(P);
     Push(OutStack, p)
   end-while
end.


============================================================================
                              $B3QED(B $BFFBY(B($BKLBg(B)  kaku@db.huee.hokudai.ac.jp
