public void Lemma10Test(CspInstance instance) { List <CspInstance> instances = new() { instance }; Lemma10TestInternal(); foreach (CspInstance inst in instances) { foreach (var var in inst.Variables) { foreach (var col in var.AvalibleColors) { if (col.Restrictions.Count == 2) { var tempTab = col.Restrictions.ToArray(); Assert.NotEqual(tempTab[0].Variable, tempTab[1].Variable); } } } } void Lemma10TestInternal() { bool foundFlag = false; int indexOfInst = 0; Variable v = new(1), v2 = new(1); Color c = new(1), c2_1 = new(1), c2_2 = new(1); foreach (CspInstance inst in instances) { foreach (var var in inst.Variables) { foreach (var col in var.AvalibleColors) { foreach (var pair in col.Restrictions) { int resToNeigh = col.Restrictions.Where(r => r.Variable == pair.Variable).Count(); if (resToNeigh == pair.Variable.AvalibleColors.Count) { inst.RemoveRestriction(new Pair(var, col), pair); resToNeigh--; } if (resToNeigh > 1) { c = col; v = var; indexOfInst = instances.IndexOf(inst); v2 = pair.Variable; foundFlag = true; break; } } if (foundFlag) { break; } } if (foundFlag) { break; } } if (foundFlag) { break; } } if (foundFlag) { CspInstance foundInst = instances[indexOfInst]; instances.RemoveAt(indexOfInst); var aaa = CSPLemmas.Lemma10(foundInst, v, c, v2); instances.AddRange(aaa); Lemma10TestInternal(); } } }
int[] Rec(CspInstance instance) { foreach (var restriction in instance.Restrictions) { if (restriction.Pair1 == restriction.Pair2) { instance.RemoveColor(restriction.Pair1); } } foreach (var v in instance.Variables) { if (v.AvalibleColors.Count == 0) { return(null); } } bool applied; foreach (var v in instance.Variables) { CSPLemmas.Lemma2(instance, v, out applied); if (applied) { return(Rec(instance)); } } foreach (var v in instance.Variables) { CSPLemmas.Lemma3(instance, v, out applied); if (applied) { return(Rec(instance)); } } foreach (var v in instance.Variables) { CSPLemmas.Lemma4(instance, v, out applied); if (applied) { return(Rec(instance)); } } foreach (var v in instance.Variables) { CSPLemmas.Lemma5(instance, v, out applied); if (applied) { return(Rec(instance)); } } foreach (var v in instance.Variables) { CSPLemmas.Lemma6(instance, v, out applied); if (applied) { return(Rec(instance)); } } List <CspInstance> instances; //lemma 8 foreach (var variable in instance.Variables) { foreach (var color in variable.AvalibleColors) { instances = CSPLemmas.Lemma8(instance, variable, color, out applied); if (applied) { foreach (var retInstance in instances) { var result = Rec(retInstance); if (result != null) { return(result); } } return(null); } } } //lemma 9 foreach (var variable in instance.Variables) { foreach (var color in variable.AvalibleColors) { instances = CSPLemmas.Lemma9(instance, variable, color, out applied); if (applied) { foreach (var retInstance in instances) { var result = Rec(retInstance); if (result != null) { return(result); } } return(null); } } } //lemma 10 foreach (var variable in instance.Variables) { foreach (var color in variable.AvalibleColors) { var neighbors = color.Restrictions.Select(r => r.Variable).Distinct(); foreach (var neighbor in neighbors) { var restrictionToNeighbor = color.Restrictions.Where(r => r.Variable == neighbor); if (restrictionToNeighbor.Count() >= 2) { instances = CSPLemmas.Lemma10(instance, variable, color, restrictionToNeighbor.First().Variable); if (instances.Count > 1) { foreach (var retInstance in instances) { var result = Rec(retInstance); if (result != null) { return(result); } } return(null); } } } } } //lemma 11 foreach (var variable in instance.Variables) { foreach (var color in variable.AvalibleColors) { instances = CSPLemmas.Lemma11(instance, variable, color); if (instances.Count > 1) { foreach (var retInstance in instances) { var result = Rec(retInstance); if (result != null) { return(result); } } return(null); } } } //lemma 12 foreach (var variable in instance.Variables) { foreach (var color in variable.AvalibleColors) { instances = CSPLemmas.Lemma12(instance, variable, color); if (instances.Count > 1) { foreach (var retInstance in instances) { var result = Rec(retInstance); if (result != null) { return(result); } } return(null); } } } //lemma 13 foreach (var variable in instance.Variables) { foreach (var color in variable.AvalibleColors) { instances = CSPLemmas.Lemma13(instance, variable, color); if (instances.Count > 1) { foreach (var retInstance in instances) { var result = Rec(retInstance); if (result != null) { return(result); } } return(null); } } } //lemma 15 instances = CSPLemmas.Lemma15(instance, out applied); if (applied) { foreach (var retInstance in instances) { var result = Rec(retInstance); if (result != null) { return(result); } } return(null); } //lemma 17 instances = CSPLemmas.Lemma17(instance, out applied); if (applied) { foreach (var retInstance in instances) { var result = Rec(retInstance); if (result != null) { return(result); } } return(null); } //lemma 18 instances = CSPLemmas.Lemma18(instance, out applied); if (applied) { foreach (var retInstance in instances) { var result = Rec(retInstance); if (result != null) { return(result); } } return(null); } //lemma 19 var isColoring = CSPLemmas.Lemma19(instance); if (isColoring) { return(instance.GetResult()); } else { return(null); } }