/**********************************************************************/
/*                          kima $B;HMQ<j0z=q(B                           */
/*                                                                    */
/*                            Version 1.0                             */
/*                             April 1997                             */
/*                                                                    */
/*                    Kazunori Ueda and Kenta Cho                     */
/*           Department of Information and Computer Science           */
/*                         Waseda University                          */
/*                    ueda@ueda.info.waseda.ac.jp                     */
/*                                                                    */
/*          Copyright (C) 1997  Kazunori Ueda and Kenta Cho           */
/*                                                                    */
/**********************************************************************/


$B#1!%(Bkima$B$N35MW(B
$B!1!1!1!1!1!1!1(B
kima$B$O!"%b!<%I$E$1$G$-$J$$(B(ill-moded$B$J(B)$B%W%m%0%i%`$N!"%b!<%I8m$j(B(mode
error)$B$r2r@O$9$k%D!<%k$G$"$k!#(Bkima$B$rMQ$$$F%b!<%I8m$j$rFCDj$9$k$3$H$G!"(B
KL1$B%W%m%0%i%`$NDL?.%W%m%H%3%k$N8m$j$r!"@EE*$K8!=P$9$k$3$H$,$G$-$k!#(B

kima$B$O!"%b!<%I8m$j$r@)Ls$NL7=b$9$k6K>.ItJ,=89g$H$7$FFCDj$9$k!#%b!<%I8m$j(B
$B$KBP1~$9$k6K>.ItJ,=89g!"$*$h$S$=$l$K4^$^$l$k3F@)Ls$,%W%m%0%i%`Cf$N$I$N%7(B
$B%s%\%k$N$I$N5,B'$+$iF@$i$l$?$b$N$G$"$k$+$rI=<($9$k$3$H$G!"%P%0$NB8:_$9$k(B
$B2U=j$rFCDj$9$k$3$H$,$G$-$k!#$^$?!"%W%m%0%i%`$r%W%m%;%99=B$$KJ,3d$7!"3F%W(B
$B%m%;%9$3$H$N2r@O!"$*$h$S%W%m%;%94V$K$^$?$,$k2r@O$r9T$&!#(B

$B6K>.ItJ,=89gCf$NL7=b$N860x$H$7$F5?$o$7$$@)Ls$NDs<($d!"JQ?t=q$-49$($K$h$k(B
$BL7=b$r2r>C$9$k=$@50F$NDs<($b9T$&!#(B

kima$B$O!"%b!<%I@k8@$J$I$N!"2r@OBP>]$N(BKL1$B%W%m%0%i%`0J30$NF~NO$OI,MW$H$7$J(B
$B$$!#(B

kima$B$O(B2$B$D$N%W%m%0%i%`$G9=@.$5$l$F$$$k!#(B


A. klint101

   klint(Mode Analyzer for KL1 Programs)$B$N%b!<%I@)Ls@8@.7O(B(klint1)$B$K!"%W(B
   $B%m%0%i%`$N%W%m%;%99=@.$rG'<1$7!"2<@A$1$N=R8l8F$S=P$7$KE:;z$E$1$r$7$?(B
   $B%b!<%I@)Ls$r=PNO$9$k$h$&5!G=$r2C$($?$b$N!#(B

   KL1$B%W%m%0%i%`$rI8=`F~NO$+$i<u$1<h$j!"$=$N%W%m%;%9$4$H$N%b!<%I@)Ls$rI8(B
   $B=`=PNO$+$i=PNO$9$k!#(B

B. kima2

   kima2$B$O!"(Bklint101$B$+$iF@$i$l$?%W%m%;%9$4$H$N%b!<%I@)Ls$rMxMQ$7$F!"6K>.(B
   $BItJ,=89g$rC5:w$9$k!#(B

   klint101$B$N=PNO7k2L$rI8=`F~NO$+$i<u$1<h$j!"I8=`=PNO$K!"F@$i$l$?6K>.It(B
   $BJ,=89g!"$=$l$i$NFb$N5?$o$7$$@)Ls!"$*$h$S=$@50F$r!"%W%m%;%9Fb$N8m$j$H(B
   $B%W%m%;%94V$N8m$j$K$D$$$F=PNO$9$k!#(B


$B#2!%(Bkima$B$N<B9T(B
$B!1!1!1!1!1!1!1(B
kima$B$O!"%3%^%s%I%i%$%s>e$G!"(B

  % kima KL1$B%W%m%0%i%`%U%!%$%kL>(B

$B$HF~NO$7$F5/F0$9$k!#(B

kima$B$O(BUnix$B$N(Bsh(Bourne shell)$B$G0J2<$N$h$&$KDj5A$5$l$F$$$k!#(B

    #! /bin/sh

    if test $# -eq 0; then
         klint101     | kima2;
    else klint101 <$1 | kima2 $2 $3 $4 $5 $6 $7 $8 $9;
    fi

kima$B$O(Bklint101$B$H(Bkima2$B$r(BUnix$B$N%Q%$%W$G$D$J$$$@F0:n$r9T$&!#(B


$B#3!%(Bkima$B$N<B9TNc(B
$B!1!1!1!1!1!1!1!1(B
$B$3$3$G$O(Bkima$B$N<B9TNc$r<($9!#(B

$B#3!%#1(B  $B<B9TNc#1(B
$B!1!1!1!1!1!1!1!1(B
$B0J2<$N%9%H%j!<%`J;9g%W%m%0%i%`$r(Bkima$B$G2r@O$9$k!#(B

    :- module main.

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

    merge([A|X1],Y,Z) :- true | 
    %	Z=[A|Z1], merge(X1,Y,Z1).($B@5(B)
            Z=[A|Z1], merge(X1,Y,Z). ($B8m(B)
    merge(X,[A|Y1],Z) :- true |
            Z=[A|Z1], merge(X,Y1,Z1).

kima$B$N=PNO7k2L$O0J2<$N$h$&$K$J$k!#(B

    Mode Error in process([(main:merge)/3])

    m/<(=)-2/2,1> \= m/<(=)-2/2,2>          (BU) at merge/3(3)
    m(<(=)-2/2,2>) = in             (BF) to list at merge/3(3)
    m/<(=)-2/2,1> = IN              (BV) to "Z" at merge/3(3)
    "Z" at <(=)-2/2,1> => "A" "Z1" 
    ------

$B:G=i$N9T$O!"0J2<$N6K>.ItJ,=89g$,$I$N%W%m%;%9$+$iF@$i$l$?$+$,I=<($5$l$F$$(B
$B$k!#(B

========================= $B%W%m%;%9Fb%(%i!<(B =============================
Mode Error in process(ProcPred)

    ProcPred : $B%b!<%I%(%i!<$N$"$k%W%m%;%9$K4^$^$l$k=R8lL>$N%j%9%H(B
========================================================================

$B<!$N9T$+$i$O6K>.ItJ,=89g$K4^$^$l$k@)Ls<0$,I=<($5$l$k!#(B

===================== $B6K>.ItJ,=89g$K4^$^$l$k@)Ls<0(B =====================
ModeConst    (Rule) to "Symbol" at PredName/PredArity(PredNo)

    ModeConst                 : $B%b!<%I@)Ls<0(B
    Rule                      : $B$=$N@)Ls$rF3$$$?5,B'(B
    Symbol                    : $B$=$N@)Ls$r2]$7$?5-9f(B
                                 ($B5,B'$N<oN`$K$h$C$F$OI=<($5$l$J$$(B)
    PredName/PredArity(PredNo): $B$=$N@)Ls$r2]$7$?@a(B
        PredName  : $B=R8lL>(B 
        PredArity : $B=R8l$N0z?t$N?t(B
        PredNo    : $B$=$N=R8l$NDj5ACf2?HVL\$K=P8=$9$k@a$+(B
========================================================================

$B$3$NNc$G$O!"(B3$B$D$N@)Ls$r4^$`6K>.ItJ,=89g$,F@$i$l$?!#:G8e$N@)Ls(B
m/<(=)-2/2,1> = IN $B$K$D$$$F$O!"JQ?tL>$N=q$-49$($K$h$k=$@50F$,I=<($5$l$F(B
$B$$$k!#(B

========================= $BJQ?t=q$-49$($N=$@50F(B =========================
CngVar at VarPath => FixVar
    CngVar  : $B=q$-49$($kJQ?tL>(B
    VarPath : $B=q$-49$($kJQ?t$NB8:_$9$k%Q%9(B
    FixVar  : $B$I$NJQ?t$K=q$-49$(2DG=$+(B
========================================================================

$B$3$NNc$N>l9g$O!"@a(B merge/3(3)$B$N%Q%9(B <(=)-2/2,1> $B$K=P8=$9$kJQ?t(B Z $B$r(BA $B$+(B 
Z1 $B$K=q$-49$($k$3$H$rDs0F$7$F$$$k!#(BZ $B$r(B Z1 $B$K=q$-49$($l$P!"@5$7$$%W%m%0(B
$B%i%`$,F@$i$l$k!#(B

$B#3!%#2(B  $B<B9TNc#2(B
$B!1!1!1!1!1!1!1!1(B
$B0J2<$N(Blifo$B%=!<%H%W%m%0%i%`$r(Bkima$B$G2r@O$9$k!#(B

    :- module main.

    main :- true |
            X=[3,5,4,6,2,9,4],
            mysort(X,A),
            io:outstream([print(A),nl]).

    mysort([H|T],A) :- true | compare(H,T,[],[],A).

    compare(V,[],[],[],A) :- true | A=[V].
    compare(V,[],[H|T],[],A) :- true |
    %	compare(H,T,[],[],A1),append(A1,[V],A).($B@5(B)
            compare(H,T,[],[],A1),append(A,[V],A1).($B8m(B)
    compare(V,[],[],[H|T],A) :- true | compare(H,T,[],[],A1),A=[V|A1].
    compare(V,[],[H1|T1],[H2|T2],A) :- true |
            compare(H1,T1,[],[],A1),
            compare(H2,T2,[],[],A2),
            append(A1,[V|A2],A).

    compare(V,[H|T],L,R,A) :- V>H | NL=[H|L],compare(V,T,NL,R,A).
    compare(V,[H|T],L,R,A) :- V=<H | NR=[H|R],compare(V,T,L,NR,A).

    append([],Y,Z) :- true | Y=Z.

    append([A|X],Y,Z) :- true |
            Z=[A|Z1],append(X,Y,Z1).

$B=PNO7k2L$O0J2<$N$h$&$K$J$k!#(B

    process([(main:compare)/5]) wrongly uses the lower layer

    ! m/<compare/5,5> = m/<append-5/3,1>    (BV) to "A" at compare/5(2)
    "A" at <append-5/3,1> => "V" "H" "T" "A1" 
    m(<(=)-4/2,2><.,2>) = in                (BF) to atom([]) at compare/5(1)
    m/<compare/5,5> = m/<(=)-4/2,1>         (BV) to "A" at compare/5(1)
    m/<(=)-4/2,1> \= m/<(=)-4/2,2>          (BU) at compare/5(1)
    ------

    ! m/<append-5/3,3> \= m/<compare/5,5>   (BV) to "A1" at compare/5(2)
    "A1" at <append-5/3,3> => "A" 
    "A1" at <compare/5,5> => "A" 
    m/<(=)-6/2,1> \= m/<(=)-6/2,2>          (BU) at compare/5(3)
    m(<(=)-6/2,2>) = in                     (BF) to list at compare/5(3)
    m/<compare/5,5> = m/<(=)-6/2,1>         (BV) to "A" at compare/5(3)
    "A" at <compare/5,5> => "A1" 
    ------

$B:G=i$N9T$O!"$"$k%W%m%;%9$,2<@A%W%m%;%9$N;H$$J}$r8m$C$F$$$k$3$H$r<($7$F$$(B
$B$k!#$=$N2<$K!"$=$N8m$j$KBP1~$9$k6K>.ItJ,=89g$,I=<($5$l$k!#(B

=========================== $B%W%m%;%94V%(%i!<(B ===========================
process(ProcPred) wrongly uses the lower layer

   ProcPred : $B2<@A%W%m%;%9$N;H$$J}$r8m$C$F$$$k%W%m%;%9$K4^$^$l$k(B
              $B=R8lL>$N%j%9%H(B
========================================================================

$B6K>.ItJ,=89g$K4^$^$l$k@)Ls$NI=<($O%W%m%;%9Fb$N>l9g$HF1MM$G$"$k$,!"$3$NNc(B
$B$G$O6K>.ItJ,=89gCf$+$i!"L7=b$N860x$H$7$F5?$o$7$$@)Ls$,8!=P$5$l$F$$$k!#5?(B
$B$o$7$$@)Ls$O!H(B!$B!I$r@hF,$KI=<($9$k$3$H$G6hJL$5$l$k!#(B

============================= $B5?$o$7$$@)Ls(B =============================
! ModeConst   (Rule) to "Symbol" at PredName/PredArity(PredNo)
========================================================================

$B$^$?$3$NNc$G$OFHN)$J6K>.ItJ,=89g(B2$B$D$,F@$i$l$F$$$k!#FHN)$J6K>.ItJ,=89gF1(B
$B;N$O!H(B------$B!I$G6h@Z$i$l$FI=<($5$l$k!#(B

$BFHN)$J6K>.ItJ,=89g$O!"$=$l$>$l$,0[$J$k8m$j$KBP1~$7$F$$$k>l9g$,B?$$!#$3$N(B
$B>l9g$O!"(B1$BHVL\$N=89g$,!"%Q%9(B <append-5/3,1> $B$r(B A$B$H$7$?8m$j$KBP1~$7!"(B2$BHVL\(B
$B$N=89g$,!"%Q%9(B <append-5/3,3> $B$r(B A1$B$H$7$?8m$j$KBP1~$7$F$$$k!#(B


$B#4!%(Bkima$B$N;H$$J}(B
$B!1!1!1!1!1!1!1!1(B
kima$B$GF@$i$l$?6K>.ItJ,=89g$+$i!"%W%m%0%i%`Cf$N%P%0$N2U=j$*$h$S860x$rFCDj(B
$B$9$k$3$H$,$G$-$k!#$3$l$i$rFCDj$9$k:]$K!"0J2<$N<j=g$K$7$?$,$C$F9T$&$3$H$G!"(B
$B$h$jB.$/%P%0$r8!=P$9$k$3$H$,$G$-$k!#(B

1. $B5?$o$7$$@)Ls$K$D$$$F0J2<$N<j=g$r9T$&(B

2. $B$=$NB>$N@)Ls$K$D$$$F0J2<$N<j=g$r9T$&(B

  (a) $B=$@50F$r8+$k(B

      $BC1$J$kJQ?tL>$N=q$-8m$j$J$i$P!"=$@50F$NCf$K@5$7$$=$@5$,B8:_$9$k2DG=(B
      $B@-$,$"$k!#FC$K!"=$@50F$N=q$-49$($kJQ?tL>$K8+47$l$J$$JQ?t$,$"$i$o$l(B
      $B$?>l9g!"$=$NJQ?t$K;w$?2?$+JL$NJQ?t$r=q$-8m$C$?2DG=@-$,9b$$!#(B

  (b) $B@)Ls$r2]$7$?5-9f!"@a$r8+$k(B

      $B$=$N@)Ls$,!"$I$N@a$N$I$N5-9f$+$i2]$5$l$?$b$N$G$"$k$+$r3NG'$7!"(B
      $B%=!<%9>e$N$=$N>l=j$,8m$C$F$$$J$$$+$rD4$Y$k!#(B

  (c) $B8m$j$NB8:_$7$?%W%m%;%9$r8+$k(B

      $B8m$C$F$$$k$HJ,$+$C$?%W%m%;%9$+$i%P%0$rC5$9!#(B

  (d) $B%b!<%I@)Ls<0$rD4$Y$k(B

      $B6K>.ItJ,=89g$,!"$I$&$$$&M}M3$GL7=b$7$F$$$k$+$rD4$Y$k!#L7=b860x$+$i!"(B
      $B$=$N$h$&$JL7=b$r0z$-5/$3$9%P%0$rA[Dj$9$k!#(B

$B4pK\E*$K!"%P%0$N2U=j$K4X$9$k>pJs$rMxMQ$9$k$3$H$r9M$($k!#%b!<%I$N@)Ls=89g(B
$B$rGD0.$7!"$=$l$+$i%P%0$rH/8+$9$k$3$H$O:$Fq$J>l9g$,B?$$$?$a!"2U=j$,$I$&$7(B
$B$F$bFCDj$G$-$J$$>l9g0J30$OF@:v$G$O$J$$!#(B
