/// <summary> /// Creates the assignment and prunes other variables /// </summary> /// <param name="var">Variable.</param> /// <param name="val">Value.</param> /// <returns>True if the assignment is legal</returns> public bool AssignValue(Variable var, OverFloorType val, bool inference = true) { //Create a new assignment Assignment assign = new Assignment(var, val); //Get current domain before MAC3 to store posible values to prune List <OverFloorType> domainBeformMAC = var.remDomain.ToList(); //Get variable prunes var validAssignment = true; if (inference) { validAssignment = Search.MAC3(ref assign, new CSP(this)); } if (validAssignment) { //Prune all values that are not a variable assign.domainPrune.Add(var.pos, domainBeformMAC.Where(r => r != val).ToList()); //Go over variable domain prunes to remove from variables foreach (var varPrune in assign.domainPrune.Keys) { List <OverFloorType> valuesToPrune = assign.domainPrune[varPrune]; Variable varToPrune = vars.First(v => v.pos == varPrune); foreach (var vPrune in valuesToPrune) { varToPrune.removeDomainElement(vPrune); } } //Save the assignment assignments.Add(assign); } return(validAssignment); }