/**********************************************************************/
/*                  klint - KL1 $B%W%m%0%i%`@EE*2r@O7O(B                  */
/*                                                                    */
/*                            Version 2.0                             */
/*                             March 1998                             */
/*                                                                    */
/*                             $B>eED(B  $BOB5*(B                             */
/*                                                                    */
/*                     $BAa0pEDBg3XM}9)3XIt>pJs3X2J(B                     */
/*                    ueda@ueda.info.waseda.ac.jp                     */
/*                                                                    */
/*                 Copyright (C) 1998  Kazunori Ueda                  */
/*                                                                    */
/**********************************************************************/

1. $B35MW(B:

Klint V2 $B$O!"(BKL1 $B%W%m%0%i%`$N$?$a$N@)Ls%Y!<%9$N@EE*2r@O7O$G$"$j!"0J2<(B
$B$N5!G=$r$b$C$F$$$^$9!#(B

  - $B%b!<%I2r@O(B
  - $B%G!<%?;2>H?t2r@O(B (linearity analysis)
  - $B7?2r@O(B

Klint V2 $B$NCf?4E*$J5!G=$O%b!<%I2r@O$G!"J88%(B [1] $B$K=R$Y$F$"$kJ}K!$G(BKL1
$B%W%m%0%i%`$N%b!<%I$r2r@O$7$^$9!#%W%m%0%i%`$,!VNI$/%b!<%I$E$1$i$l$F$$$k(B 
(well-moded)$B!W$H$O!"Bg$^$+$K8@$($P!"%W%m%0%i%`$NCf$G;H$C$F$$$kDL?.%W%m(B
$B%H%3%k$,6(D4E*$G$"$k$H$$$&$3$H$G$9!#(BKL1 $B%W%m%0%i%`$O!"(Bwell-moded $B$K=q(B
$B$/$3$H$r6/$/?d>)$7$^$9!#$=$l$K$h$C$F!"B?$/$N8m$j$,@EE*$K8!=P$G$-$k$h$&(B
$B$K$J$j(B [3]$B!"$^$?%W%m%0%i%`$N$h$j9bEY$J:GE,2=$,2DG=$H$J$k$+$i$G$9!#(B

Klint V2 $B$O!"%W%m%0%i%`Cf$G07$&%G!<%?$N;2>H?t$H7?$N2r@O$b9T$J$$$^$9!#(B
$B%G!<%?;2>H?t2r@O$NL\E*$O!"0l$D$NJQ?t=P8=$+$i$7$+;2>H$5$l$J$$%G!<%?$H!"(B
$BJ#?t$NJQ?t=P8=$+$i;2>H$5$l$k2DG=@-$N$"$k%G!<%?$H$r6hJL$9$k$3$H$G$9!#$3(B
$B$N$h$&$K!";2>H?t2r@O$O%3%s%Q%$%k;~%4%_=8$a$N$?$a$N4pK\E*$J>pJs$rDs6!$7(B
$B$F$/$l$^$9!#(B

Klint V2 $B$K$*$1$k7?2r@O$NL\E*$O!"$I$N$h$&$J4X?t5-9f$,%W%m%0%i%`$N3F%Q(B
$B%9(B ($B%4!<%k$N0z?t$H$7$F=P8=$7$&$k%G!<%?9=B$$NCf$N8D!9$N>l=j(B) $B$K=P8=$7$&(B
$B$k$+$rD4$Y$k$3$H$G$9!#(BKlint V2 $B$G$O!"4X?t5-9f$O!"(B(1) $B@0?t!"(B(2) $BIbF0>.(B
$B?tE@?t!"(B(3) $B6u%j%9%H(B([])$B!"(B(4) $B>e5-0J30$NDj?t5-9f!"(B(5) $BJ8;zNs!"(B(6) $B%Y%/(B
$B%?!"(B(7)$B%j%9%H9=@.;R!"(B(8) $B$=$NB>$N(B($B#10z?t0J>e$N(B)$B4X?t5-9f!"$N#8$D$N%+%F(B
$B%4%j$KJ,N`$7$F2r@O$7$^$9!#(B

Klint V2 $B$r;H$&$K$"$?$C$F!"%W%m%0%i%^$,%b!<%I$d;2>H?t$d7?$N@k8@$rM?$((B
$B$kI,MW$O$"$j$^$;$s!#$=$l$i$O(B klint V2 $B$,?dO@$7$F$/$l$^$9!#(B

Klint V2 $B$N9=@.MWAG$O!"@)Ls@8@.7O!"%b!<%I!?;2>H?t2r@O7O!"7?2r@O7O$N;0(B
$B$D$KBg$-$/J,$1$k$3$H$,$G$-$^$9!#@)Ls@8@.7O$O!"M?$($i$l$?(B KL1 $B%W%m%0%i(B
$B%`$,9=J8E*$K2]$9$k%b!<%I!?;2>H?t!?7?@)Ls$rCj=P$7$^$9!#%b!<%I!?;2>H?t2r(B
$B@O7O$O$^$:!"%b!<%I@)Ls=89g(B S $B$KBP1~$9$k%b!<%I%0%i%U(B [1] $B$r:n$k$3$H$K$h$C(B
$B$F!"(BS $B$,=<B-2DG=$+$I$&$+$rD4$Y$^$9!#(BS $B$KBP1~$9$k%b!<%I%0%i%U$O!"%W%m%0(B
$B%i%`$N<g%b!<%I(B(principal mode, $B$b$C$H$b0lHLE*$J%b!<%I(B)$B$rI=8=$7$F$$$^$9!#(B
S $B$,=<B-(B($BIT(B)$B2DG=$J$H$-!"%W%m%0%i%`$O!VNI$/%b!<%I$E$1$i$l$F$$$k(B ($B$$$J$$(B)
((non-)well-moded)$B!W$H8@$$$^$9!#%W%m%0%i%`$,NI$/%b!<%I$E$1$i$l$F$$$k>l(B
$B9g!"%b!<%I!?;2>H?t2r@O7O$O!"0z$-B3$-;2>H?t2r@O$r9T$J$$$^$9!#;2>H?t2r@O(B
$B7O$O!"%b!<%I2r@O$HF1MM$NJ}K!$G%W%m%0%i%`$N;2>H?t%0%i%U$r:n@.$7$^$9!#(B

$B7?2r@O7O$b!"%b!<%I2r@O$HF1MM$NJ}K!$G%W%m%0%i%`$N7?%0%i%U$r:n@.$7$^$9!#(B
$B$7$+$7!"%b!<%I2r@O$H0[$J$j!"7?2r@O$,7?8m$j$rJs9p$9$k$3$H$O$"$j$^$;$s!#(B
$B$3$l$O!"0[$J$k%+%F%4%j$KB0$9$k4X?t5-9f$,F10l%Q%9$K=P8=$7$J$$$H$$$&$3$H(B
$B$r2>Dj$7$F$O$$$J$$$+$i$G$9!#(B

$B%b!<%I2r@O$NF~LgE*$JJ88%$H$7$F$O(B[2]$B$,$"$j$^$9!#(B


2. $B;HMQK!(B

Klint $B$NMxMQK!$OHs>o$K4JC1$G!"(BKL1 $B%W%m%0%i%`$N%=!<%9%U%!%$%k$r(B

  % klint < xxx.kl1

$B$N$h$&$K(B klint $B$KM?$($k$@$1$G$9!#(B

$BF~NO(B:

Klint V2 $B$X$NF~NO$O!"0l$D0J>e$N%b%8%e!<%k$+$i$J$k(BKL1$B%W%m%0%i%`$G!"I8=`(B
$BF~NO(B (stdin) $B$+$iM?$($^$9!#J#?t$N%U%!%$%k$+$i$J$k%W%m%0%i%`$r2r@O$9$k(B
$B$H$-$O(B

  % cat xxx.kl1 yyy.kl1 zzz.kl1 | klint

$B$H$7$F2<$5$$!#(B


$B=PNO(B:

$BM?$($i$l$?%W%m%0%i%`$,(B well-moded $B$J$i$P!"(Bklint V2 $B$O%W%m%0%i%`$N%b!<(B
$B%I%0%i%U!";2>H?t%0%i%U!"$*$h$S7?%0%i%U$rI8=`=PNO(B (stdout) $B$+$i=PNO$7$^(B
$B$9!#(B

$B%W%m%0%i%`$,(B non-well-moded $B$J$H$-$O!"(Bklint V2 $B$O$I$N%b!<%I@)Ls$,:G=*(B
$BE*$K%b!<%I8m$j$r0z$-5/$3$7$?$+$rJs9p$7$?$"$H!"$=$N;~E@$G$N(B ($B:n@.Cf$N(B) 
$B%b!<%I%0%i%U$r=PNO$7$^$9!#;2>H?t2r@O$O9T$J$o$:!"0z$-B3$-7?%0%i%U$r=PNO(B
$B$7$^$9!#(BNon-well-moded $B$G$"$k$H$O!"%W%m%0%i%`$,2]$9$k%b!<%I@)Ls=89g$,(B
$B=<B-ITG=$G$"$k$3$H$r0UL#$7$^$9!#(BKlint $B$N<!$NHG$G$O!"J88%(B [4] $B$N%"%$%G(B
$B%"$rMQ$$$F!"%b!<%I@)Ls$NL7=b$9$k6K>.ItJ,=89g$r=PNO$9$k$h$&$K$9$kM=Dj$G(B
$B$9!J$3$N5!G=$O!"(Bklint V1 $B$N3HD%$G$"$k(B kima $B$K$O$9$G$K<BAu$5$l$F$$$^$9!K!#(B

Klint V2 $B$,$I$N$h$&$J%b!<%I!?;2>H?t!?7?@)Ls$r@8@.$7$F$$$k$+$O!"%3%^%s(B
$B%I(B klint $B$N$+$o$j$K!"@)Ls@8@.$N$_$r9T$J$&(B klint1 $B$rMQ$$$k$3$H$K$h$C$F(B
$BCN$k$3$H$,$G$-$^$9!#@)Ls2r@O$N$_$r9T$J$&(B klint2 $B$HJ;MQ$7$F(B

  % klint1 < xxx.kl1 | klint2

$B$H$9$k$H!"(B

  % klint <xxx.kl1 .

$B$HF1$8=PNO$,F@$i$l$^$9!#(B


3. $B<B9TNc(B

$B%U%!%$%k(B merge.kl1 $B$K2<5-$N%9%H%j!<%`J;9g%W%m%0%i%`$,F~$C$F$$$k$H$7$^(B
$B$9!#(B

  :- module m.

  merge([],   Y,    Z ) :- true| Z=Y.
  merge(X,    [],   Z ) :- true| Z=X.
  merge([A|X],Y,    Z0) :- true| Z0=[A|Z], merge(X,Y,Z).
  merge(X,    [A|Y],Z0) :- true| Z0=[A|Z], merge(X,Y,Z).

Klint V2 $B$N=PNO$O!"0J2<$N$h$&$K$J$j$^$9!#(B

  > klint < merge.kl1
  *** Mode Graph ***
  node(0): (unconstrained)
   <(m:merge)/3,1> ---> node(13)
   <(m:merge)/3,2> ---> node(13)
   <(m:merge)/3,3> --*> node(13)
  node(13): in
   <cons,1> ---> node(15)
   <cons,2> ---> node(13)
  node(15): (unconstrained)

  *** Linearity Graph ***
  node(0): (unconstrained)
   <(m:merge)/3,1> ---> node(13)
   <(m:merge)/3,2> ---> node(13)
   <(m:merge)/3,3> ---> node(13)
  node(13): (unconstrained)
   <cons,1> ---> node(15)
   <cons,2> ---> node(13)
  node(15): (unconstrained)

  *** Type Graph ***
  node(0): []
   <(m:merge)/3,1> ---> node(13)
   <(m:merge)/3,2> ---> node(13)
   <(m:merge)/3,3> ---> node(13)
  node(13): [nil,cons]
   <cons,1> ---> node(15)
   <cons,2> ---> node(13)
  node(15): []

$B$^$:%b!<%I%0%i%U$NFI$_J}$r@bL@$7$^$9!#:,@aE@(B ($B@aE@(B 0) $B$+$i#3K\$N;^$,=P(B
$B$F$$$^$9!#$3$l$i$O!"(Bmerge $B$NBh#10z?t$HBh#20z?t$,!"@aE@(B 13 $B$K$h$C$FI=$o(B
$B$5$l$kF10l$N%b!<%I$r$b$A!"Bh#30z?t$O$=$l$H$O@5H?BP$N%b!<%I$r$b$D$3$H$r(B
$BI=$o$7$F$$$^$9!#@aE@(B 13 $B$O!"(Bmerge $B$N0z?t$H$7$F=P8=$9$k%j%9%H$N(B cdr $B$O(B
$B%j%9%HA4BN$HF10l$N%b!<%I$r$b$D$3$H$rI=L@$7$F$$$^$9!#$3$N=PNO7k2L$N%0%i(B
$B%U%#%+%k$JI=8=$O!"J88%(B [3] $B$J$I$K$"$j$^$9!#(B

$B%b!<%I%0%i%U$N<!$K=PNO$5$l$F$$$k;2>H?t%0%i%U$O!"(Bmerge $B%W%m%0%i%`<+?H$,(B
$B$I$N%G!<%?$N6&M-$b?7$?$K0z$-5/$3$5$J$$$3$H$r<($7$F$$$^$9!#$D$^$j!"F~NO(B
$B%9%H%j!<%`$NMWAG(B ($B@aE@(B 15) $B$,6&M-$5$l$F$$$J$$8B$j!"=PNO%9%H%j!<%`$NMW(B
$BAG$bHs6&M-$G$"$k$3$H$,J]>Z$5$l$^$9!#$^$?$3$N%W%m%0%i%`$O!"F~NO%9%H%j!<(B
$B%`$*$h$S=PNO%9%H%j!<%`$N9|3J(B (skeleton) $B$N6&M-$b0z$-5/$3$7$^$;$s(B ($B@aE@(B 
13)$B!#$7$?$,$C$F!"F~NO%9%H%j!<%`$N9|3J$,J#?t;2>H$K$J$C$F$$$J$$8B$j(B ($BJ#(B
$B?t;2>H$K$J$k$+$I$&$+$O!"%W%m%0%i%`A4BN$N2r@O$K$h$C$FL@$i$+$K$J$j$^$9(B)$B!"(B
$B$=$N9|3J$O=PNO%9%H%j!<%`$N9|3J7A@.$K:FMxMQ$9$k$3$H$,$G$-$^$9!#(B

$B$D$.$K!"J#?t;2>H$,8!=P$5$l$kNc$r<($7$^$9!#(B

  :- module main.

  main :- true | tty:ttystream([gett(X),putt(Y),nl]), quicksort(X,Y).

  quicksort(Xs,Ys) :- qsort(Xs,Ys,[]).
  qsort([],    Ys0,Ys ) :- true | Ys=Ys0.
  qsort([X|Xs],Ys0,Ys3) :- true |
      part(X,Xs,S,L), qsort(S,Ys0,[X|Ys2]), qsort(L,Ys2,Ys3).

  part(_,[],    S, L ) :- true | S=[], L=[].
  part(A,[X|Xs],S0,L ) :- A>=X | S0=[X|S], part(A,Xs,S,L).
  part(A,[X|Xs],S, L0) :- A< X | L0=[X|L], part(A,Xs,S,L).

$B$3$N%/%$%C%/%=!<%H%W%m%0%i%`$N;2>H?t%0%i%U$O2<5-$N$h$&$K$J$j$^$9!#(B

  *** Linearity Graph ***
  node(0): (unconstrained)
   <(main:quicksort)/2,1> ---> node(28)
   <(main:quicksort)/2,2> ---> node(20)
   <(main:qsort)/3,1> ---> node(28)
   <(main:qsort)/3,2> ---> node(20)
   <(main:qsort)/3,3> ---> node(20)
   <(main:part)/4,1> ---> SHARED
   <(main:part)/4,2> ---> node(28)
   <(main:part)/4,3> ---> node(28)
   <(main:part)/4,4> ---> node(28)
   <(tty:ttystream)/1,1> ---> node(1)
  node(28): (unconstrained)
   <cons,2> ---> node(28)
  node(20): (unconstrained)
   <cons,1> ---> SHARED
   <cons,2> ---> node(20)
  node(1): (unconstrained)
   <cons,1> ---> node(2)
   <cons,2> ---> node(5)
  node(2): (unconstrained)
   <gett/1,1> ---> node(28)
  node(5): (unconstrained)
   <cons,1> ---> node(6)
  node(6): (unconstrained)
   <putt/1,1> ---> node(20)

$B$3$N%0%i%U$O!"7k2L$N%j%9%H(B ($B@aE@(B 20) $B$NMWAG!"$*$h$S(B part $B$NBh#10z?t$N(B
$BCM$,6&M-$5$l$&$k$3$H$rI=$o$7$F$$$^$9!#6&M-$N860x$O!"(Bqsort $B$NBh#2@a$K$"(B
$B$j$^$9!#$7$+$7!"7k2L$N%j%9%H$N9|3J$OC10l;2>H$G$"$k$3$H$,J]>Z$5$l$^$9!#(B
$B$^$?!"F~NO%j%9%H$N9|3J$dMWAG$b?7$?$K6&M-$5$l$k$3$H$,$"$j$^$;$s!#(B

($B$J$*$3$N%W%m%0%i%`$G$O!"%G!<%?$N6&M-$OH/@8$9$k$b$N$N!"6&M-$5$l$k%G!<(B
$B%?$,@0?tCM$N$_$G$"$k$N$G!"@0?tCM$rB(CM$H$7$F4IM}$9$k=hM}7O$G$O!"%4%_$N(B
$BH/@8$9$k$3$H$O$"$j$^$;$s!#(B)


4. $B%$%s%9%H!<%k(B

Klint V2 $B$O(B KL1 $B8@8l$@$1$G=q$+$l$F$$$F!"(BKLIC $B=hM}7O$G%3%s%Q%$%k$9$k$3(B
$B$H$,$G$-$^$9!#%3%^%s%I(B

  % make

$B$K$h$C$F!";0$D$N<B9T2DG=%U%!%$%k(B klint$B!"(Bklint1$B!"(Bklint2 $B$,:n$i$l$^$9!#(B

Klint V2 $B$NG[I[%-%C%H$O!"2<5-$N%U%!%$%k$+$i$J$C$F$$$^$9!#(B

  (1) Makefile -- make $B%U%!%$%k(B
  (2) Readme-J -- $B$3$N%U%!%$%k(B
      Readme-E -- $B$3$N%U%!%$%k$N1Q8lHG(B
  (3) klint-main.kl1, klint1-main3.kl1, klint2-mainA.kl1
      read_program3.kl1, normalize5.kl1, unify.kl1
      builtin_DB5.kl1, numberbuiltin3.kl1, findpath4.kl1
      constraints9.kl1, type.kl1, stdinout.kl1
      graphB.kl1, tgraph2.kl1, decode2.kl1, tdecode.kl1
      reduce5.kl1, sort.kl1, outmessage4.kl1, klint2.kl1
	       -- klint V2 $B$N%=!<%9%W%m%0%i%`(B
  (4) examples/merge.kl1, examples/quicksort.kl1
               -- $B$3$N%^%K%e%"%k$GMQ$$$?NcBj%W%m%0%i%`(B


5. $B%5%]!<%H$5$l$F$$$J$$(B KL1 $B8@8l$N5!G=(B

$B<!$N(B KL1 $B8@8l$N5!G=$O8=;~E@$G$O%5%]!<%H$7$F$$$^$;$s!#(B

(1) $B%^%/%mE83+(B

(2) $B%$%s%i%$%s#C%3!<%I5!G=(B

(3) $B%8%'%M%j%C%/!&%*%V%8%'%/%H$N@8@.(B `generic:new(...)' $B$H%a%=%C%I8F=P(B
    $B$7(B `generic:METHOD'

$B$=$NB>$N(B KL1 $BBh#3HG$NAH9~=R8l$O$9$Y$F%5%]!<%H$7$F$$$^$9!#(B


6. $B@)8B(B

(1) Klint V2 $B$N%b!<%I2r@O$O<g%b!<%I$r5a$a$k$3$H$rL\E*$K$7$F$$$^$9$,!"(B
$B@a$K#32s0J>e=P8=$9$kJQ?t(B (nonlinear $B$JJQ?t(B) $B$K$D$$$F$O!"0lJ}8~E*$J>pJs(B
$B$NN.$l$r$b$C$F$$$k$H2>Dj$7$F@)Ls$N%j%@%/%7%g%s$r9T$J$$!":GHF2r$h$j$b@)(B
$BLs$N6/$$2r$r=PNO$9$k$3$H$,$"$j$^$9!#$7$+$7!"$3$l$^$G$K=q$+$l$?(B KL1 $B%W(B
$B%m%0%i%`$G!"(Bnonlinear $B$JJQ?t$r(B ($BJV?.H"$D$-$N%a%C%;!<%8$J$I$N(B) $BAPJ}8~DL(B
$B?.$KMQ$$$F$$$?Nc$O$[$H$s$I$"$j$^$;$s!#(B

(2) $B>e5-(B (1) $B$N@)Ls6/2=$K$h$C$F$b!"C19`$^$?$O#29`$N@)Ls$X$N%j%@%/%7%g(B
$B%s$,$G$-$J$+$C$?#39`0J>e$N@)Ls$K$D$$$F$O!"$=$N=<B-2DG=@-$O8!::$7$^$;$s!#(B
Klint V2 $B$OC1$K$=$l$i$N@)Ls$,%j%@%/%7%g%s$G$-$J$+$C$?;]$rJs9p$7$^$9!#(B


$B;29MJ88%(B

[1] Ueda, K. and Morita, M., Moded Flat GHC and Its Message-Oriented
Implementation Technique.  New Generation Computing, Vol.13, No.1
(1994), pp.3-43.

[2] Ueda, K., I/O Mode Analysis in Concurrent Logic Programming.  In
Theory and Practice of Parallel Programming, LNCS 907, Springer, 1995,
pp.356-368.

[3] Ueda, K., Experiences with Strong Moding in Concurrent
Logic/Constraint Programming.  In Proc. Int. Workshop on Parallel
Symbolic Languages and Systems (PSLS'95), T. Ito, R.H. Halstead, Jr., and
C. Queinnec (eds.), LNCS 1068, Springer, 1996, pp.134-153.

[4] Cho, K. and Ueda, K., Diagnosing Non-Well-Moded Concurrent Logic
Programs.  To be presented at 1996 Joint International Conference and
Symposium on Logic Programming (JICSLP'96), Bonn, Germany, September
1996.
