private static Pair<MSOFormula<BoolExpr>, List<BoolExpr>> GenerateMSOFormula(int maxVarIndex) { int randomNumber = random.Next(0, 8); size--; if (size <= 0) { int variable = random.Next(0, maxVarIndex-1); BoolExpr b = GeneratePredicateOut(200); List<BoolExpr> l = new List<BoolExpr>(); l.Add(b); return new Pair<MSOFormula<BoolExpr>, List<BoolExpr>>(new MSOPredicate<BoolExpr>(b, new Variable("x"+variable, true)), l); } switch (randomNumber) { case 0: { Pair<MSOFormula<BoolExpr>, List<BoolExpr>> phi1 = GenerateMSOFormula(maxVarIndex + 1); MSOFormula<BoolExpr> phi = new MSOExists<BoolExpr>(new Variable("x"+maxVarIndex, true), phi1.First); return new Pair<MSOFormula<BoolExpr>, List<BoolExpr>>(phi, phi1.Second); } case 1: { Pair<MSOFormula<BoolExpr>, List<BoolExpr>> phi1 = GenerateMSOFormula(maxVarIndex + 1); MSOFormula<BoolExpr> phi = new MSOForall<BoolExpr>(new Variable("x" + maxVarIndex, true), phi1.First); return new Pair<MSOFormula<BoolExpr>, List<BoolExpr>>(phi, phi1.Second); } case 2: case 3: { Pair<MSOFormula<BoolExpr>, List<BoolExpr>> phi1 = GenerateMSOFormula(maxVarIndex); Pair<MSOFormula<BoolExpr>, List<BoolExpr>> phi2 = GenerateMSOFormula(maxVarIndex); MSOFormula<BoolExpr> phi = new MSOAnd<BoolExpr>(phi1.First, phi2.First); return new Pair<MSOFormula<BoolExpr>, List<BoolExpr>>(phi, new List<BoolExpr>(phi1.Second.Union(phi2.Second))); } case 4: case 5: { Pair<MSOFormula<BoolExpr>, List<BoolExpr>> phi1 = GenerateMSOFormula(maxVarIndex); Pair<MSOFormula<BoolExpr>, List<BoolExpr>> phi2 = GenerateMSOFormula(maxVarIndex); MSOFormula<BoolExpr> phi = new MSOOr<BoolExpr>(phi1.First, phi2.First); return new Pair<MSOFormula<BoolExpr>, List<BoolExpr>>(phi, new List<BoolExpr>(phi1.Second.Union(phi2.Second))); } case 6: { Pair<MSOFormula<BoolExpr>, List<BoolExpr>> phi1 = GenerateMSOFormula(maxVarIndex); MSOFormula<BoolExpr> phi = new MSONot<BoolExpr>(phi1.First); return new Pair<MSOFormula<BoolExpr>, List<BoolExpr>>(phi, phi1.Second); } case 7: { if (maxVarIndex > 1) { int variable1 = random.Next(0, maxVarIndex - 1); int variable2 = random.Next(0, maxVarIndex - 1); if (variable1 == variable2) { if (variable1 == maxVarIndex - 1) variable1 = variable1 - 1; else variable2 = variable2 + 1; } //Successor MSOFormula<BoolExpr> phi = new MSOSuccN<BoolExpr>(varOf(variable1),varOf(variable2),random.Next(1,4)); return new Pair<MSOFormula<BoolExpr>, List<BoolExpr>>(phi, new List<BoolExpr>()); } else { int variable = random.Next(0, maxVarIndex - 1); BoolExpr b = GeneratePredicate(); List<BoolExpr> l = new List<BoolExpr>(); l.Add(b); return new Pair<MSOFormula<BoolExpr>, List<BoolExpr>>(new MSOPredicate<BoolExpr>(b, new Variable("x" + variable, true)), l); } } case 8: { int variable1 = random.Next(0, maxVarIndex - 1); int variable2 = random.Next(0, maxVarIndex - 1); //less than MSOFormula<BoolExpr> phi = new MSOLe<BoolExpr>(varOf(variable1), varOf(variable2)); return new Pair<MSOFormula<BoolExpr>, List<BoolExpr>>(phi, new List<BoolExpr>()); } } return null; }
private static Pair <MSOFormula <BoolExpr>, List <BoolExpr> > GenerateMSOFormula(int maxVarIndex) { int randomNumber = random.Next(0, 8); size--; if (size <= 0) { int variable = random.Next(0, maxVarIndex - 1); BoolExpr b = GeneratePredicateOut(200); List <BoolExpr> l = new List <BoolExpr>(); l.Add(b); return(new Pair <MSOFormula <BoolExpr>, List <BoolExpr> >(new MSOPredicate <BoolExpr>(b, new Variable("x" + variable, true)), l)); } switch (randomNumber) { case 0: { Pair <MSOFormula <BoolExpr>, List <BoolExpr> > phi1 = GenerateMSOFormula(maxVarIndex + 1); MSOFormula <BoolExpr> phi = new MSOExists <BoolExpr>(new Variable("x" + maxVarIndex, true), phi1.First); return(new Pair <MSOFormula <BoolExpr>, List <BoolExpr> >(phi, phi1.Second)); } case 1: { Pair <MSOFormula <BoolExpr>, List <BoolExpr> > phi1 = GenerateMSOFormula(maxVarIndex + 1); MSOFormula <BoolExpr> phi = new MSOForall <BoolExpr>(new Variable("x" + maxVarIndex, true), phi1.First); return(new Pair <MSOFormula <BoolExpr>, List <BoolExpr> >(phi, phi1.Second)); } case 2: case 3: { Pair <MSOFormula <BoolExpr>, List <BoolExpr> > phi1 = GenerateMSOFormula(maxVarIndex); Pair <MSOFormula <BoolExpr>, List <BoolExpr> > phi2 = GenerateMSOFormula(maxVarIndex); MSOFormula <BoolExpr> phi = new MSOAnd <BoolExpr>(phi1.First, phi2.First); return(new Pair <MSOFormula <BoolExpr>, List <BoolExpr> >(phi, new List <BoolExpr>(phi1.Second.Union(phi2.Second)))); } case 4: case 5: { Pair <MSOFormula <BoolExpr>, List <BoolExpr> > phi1 = GenerateMSOFormula(maxVarIndex); Pair <MSOFormula <BoolExpr>, List <BoolExpr> > phi2 = GenerateMSOFormula(maxVarIndex); MSOFormula <BoolExpr> phi = new MSOOr <BoolExpr>(phi1.First, phi2.First); return(new Pair <MSOFormula <BoolExpr>, List <BoolExpr> >(phi, new List <BoolExpr>(phi1.Second.Union(phi2.Second)))); } case 6: { Pair <MSOFormula <BoolExpr>, List <BoolExpr> > phi1 = GenerateMSOFormula(maxVarIndex); MSOFormula <BoolExpr> phi = new MSONot <BoolExpr>(phi1.First); return(new Pair <MSOFormula <BoolExpr>, List <BoolExpr> >(phi, phi1.Second)); } case 7: { if (maxVarIndex > 1) { int variable1 = random.Next(0, maxVarIndex - 1); int variable2 = random.Next(0, maxVarIndex - 1); if (variable1 == variable2) { if (variable1 == maxVarIndex - 1) { variable1 = variable1 - 1; } else { variable2 = variable2 + 1; } } //Successor MSOFormula <BoolExpr> phi = new MSOSuccN <BoolExpr>(varOf(variable1), varOf(variable2), random.Next(1, 4)); return(new Pair <MSOFormula <BoolExpr>, List <BoolExpr> >(phi, new List <BoolExpr>())); } else { int variable = random.Next(0, maxVarIndex - 1); BoolExpr b = GeneratePredicate(); List <BoolExpr> l = new List <BoolExpr>(); l.Add(b); return(new Pair <MSOFormula <BoolExpr>, List <BoolExpr> >(new MSOPredicate <BoolExpr>(b, new Variable("x" + variable, true)), l)); } } case 8: { int variable1 = random.Next(0, maxVarIndex - 1); int variable2 = random.Next(0, maxVarIndex - 1); //less than MSOFormula <BoolExpr> phi = new MSOLe <BoolExpr>(varOf(variable1), varOf(variable2)); return(new Pair <MSOFormula <BoolExpr>, List <BoolExpr> >(phi, new List <BoolExpr>())); } } return(null); }