// ZeroLevel.txt



// составит алгоритм поиска по таблице.
var ZeroLevel(sys){
	if(!isset(sys->namesinput))sys->namesinput={"input"};
	if(!isset(sys->namesoutput))sys->namesoutput={"output"};
	nameinput=sys->namesinput;
	if(typeof(nameinput)=="vector")nameinput=nameinput[0];
	nameoutput=sys->namesoutput;
	if(typeof(nameoutput)=="vector")nameoutput=nameoutput[0];
	uniqueinputs=(vector)(set)sys->inputs;
	povtorimo=sys->inputs-uniqueinputs;
	textprogram=uniqueinputs.export();
	P=PROGRAM(textprogram);
	if(typeof(P)=="program"){
		textprogram="A="+textprogram+";";
		}else{
		textprogram="A={};";
		trace("Немогу составить список входных значкний в "+getThisFunctionName().export());
		return;
		}
	foroutputs={};
	table=(map)0;
	for(i=0;i<uniqueinputs.size();++i){
		index=sys->inputs.find(uniqueinputs[i]);
		t=sys->outputs[index];
		if(povtorimo.find(uniqueinputs[i])>=0){
			t=#;
			m=sys->inputs.findAll(uniqueinputs[i]);
			table[i]=m;
			}
		foroutputs.push(t);
		}
	text2=foroutputs.export();
	P=PROGRAM(text2);
	if(typeof(P)=="program"){
		text2="B="+text2+";";
		}else{
		text2="B={};";
		trace("Немогу составить список входных значкний в "+getThisFunctionName().export());
		return;
		}
	textprogram+="i=A.find("+nameinput+");";
	textprogram+=text2;
	textprogram+="output=B[i];";
	keys=table.getKeys();
	for(i=0;i<keys.size();++i){
		x=keys[i];
		massiv=(set)0;
		for(j=0;j<table[x].size();++j)massiv.insert(sys->outputs[table[x][j]]);
		textprogram+="if(i=="+x+")output="+massiv.export()+"[#];";
		}
	Xfunct={
		name:(*sys)["имя программы"],
		text:textprogram,
		inputnames:sys->namesinput,
		outputnames:nameoutput};
	sys->functions.push(Xfunct);
}





void ControlCreateFunctions(sys){
	for(i=0;i<sys->functions.size();++i){
		FX=&sys->functions[i];
		if(typeof(FX->f)!="function"){
			P=FX->program;
			if(typeof(P)!="program"){
				textprogram=FX->text+";";
				outname=FX->outputnames;
				if(isset(outname)){
					if(typeof(outname)=="string")textprogram+="return "+outname+";";
					}
				P=PROGRAM(textprogram);
				}
			FX->f=P.toFunction();
			}
		FX->f.setName(FX->name);
		FX->f.setNamesStart(FX->inputnames);
		}
}




string getListProgram(sys){
	ControlCorrectSys(sys);
	ControlCreateFunctions(sys);
	textprogram="";
	for(i=0;i<sys->functions.size();++i){
		FX=&sys->functions[i];
		if(!isset(FX->f))continue;
		if(textprogram!="")textprogram+="\n\n";
		textprogram+=FX->f.exportText();
		}
	if(textprogram=="")textprogram="Нет программы.";
	return textprogram;
}
