function M = randpt(alf,minidlen,maxidlen,minnumids,maxnumids) % outputs a random piecewise-testable language % by computing a random boolean function of random shuffle ideals % minidlen = minimal ideal length % maxidlen = maximal ideal length (smaller => simpler language) % minnumids = minimal total of ideals in the number boolean expression % maxnumids) = maximal number of ideals (smaller => simpler language) S = {}; MM = {}; numids = round(randinseg(minnumids,maxnumids)); for i=1:numids %u = get_datum_unique(alf,minidlen,maxidlen,S); u = get_datum(alf,minidlen,maxidlen,S); S{i} = u; %if isempty(u) % u = '@'; %end fprintf('processing U = %s \n',u); %MM{i} = bool2fsa_pt(['(' u ')'],alf); MM{i} = shuf2dfsa(u,alf); end ii = randperm(numids); ii=ii(:)'; M = MM{ii(1)}; if flip M = negate_fsa(M); end for i=ii(2:end) Mi = MM{i}; if flip Mi = negate_fsa(Mi); end if flip M = union_dfsa(M,Mi); else M = intersect_dfsa(M,Mi); end end return function r = randinseg(a,b) r = rand*(b-a) + a; return function b=flip b = round(rand); return function x = get_datum(alf,minidlen,maxidlen,PREV) good = 0; na = length(alf); n = round(randinseg(minidlen,maxidlen)); x = alf(ceil(rand(1,n)*na)); return function x = get_datum_unique(alf,minidlen,maxidlen,PREV) good = 0; na = length(alf); cnt = 1; while ~good n = round(randinseg(minidlen,maxidlen)); x = alf(ceil(rand(1,n)*na)); good = isempty(strmatch(x,PREV,'exact')); cnt = cnt + 1; if cnt > 1000 'count too high' keyboard end end return