fun conv([])=[] |
conv((l,v)::l1)=if v=0 then conv(l1) else l::conv(l1);
fun el(x,[])=false |
el(x,l::l1)=if (x=l) then true else el(x,l1);
fun add([],l1)=l1 |
add(x::l,l1)=if el(x,l1) then add(l,l1) else x::add(l,l1);
fun del1(x,[])=[] |
del1(x,l::l2)=if x=l then del1(x,l2) else l::del1(x,l2);
fun del([],a)=a |
del(x::l,a)=del1(x,del(l,a));
fun d([],[])=[] |
d(v1::l1,v2::l2)=if (v1=v2) then v1::d(l1,l2) else 2::d(l1,l2);
fun dif([],[])=0 |
dif(v1::l1,v2::l2)=if (v1=v2) then dif(l1,l2) else 1+dif(l1,l2);
fun dif1(l1,l2)=if dif(l1,l2)=1 then d(l1,l2) else [];
fun check(m,[])=[] |
check(m,m1::l1)=let val c=dif1(m,m1)in if c=[] then check(m,l1) else
c::check(m,l1) end;
fun fr([])=([]) |
fr(m::l)=let val b=check(m,l)in if b=[]
then fr(l)
else( add(b,fr(l))) end;
fun s(x,[])=false |
s(x,m::l)=(dif(x,m)=1) orelse s(x,l);
fun fr2([],m2)=[] |
fr2(x::l,m2)=if s(x,m2) then fr2(l,m2) else x::fr2(l,m2);
fun QMC1([],p)=p |
QMC1(m,p)=let val a=fr(m) in QMC1(a,p@fr2(m,a)) end;
fun eval([],[])= 1 |
eval(v::l1,m::l2)=if (((v=0) andalso (m=1)) orelse ((v=1) andalso (m=0))) then 0 else eval(l1,l2);
fun zero([],m)=true |
zero(p::l,m)= eval(p,m)=0 andalso zero(l,m);
fun del2(x,a::b)=if (x=a) then b else a::del2(x,b);
fun ness1(x,p,[])=true |
ness1(x,p,m::l)= if (eval(x,m)=0) then ness1(x,p,l) else (zero(del2(x,p),m)=false) andalso ness1(x,p,l);
fun ness([],p,m)= [] |
ness(x::l,p,m)=if ness1(x,p,m) then x else ness(l,p,m);
fun QMC2(p,m)=let val x=ness(p,p,m) in if x=[] then p else QMC2(del2(x,p),m) end;
fun QMCt(x)=let val a=conv(x) in QMC2(QMC1(a,[]),a) end;
fun cs([],n)="" |
cs(x::y,n)=if x=1 then "x"^Int.toString(n)^cs(y,n+1) else if x=0 then "(-x"^Int.toString(n)^")"^cs(y,n+1) else cs(y,n+1);
fun st([])="0"|
st(x::[])=cs(x,1) |
st(x::y)=cs(x,1)^"+"^st(y);
fun QMC(x)=let val a=st(QMCt(x)) in if a="" then "1" else a end;
use "C:\\Program Files\\sml\\src\\smlnj-lib\\Util\\lib-base-sig.sml";
use "C:\\Program Files\\sml\\src\\smlnj-lib\\Util\\lib-base.sml";
use "C:\\Program Files\\sml\\src\\smlnj-lib\\Util\\random-sig.sml";
use "C:\\Program Files\\sml\\src\\smlnj-lib\\Util\\random.sml";
fun add1([])=[] |
add1(x::l)=[x@[0]]@[x@[1]]@add1(l);
fun gen(0)=[] |
gen(1)=[[0],[1]] |
gen(n)=add1(gen(n-1));
fun atv([],n)=[] |
atv(l::l1,n)=((l, 0)::atv(l1,n+1);
fun grbf(n)=atv(gen(n),0); (*random boolean function generator*)