fun trace_string(m,str)=let val (bs,cs,rs)=(String.concat(m),String.size(List.hd(m)),List.length(m)) val az=cs*rs fun at(f)=Array.tabulate(az,f) fun cib(c,r)=c>=0 andalso r>=0 andalso c(c+cd,r+rd))ncd fun nf(c,r)=map cti(List.filter cib(pno(c,r))) val nbs=at(fn(i)=>nf(itc(i))) fun son(a,nb)=List.foldl(fn(n,s)=>Array.sub(a,n)+s) 0 nb; fun cv(a,i,chr,f)=if String.sub(bs,i)=chr then f+son(a,Array.sub(nbs,i))else 0 fun wp(a,[],_)=Array.foldl(op +)0 a|wp(a,c::cs,f)=wp(at(fn(i)=>(cv(a,i,c,f))),cs,0) in wp(Array.array(az,0),explode(str),1) end;