// ZeroLevel.code




var ZeroLevel(var 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);
	i=0;
	for(;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();
	i=0;
	for(;i<keys.size();++i){
		x=keys[i];
		massiv=((set)0);
		j=0;
		for(;j<table[x].size();++j)massiv.insert((sys->outputs)[table[x][j]]);
		textprogram+="if(i=="+x+")output="+massiv.export()+"[#];";
		}
	Xfunct={inputnames:sys->namesinput,name:(*sys)["имя программы"],outputnames:nameoutput,text:textprogram};
	sys->functions.push(Xfunct);
}



void ControlCreateFunctions(var sys){
	i=0;
	for(;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(var sys){
	ControlCorrectSys(sys);
	ControlCreateFunctions(sys);
	textprogram="";
	i=0;
	for(;i<sys->functions.size();++i){
		FX= &(sys->functions)[i];
		if(!isset(FX->f));else {
			if(textprogram!="")textprogram+="\n\n";
			textprogram+=FX->f.exportText();
			}
		}
	if(textprogram=="")textprogram="Нет программы.";
	return textprogram;
}


// ZeroLevel.code	:-|