BEM-II: Arithmetic Boolean Expression Manipulator (Sapporo$BHG(B)$B$N;HMQK!(B

1. $BBP>]5!<o$H5/F0K!(B
$BK\%W%m%0%i%`$O(B Linux OS$B$GF0:n$9$k!#!J(Bgcc, g++, bison, flex$B$r;HMQ!K(B
32$B%S%C%H7W;;5!$rA[Dj$7$F$$$k$,!"%3%s%Q%$%k%*%W%7%g%s@_Dj$K$h$j(B
64$B%S%C%H5!$K$bBP1~2DG=$G$"$k!JL$3NG'!K!#(B

$B%W%m%0%i%`$N5/F0J}K!$O!"(B
bemII [-$B:GBg(BBDD$B@aE@?t(B] [$B%U%!%$%kL>(B]
$B$G$"$k!#(B

$B5/F0;~$K%U%!%$%kL>$r;XDj$9$k$H%U%!(B$B%$%k$K=q$+$l$?L?Na$r<B9T$9$k!#%U%!%$(B
$B%kL>$r>J$/$HI8=`F~NO$+$iFI$_9~$`!#7W;;7k2L$OI8=`=PNO$K=PNO$5$l$k!#C<Kv(B
$BF~=PNO$K$h$k%$%s%?%W%j%?7A<0$NMxMQK!$H!"%U%!%$%kF~=PNO$K$h$k%U%#%k%?7A<0(B
$B$NMxMQK!$NN>J}$,2DG=$G$"$k!#(B

$BK\%W%m%0%i%`$G$O!"FbIt$G@8@.$9$k(BBDD $B%G!<%?(B($BLs(B 30 byte/node)$B$,<g5-21(B
$B$r$"$U$l$k$H=hM}8zN($,5^7c$KDc2<$9$k$?$a!"%^%7%s$N<g5-21%5%$%:$K1~$8$F(B
$B:GBg(BBDD$B@aE@?t$r;XDj$7!"$=$NHO0OFb$G5-214IM}$r9T$&!#!J>JN,CM$O(B400000$B!#!K(B
$B5-21NN0h$O!"5/F0;~$K:G>.8B3NJ]$5$l!"I,(B$BMW$K1~$8$F=y!9$K8B3&$^$G3HD%$5$l(B
$B$k!#7W;;Cf$K;XDj$7$?:GBg%N!<%I?t$KC#$7$?>l9g$O7W;;$rBG$A$-$j!"7Y9p%a%C(B
$B%;!<%8$r=PNO$9$k!J7W;;7k2L$O(B0$B$H$J$k!K!#(B

$B!JNc!K(B
bemII           $B%$%s%?%W%j%?%b!<%I$G5/F0(B
bemII script    $B%U%!%$%kL>(B script $B$K=q$+$l$?L?Na$r<B9T(B
bemII -100000   $B:GBg(BBDD$B@aE@?t(B 100000 $B$G5/F0(B


2. $BJQ?tL>!&?tCM(B
$BK\%W%m%0%i%`$G$O!"O@M}4X?t$NF~NOJQ?t$rI=$9!VO@M}JQ?t!W$H!"7W;;7k2L$r0l(B
$B;~E*$KJ];}$9$k5-21>l=j$r(B$BI=$9!V%W%m%0%i%`JQ?t!W$r;HMQ$9$k!#O@M}JQ?t$O1Q(B
$B>.J8;z$G;O$^$k1Q?t;zNs!"%W%m%0%i%`JQ?t$O1QBgJ8;z$G;O$^$k1Q?t;zNs$GI=$9!#(B
$B1Q?t;zNs$O:GBg(B255$BJ8;z$^$G$G!"#2J8;zL\0J9_$K%"%s%@!<%P!<$r4^$s$G$b$h(B
$B$$!#O@M}JQ?t$O:GBg(B65510$B8D$^$G;HMQ$G$-$k!#%W%m%0%i%`JQ?t$N8D?t$K@)Ls(B
$B$O$J$$!#(B

$B?tCM$O!"@0?t$@$1$r07$&!#DL>o$N(B10$B?J?t$NB>$K!"(B0x$B$G;O$^$k(B16$B?J?t!"(B0b$B$G;O$^(B
$B$k(B2$B?J?t$rF~NO$9$k$3$H$,$G$-$k!#?tCM$NHO0O$K@)8B$O$J$$$,!"(B100 bit $B$r1[$((B
$B$kBg$-$J?t$r07$&$H7W;;;~4V$,82Cx$KA}Bg$9$k!#(B

$B%3(B$B%^%s%I$NCf$G%U%!%$%kL>$r;XDj$9$k>l9g!"$*$h$SF~NO$7$?J8;zNs$r%(%3!<%P%C(B
$B%/$5$;$k$H$-$K$O!"N>C<$r0zMQId!V(B"$B!W$G0O$`!#(B

$B!JNc!K(B
$BO@M}JQ?t(B         a  b  x1  x2  bdd  a5A  f_t6
$B%W%m%0%i%`JQ?t(B   A  B  X1  X2  BDD  A5a  F_t6
$B?tCM!J(B10$B?J?t!K(B   0  29  32767  -213
$B?tCM!J(B16$B?J?t!K(B   0x1A  0xFFFF  0x0  -0x412
$B?tCM!J(B2$B?J?t!K(B    0b10110  0b110  0b0 -0b11101
$B%U%!%$%kL>(B       "a"  "b"  "script1.bem" 


3. $BL?Na$N9=@.(B
$BK\%W%m%0%i%`$O!"4pK\E*$K9TC10L!J#19T#1L?Na!K$GF0:n$9$k!##19T$KJ#?t8D$N(B
$BL?Na$r=q$/>l9g$O!"%;%_%3%m%s(B ; $B$G6h@Z$k!#J#?t9T$K$o$?$C$F#1L?Na$r=q(B
$B$/>l9g$O!"2~9T$ND>A0$K%P%C%/%9%i%C%7%e!V(B\$B!W$rCV$/!#J8Cf$K%7%c!<%W(B
$B!V(B#$B!W$r=q$/$H!"<!$N2~9T$^$G%3%a%s%H$H$7$FFI$_Ht$P$5$l$k!#(B

$B%W%m%0%i%`$N@)8f$K4X$9$kL?Na$H$7$F$O!"<!$N#3$D$,$"$k!#(B
    source $B%U%!%$%kL>(B   $B%U%!%$%k$K=q$+$l$?(B$BL?Na$r8F$S=P$7$F<B9T$9$k!#(B
    help $B$^$?$O(B ?       $B;HMQK!$rI=<($9$k!#(B
    quit $B$^$?$O(B exit    $B%W%m%0%i%`$r=*N;$9$k!#%U%!%$%k$N=*$j(B(EOF)$B$G$b=*N;!#(B

BEM-II$B$N7W;;$r<B9T$9$kL?Na$O!"<!$N#3<o$+$i$J$k!#(B
$B!&@k8@J8(B --- $B;HMQ$9$kO@M}JQ?t$NL>A0$H$=$N%3%9%H!"$*$h$SJQ?t=g=x$r@k8@$9$k!#(B
$B!&BeF~J8(B --- $B7W;;7k2L$r%W%m%0%i%`JQ?t$KBeF~$9$k!#(B
$B!&=PNOJ8(B --- $B7W;;7k2L$r<o!9$N7A<0$GI=<($9$k!#(B


4. $B@k8@J8(B
$B@k8@J8$O!";HMQ$9$kO@M}JQ?t$NL>A0$H(B$B=g=x$r$"$i$+$8$a@k8@$9$k$b$N$G$"$k!#(B

symbol [ $BO@M}JQ?tL>(B [ , $BO@M}JQ?tL>(B, ...] ]

$B6h@Z$j$N%3%s%^$O6uGr$G$b$h$$!#JQ?t$N=g=x$O!":8$+$i=g$K>e0L!J@h$KE83+$5(B
$B$l$k!K$KG[CV$5$l$k!#O@M}JQ?tL>$r#1$D$b=q$+$J$+$C$?>l9g$O!"8=:_;HMQCf$N(B
$BO@M}JQ?t$,0lMwI=<($5$l$k!#(B

$B$^$?!"O@M}JQ?t$K%3%9%H$r;XDj$9$k$3$H$,$G$-$k!#(B
symbol [ $BO@M}JQ?tL>(B($B%3%9%H(B) [ , $BO@M}JQ?tL>(B($B%3%9%H(B), ...] ]
$B>e5-$N%3%9%H$H$O!"(Bprint$BJ8$N(B /mincover, /mincost $B%9(B$B%$%C%A$N$H$-$K;HMQ$9(B
$B$k$b$N$G!"F~NOJQ?t$r#1$K$9$k$?$a$N%3%9%H$rI=$9!#K\%W%m%0%i%`$G$O!"O@M}(B
$B4X?t$N=<B-2r$rC5:w$9$k:]$K!"3FF~NOJQ?t$N%3%9%H$NAmOB$,:G>.$H$J$k$h$&$J(B
$B2r$r5a$a$k$3$H$,$G$-$k!#$J$*<BAu$NET9g>e!"%3%9%H$O(B32$B%S%C%H@0?t$H$7$F(B
$B7W;;$5$l!"$=$NHO0O$rD6$($k$H7e$"$U$lH/@8$9$k!#%3%9%H$N;XDj$r>JN,$7$?(B
$B>l9g$O!"(B1$B$,@_Dj$5$l$k!#(B

$B@k8@J8$OJ#?t2s$KJ,$1$F<B9T$7$F$b$h$$$,!"$=$N>l9g!"$"$H$K@k8@$5$l$?JQ?t(B
$B$,2<0L$KG[CV$5$l$k!#F1$8JQ?t$r#2EY@k8@$7$?>l9g$O!"JQ?t=g=x$OJQ$o$i$J$$$,!"(B
$B%3%9%H$N;X(B$BDj$O8e$N@k8@$NJ}$,M-8z$H$J$k!#(B

$B!JNc!K(B
symbol a, b, c
symbol b, d, e
$B$H$9$k$H!"(Ba b c d e$B$N=g$K$J$k!#(B

$B@k8@$7$F$$$J$$O@M}JQ?t$,;;=QO@M}<0$NCf$G;H$o$l$?>l9g$O!"$=$N>l$G?7$?$K(B
$B@k8@$7$?$b$N$H$7$F!":G2<0L$KDI2C$5$l$k!J7Y9p%a%C%;!<%8$,=P$k!K!#(B
$B!JNc!K(B
symbol a, b, c
print a & b & c & d
$B$H$9$k$H!"(Ba b c d$B$N=g$K$J$k!#(B


5. $BBeF~J8(B
$BBeF~J8$O!"1&JU$N;;=QO@M}<0$r7W;;$7!"F@$i$l$?@0?tCMO@M}4X?t$r:8(B$BJU$N%W%m%0%i%`(B
$BJQ?t$KBeF~$9$k$b$N$G$"$k!#(B

$B%W%m%0%i%`JQ?tL>(B = $B;;=QO@M}<0(B

$B%W%m%0%i%`JQ?tL>$O!"$"$i$+$8$a@k8@$9$kI,MW$O$J$$!#BeF~J8$N:8JU$K=i$a$F(B
$B8=$l$?;~E@$G!"5-21NN0h$,3NJ]$5$l$k!#%W%m%0%i%`JQ?t$N;HMQ8D?t$K@)8B$O$J(B
$B$$!#F1$8%W%m%0%i%`JQ?t$K=E$M$FBeF~$9$k$H!"0JA0$NFbMF$,>C5n$5$l$?8e$K!"(B
$B?7$7$$CM$,BeF~$5$l$k!#O@M}JQ?t$r:8JU$KCV$/$3$H$O$G$-$J$$!#$^$?!"BeF~$5(B
$B$l$?$3$H$N$J$$%W%m%0%i%`JQ?t$r1&JU$G;2>H$9$k$3$H$O$G$-$J$$!#(B

$B1&JU$N;;=QO@M}<0$NJ8K!$O!"(BC$B8@8l$K=`5r$7$F$$$k!#;HMQ$G$-(B$B$k1i;;;R$r!"<B9T(B
$BM%@h=g$K5s$2$k!#F1$89T$N1i;;;R$O:8M%@h$G$"$k!J(B ? : $B$@$1$O1&M%@h!K!#(B
      ( )
      [ ]
      !  ~  +  - $B!JC19`!K(B
      * / %                    
      +  - $B!JFs9`!K(B
      <<  >>
      <  <=  >  >=
      ==  !=
      &
      ^
      |
      ? :
      UpperBound( )  LowerBound( )

[ ]$B$O!"(BF[G] $B$H$7$?$H$-!"(BG = 0 $B$H$J$kF~NOAH9g$;$r(B don't care $B$H$_$J$7$?(B
$B$H$-$K!"(BF$B$r4JC12=$7$?4X?t$rJV$91i;;;R$G$"$k!#Nc$($P!"(BF[x]$B$H$9$k$H!"(B
x$B$K(B1$B$rBeF~$7$?$H$-$N(BF$B$rJV$9!#(B

$B!V(B!$B!W$OO@M}H]Dj1i;;;R$G$"$k!#(B!F $B$H$7$?$H$-!"(BF=0$B$H$J$kF~NOAH9g$;$KBP$7$F(B
1$B$rJV$7!"$=$l0J30$O(B0$B$rJV$9!#(B

$B!V(B~$B!W$O%S%C%HH?E>1i;;;R$G$"$k!#!V(B!$B!W$H$O0[$J$j!"(B~0$B$O(B-1$B$H$J$k!#(B

? : $B$OA*Br1i;;;R$G$"$k!#(BF? G: H$B$H$7$?$H$-!"(BF = 1$B$H$J$kF~NOAH9g(B$B$;$KBP$7$F$O(B
G$B$NCM$rJV$7!"(BF = 0$B$H$J$kF~NO$KBP$7$F$O(BH$B$rJV$9!#(B

$B!V(B/$B!W$O@0?t=|;;$N>&!J>/?tE@0J2<@Z<N$F!K!"!V(B%$B!W$O>jM>$rJV$9!#$"$kF~NOAH9g$;$K(B
$BBP$7$F!"=|?t$,(B0$B$K$J$k$h$&$J>l9g$,B8:_$9$k$H$-$K$O!"7Y9p%a%C%;!<%8$r=PNO$7!"(B
$B$=$NAH9g$;$KBP$7$F$OHo=|?t$r$=$N$^$^JV$9!#>&$,Ii$K$J$k>l9g$K$O>/?tE@0J2<$O!"(B
$B@dBPCM$,>.$5$$J}$KB7$($k!#(B

UpperBound(F)$B$O!"F~NOJQ?t$,$"$i$f$kAH9g$;$r$H$k$H$-$N!"(BF$B$N:GBgCM$rJV$9!#(B
LowerBound( ) $B$O:G>.CM$rJV$9!#(B

$B$=$NB>$N1i;;;R$O(B$B!"DL>o$N(BC$B8@8l$HF1MM$G$"$k!#(B

6. $B=PNOJ8(B
$B=PNOJ8$N7A<0$O<!$NDL$j$G$"$k!#(B

print [ /$B%9%$%C%A(B ] $B;;=QO@M}<0(B
print "$BJ8;zNs(B"

print$B$O(B $B!V(B?$B!W$GBeMQ$G$-$k!#%9%$%C%A$O=PNO7A<0$r;XDj$9$k$b$N$G!"(B
$B>JN,$7$?>l9g$O!"4X?t$K1~$8$FE,Ev$K8+$d$9$$7A<0$,A*Br$5$l$k!#(B
$B0zMQId!V(B"$B!W$G0O$s$@J8;zNs$O$=$N$^$^%(%3!<%P%C%/$5$l$k!#(B

$B0J2<$K!"8=:_;HMQ$G$-$k%9%$%C%A$H$=$N=PNO7A<0$r@bL@$9$k!#(B

   /bit         $BFbIt$N#2?J%Y%/%H%k$N3F%S%C%H$NO@M}4X?t$rHs>iD9@Q(B$BOB7A$GI=<(!#(B 
   /hex         $B7k2L$,Dj?t$N>l9g#1#6?J?t$GI=<(!#Dj?t$G$J$1$l$P(B/bit$B$HF1$8!#(B
   /map         $B%+%k%N!<?^$GI=<(!#F~NOJQ?t#68D$^$GI=<($G$-$k!#(B
   /rmap        $B%+%k%N!<?^$GI=<(!#>iD9$JF~NOJQ?t$O>J$$$FI=<(!#(B
   /case        $B>l9gJ,$1I=8=$GI=<(!#(B
   /asop        $B;;=Q@QOB7A$GI=<(!#(B
   /size        $B7W;;7k2L$N#B#D#D@aE@?t!J$*$h$S=hM}7OA4BN$N@aE@?t!K$rI=<(!#(B
   /count       $B=<B-2r$N8D?t$rI=<(!#(B
   /density     $B??M}CMI=G;EY!J=<B-2r$NB8:_3NN(!K$rI=<(!#(B
   /mincover    $B%3%9%H:G>.$N=<B-2r$rI=<(!#(B
   /mincost     $B%3%9%H:G>.$N=<B-2r$N%3%9%HCM$rI=<(!#(B
   /plot        $B#B#D#D$N7A$r?^<($9$k!#(B
   /plot0       $B#B#D#D$N7A$r?^<($9$k!JH]Dj;^IT;HMQ!K(B


7. $B<B9TNc(B
$B!Z%$%s%?%W%j%?%b!<%I![(B
% bemII
***** BEM-II Sapporo edition *****
> symbol a(3) b(2) c(4) d(1)
> Sum = a*3 + b*4 + c*5 - d*2
> print Sum
 +-: !a & !b & !c & d
  3: a & b & c | a & c & !d | !a & !b & !c & d | b & c & !d
  2: b ^ ( a & c & d | !a & c & !d | !a & !c & d )
  1: d ^ ( a & !c )
  0: a ^ c
> print /map Sum
 a b : c d
     |    00    01    11    10
  00 |     0    -2     3     5
  01 |     4     2     7     9
  11 |     7     5    10    12
  10 |     3     1     6     8
> print /case Sum
    12:  a & b & c & !d
    10:  a & b & c & d
     9:  !a & b & c & !d
     8:  a & !b & c & !d
     7:  a & b & !c & !d | !a & b & c & d
     6:  a & !b & c & d
     5:  a & b & !c & d | !a & !b & c & !d
     4:  !a & b & !c & !d
     2:  !a & b & !c & d
     1:  a & !b & !c & d
     0:  !a & !b & !c & !d
    -2:  !a & !b & !c & d
> print /asop Sum
 3 * a + 4 * b + 5 * c - 2 * d
> print UpperBound(Sum)
    12
> print Sum > 6
   a & b & !d | a & c & !d | b & c
> F = Sum > 6
> print /mincover F
<Positive>: a b
> print /mincost F
   5
> exit
%


$B!Z(B8-Queen$BLdBj![(B
$B!JF~NO5-=R!K(B
####### 8-Queen Problem #######
symbol a00 a10 a20 a30 a40 a50 a60 a70
symbol a01 a11 a21 a31 a41 a51 a61 a71
symbol a02 a12 a22 a32 a42 a52 a62 a72
symbol a03 a13 a23 a33 a43 a53 a63 a73
symbol a04 a14 a24 a34 a44 a54 a64 a74
symbol a05 a15 a25 a35 a45 a55 a65 a75
symbol a06 a16 a26 a36 a46 a56 a66 a76
symbol a07 a17 a27 a37 a47 a57 a67 a77

X0 = (a00 + a10 + a20 + a30 + a40 + a50 + a60 + a70 == 1)
X1 = (a01 + a11 + a21 + a31 + a41 + a51 + a61 + a71 == 1)
X2 = (a02 + a12 + a22 + a32 + a42 + a52 + a62 + a72 == 1)
X3 = (a03 + a13 + a23 + a33 + a43 + a53 + a63 + a73 == 1)
X4 = (a04 + a14 + a24 + a34 + a44 + a54 + a64 + a74 == 1)
X5 = (a05 + a15 + a25 + a35 + a45 + a55 + a65 + a75 == 1)
X6 = (a06 + a16 + a26 + a36 + a46 + a56 + a66 + a76 == 1)
X7 = (a07 + a17 + a27 + a37 + a47 + a57 + a67 + a77 == 1)

Y0 = (a00 + a01 + a02 + a03 + a04 + a05 + a06 + a07 == 1)
Y1 = (a10 + a11 + a12 + a13 + a14 + a15 + a16 + a17 == 1)
Y2 = (a20 + a21 + a22 + a23 + a24 + a25 + a26 + a27 == 1)
Y3 = (a30 + a31 + a32 + a33 + a34 + a35 + a36 + a37 == 1)
Y4 = (a40 + a41 + a42 + a43 + a44 + a45 + a46 + a47 == 1)
Y5 = (a50 + a51 + a52 + a53 + a54 + a55 + a56 + a57 == 1)
Y6 = (a60 + a61 + a62 + a63 + a64 + a65 + a66 + a67 == 1)
Y7 = (a70 + a71 + a72 + a73 + a74 + a75 + a76 + a77 == 1)

Z1 = (a10 + a01 < 2)
Z2 = (a20 + a11 + a02 < 2)
Z3 = (a30 + a21 + a12 + a03 < 2)
Z4 = (a40 + a31 + a22 + a13 + a04 < 2)
Z5 = (a50 + a41 + a32 + a23 + a14 + a05 < 2)
Z6 = (a60 + a51 + a42 + a33 + a24 + a15 + a06 < 2)
Z7 = (a70 + a61 + a52 + a43 + a34 + a25 + a16 + a07 < 2)
Z8 = (a71 + a62 + a53 + a44 + a35 + a26 + a17 < 2)
Z9 = (a72 + a63 + a54 + a45 + a36 + a27 < 2)
Za = (a73 + a64 + a55 + a46 + a37 < 2)
Zb = (a74 + a65 + a56 + a47 < 2)
Zc = (a75 + a66 + a57 < 2)
Zd = (a76 + a67 < 2)

W1 = (a06 + a17 < 2)
W2 = (a05 + a16 + a27 < 2)
W3 = (a04 + a15 + a26 + a37 < 2)
W4 = (a03 + a14 + a25 + a36 + a47 < 2)
W5 = (a02 + a13 + a24 + a35 + a46 + a57 < 2)
W6 = (a01 + a12 + a23 + a34 + a45 + a56 + a67 < 2)
W7 = (a00 + a11 + a22 + a33 + a44 + a55 + a66 + a77 < 2)
W8 = (a10 + a21 + a32 + a43 + a54 + a65 + a76 < 2)
W9 = (a20 + a31 + a42 + a53 + a64 + a75 < 2)
Wa = (a30 + a41 + a52 + a63 + a74 < 2)
Wb = (a40 + a51 + a62 + a73 < 2)
Wc = (a50 + a61 + a72 < 2)
Wd = (a60 + a71 < 2)

C = 1
C = C & X0 & X1 & X2 & X3 & X4 & X5 & X6 & X7
C = C & Y0 & Y1 & Y2 & Y3 & Y4 & Y5 & Y6 & Y7
C = C & Z1 & Z2 & Z3 & Z4 & Z5 & Z6 & Z7 & Z8 & Z9 & Za & Zb & Zc & Zd
C = C & W1 & W2 & W3 & W4 & W5 & W6 & W7 & W8 & W9 & Wa & Wb & Wc & Wd

print /size C
print /count C
print /mincover C

$B!J<B9T7k2L!K(B
% bemII queen8.bem
   2450 (3014)
   92
<Positive>: a77 a36 a05 a24 a53 a12 a61 a40
%


$B!Z(BSUBSET SUM$BLdBj![(B
$B!JF~NO5-=R!K(B
##### SUBSET-SUM Problem #####
symbol a b c d e f

Sum = 2*a + 3*b + 4*c + 3*d + 5*e + 6*f
print /map Sum

S = Sum * (Sum <10)
print /map S

C = UpperBound(S)
print C
print (C == S)

$B!J<B9T7k2L!K(B
% bemII subsetsum.bem
 a b c : d e f
     |   000   001   011   010 |   110   111   101   100
 000 |     0     6    11     5 |     8    14     9     3
 001 |     4    10    15     9 |    12    18    13     7
 011 |     7    13    18    12 |    15    21    16    10
 010 |     3     9    14     8 |    11    17    12     6
     |                         |
 110 |     5    11    16    10 |    13    19    14     8
 111 |     9    15    20    14 |    17    23    18    12
 101 |     6    12    17    11 |    14    20    15     9
 100 |     2     8    13     7 |    10    16    11     5
 a b c : d e f
     |   000   001   011   010 |   110   111   101   100
 000 |     0     6     0     5 |     8     0     9     3
 001 |     4     0     0     9 |     0     0     0     7
 011 |     7     0     0     0 |     0     0     0     0
 010 |     3     9     0     8 |     0     0     0     6
     |                         |
 110 |     5     0     0     0 |     0     0     0     8
 111 |     9     0     0     0 |     0     0     0     0
 101 |     6     0     0     0 |     0     0     0     9
 100 |     2     8     0     7 |     0     0     0     5
     9
 a & b & c & !d & !e & !f | a & !b & c & d & !e & !f | !a & b & !c & !d &
    !e & f | !a & !b & c & !d & e & !f | !a & !b & !c & d & !e & f


$B!Z:G>.LZLdBj![(B
$B!JF~NO5-=R!K(B
# Minimum-Tree Problem
# Node: A1, A2, A3, A4, A5, A6, A7
# Edge: a:(A1, A2)
#       b:(A1, A3)
#       c:(A2, A3)
#       d:(A2, A4)
#       e:(A3, A4)
#       f:(A2, A5)
#       g:(A3, A6)
#       h:(A4, A5)
#       i:(A4, A6)
#       j:(A5, A6)
#       k:(A5, A7)

symbol a(3) b(4) c(5) d(2) e(3) f(3) g(2) h(1) i(2) j(3) k(4)

A1 = 1
A2 = 0
A3 = 0
A4 = 0
A5 = 0
A6 = 0
A7 = 0

A1 = A1 | (a & A2) | (b & A3)
A2 = A2 | (a & A1) | (c & A3) | (d & A4) | (f & A5)
A3 = A3 | (b & A1) | (c & A2) | (e & A4) | (g & A6)
A4 = A4 | (d & A2) | (e & A3) | (h & A5) | (i & A6)
A5 = A5 | (f & A2) | (h & A4) | (j & A6) | (k & A7)
A6 = A6 | (g & A3) | (i & A4) | (j & A5)
A7 = A7 | (k & A5)

A1 = A1 | (a & A2) | (b & A3)
A2 = A2 | (a & A1) | (c & A3) | (d & A4) | (f & A5)
A3 = A3 | (b & A1) | (c & A2) | (e & A4) | (g & A6)
A4 = A4 | (d & A2) | (e & A3) | (h & A5) | (i & A6)
A5 = A5 | (f & A2) | (h & A4) | (j & A6) | (k & A7)
A6 = A6 | (g & A3) | (i & A4) | (j & A5)
A7 = A7 | (k & A5)

A1 = A1 | (a & A2) | (b & A3)
A2 = A2 | (a & A1) | (c & A3) | (d & A4) | (f & A5)
A3 = A3 | (b & A1) | (c & A2) | (e & A4) | (g & A6)
A4 = A4 | (d & A2) | (e & A3) | (h & A5) | (i & A6)
A5 = A5 | (f & A2) | (h & A4) | (j & A6) | (k & A7)
A6 = A6 | (g & A3) | (i & A4) | (j & A5)
A7 = A7 | (k & A5)

A1 = A1 | (a & A2) | (b & A3)
A2 = A2 | (a & A1) | (c & A3) | (d & A4) | (f & A5)
A3 = A3 | (b & A1) | (c & A2) | (e & A4) | (g & A6)
A4 = A4 | (d & A2) | (e & A3) | (h & A5) | (i & A6)
A5 = A5 | (f & A2) | (h & A4) | (j & A6) | (k & A7)
A6 = A6 | (g & A3) | (i & A4) | (j & A5)
A7 = A7 | (k & A5)

A1 = A1 | (a & A2) | (b & A3)
A2 = A2 | (a & A1) | (c & A3) | (d & A4) | (f & A5)
A3 = A3 | (b & A1) | (c & A2) | (e & A4) | (g & A6)
A4 = A4 | (d & A2) | (e & A3) | (h & A5) | (i & A6)
A5 = A5 | (f & A2) | (h & A4) | (j & A6) | (k & A7)
A6 = A6 | (g & A3) | (i & A4) | (j & A5)
A7 = A7 | (k & A5)

A1 = A1 | (a & A2) | (b & A3)
A2 = A2 | (a & A1) | (c & A3) | (d & A4) | (f & A5)
A3 = A3 | (b & A1) | (c & A2) | (e & A4) | (g & A6)
A4 = A4 | (d & A2) | (e & A3) | (h & A5) | (i & A6)
A5 = A5 | (f & A2) | (h & A4) | (j & A6) | (k & A7)
A6 = A6 | (g & A3) | (i & A4) | (j & A5)
A7 = A7 | (k & A5)

A1 = A1 | (a & A2) | (b & A3)
A2 = A2 | (a & A1) | (c & A3) | (d & A4) | (f & A5)
A3 = A3 | (b & A1) | (c & A2) | (e & A4) | (g & A6)
A4 = A4 | (d & A2) | (e & A3) | (h & A5) | (i & A6)
A5 = A5 | (f & A2) | (h & A4) | (j & A6) | (k & A7)
A6 = A6 | (g & A3) | (i & A4) | (j & A5)
A7 = A7 | (k & A5)

C = A1 & A2 & A3 & A4 & A5 & A6 & A7

print C
print /size C
print /count C
print /mincover C

$B!J<B9T7k2L!K(B
% bemII subsetsum.bem
 a & b & d & f & g & k | a & b & d & f & i & k | a & b & d & f & j & k |
    a & b & d & g & h & k | a & b & d & g & j & k | a & b & d & h & i & k |
    a & b & d & h & j & k | a & b & d & i & j & k | a & b & e & f & g & k |
    a & b & e & f & i & k | a & b & e & f & j & k | a & b & e & g & h & k |
    a & b & e & g & j & k | a & b & e & h & i & k | a & b & e & h & j & k |
    a & b & e & i & j & k | a & b & f & g & h & k | a & b & f & g & i & k |
    a & b & f & h & i & k | a & b & f & h & j & k | a & b & f & i & j & k |
    a & b & g & h & i & k | a & b & g & h & j & k | a & b & g & i & j & k |
    a & c & d & f & g & k | a & c & d & f & i & k | a & c & d & f & j & k |
    a & c & d & g & h & k | a & c & d & g & j & k | a & c & d & h & i & k |
    a & c & d & h & j & k | a & c & d & i & j & k | a & c & e & f & g & k |
    a & c & e & f & i & k | a & c & e & f & j & k | a & c & e & g & h & k |
    a & c & e & g & j & k | a & c & e & h & i & k | a & c & e & h & j & k |
    a & c & e & i & j & k | a & c & f & g & h & k | a & c & f & g & i & k |
    a & c & f & h & i & k | a & c & f & h & j & k | a & c & f & i & j & k |
    a & c & g & h & i & k | a & c & g & h & j & k | a & c & g & i & j & k |
    a & d & e & f & g & k | a & d & e & f & i & k | a & d & e & f & j & k |
    a & d & e & g & h & k | a & d & e & g & j & k | a & d & e & h & i & k |
    a & d & e & h & j & k | a & d & e & i & j & k | a & d & f & g & i & k |
    a & d & f & g & j & k | a & d & g & h & i & k | a & d & g & h & j & k |
    a & d & g & i & j & k | a & e & f & g & h & k | a & e & f & g & j & k |
    a & e & f & h & i & k | a & e & f & h & j & k | a & e & f & i & j & k |
    a & f & g & h & i & k | a & f & g & h & j & k | a & f & g & i & j & k |
    b & c & d & f & g & k | b & c & d & f & i & k | b & c & d & f & j & k |
    b & c & d & g & h & k | b & c & d & g & j & k | b & c & d & h & i & k |
    b & c & d & h & j & k | b & c & d & i & j & k | b & c & e & f & g & k |
    b & c & e & f & i & k | b & c & e & f & j & k | b & c & e & g & h & k |
    b & c & e & g & j & k | b & c & e & h & i & k | b & c & e & h & j & k |
    b & c & e & i & j & k | b & c & f & g & h & k | b & c & f & g & i & k |
    b & c & f & h & i & k | b & c & f & h & j & k | b & c & f & i & j & k |
    b & c & g & h & i & k | b & c & g & h & j & k | b & c & g & i & j & k |
    b & d & e & f & g & k | b & d & e & f & i & k | b & d & e & f & j & k |
    b & d & e & g & h & k | b & d & e & g & j & k | b & d & e & h & i & k |
    b & d & e & h & j & k | b & d & e & i & j & k | b & d & f & g & i & k |
    b & d & f & g & j & k | b & d & g & h & i & k | b & d & g & h & j & k |
    b & d & g & i & j & k | b & e & f & g & h & k | b & e & f & g & j & k |
    b & e & f & h & i & k | b & e & f & h & j & k | b & e & f & i & j & k |
    b & f & g & h & i & k | b & f & g & h & j & k | b & f & g & i & j & k
   27 (159)
   508
<Positive>: a d g h i k 
%



8. $BK\%W%m%0%i%`$NL?NaJ8K!(B
$BK\%W%m%0%i%`$,<uM}$9$kL?Na$NJ8K!$r!"(Byacc $B$K=`$:$k5-K!$G<($9!#(B
bem
        : lines
        : lines exit
        ;
exit
        : "exit\n"
        : "quit\n"
        ;
lines
        : lines commands "\n"
        | lines "source" STRINGS
        ;
commands
        : commands ";" command
        | command
        ;
command
        : /* empty */
        | help
        | define
        | assign
        | output
        ;
help
        : "help"
        | "?"
        ;
define
        : "symbol" symbols
        | "symbol"
        ;
symbols
        : SYMNAME comma symbols
        | SYMNAME
        | SYMNAME "(" NUMBER ")" comma symbols
        | SYMNAME "(" NUMBER ")
        ;
comma
        : ","
        | /* empty */
        ;
assign
        : VARNAME "=" expression
        ;
expression
        : "(" expression ")"
        | SYMNAME
        | VARNAME
        | NUMBER
        | expression "[" expression "]"
        | expression "?" expression ":" expression
        | expression "+" expression
        | expression "-" expression
        | expression "*" expression
        | expression "/" expression
        | expression "%" expression
        | expression "&" expression
        | expression "|" expression
        | expression "^" expression
        | expression "==" expression
        | expression "!=" expression
        | expression ">" expression
        | expression ">=" expression
        | expression "<" expression
        | expression "<=" expression
        | expression "<<" expression
        | expression ">>" expression
        | "~" expression
        | "!" expression
        | "-" expression
        | "+" expression
        | "UpperBound" "(" expression ")"
        | "LowerBound" "(" expression ")"
        ;
output
        : print expression
        | print switch expression
        | print STRINGS
        ;
print
        : "print"
        | "?"
        ;
switch
        | "/hex"
        | "/bit"
        | "/map"
        | "/case"
        | "/asop"
        | "/rmap"
        | "/size"
        | "/density"
        | "/count"
        | "/mincover"
        | "/mincost"
        | "/plot"
        ;
SYMNAME
        :  [a-z][a-zA-Z0-9_]*
        ;
VARNAME
        :  [A-Z][a-zA-Z0-9_]*
        ;
NUMBER 
        :  [0-9]+
        |  0[xX][0-9a-fA-F]+
        |  0[bB][0-1]+
        ;

STRINGS
        :  \"[^\"^\n]+\"
        ;

$B0J>e!#(B
