func (variables *Variables) EvaluateDomainRemovals(domainRemovals DomainRemovals) {
	for _, removal := range domainRemovals {
		modifiedVariable := variables.Find(removal.VariableName)
		if modifiedVariable.Empty {
			modifiedVariable.Domain = modifiedVariable.Domain.Remove(removal.Value)
		}
	}
}
EvaluateDomainRemovals remove values from domain based on DomainRemovals in propagation
package centipede
import "fmt"
type VariableName string
type VariableNames []VariableName
func (varnames *VariableNames) Contains(varname VariableName) bool {
	for _, item := range *varnames {
		if item == varname {
			return true
		}
	}
	return false
}
type Variable struct {
	Name   VariableName
	Value  interface{}
	Domain Domain
	Empty  bool
}
func NewVariable(name VariableName, domain Domain) Variable {
	return Variable{name, 0, domain, true}
}
func (variable *Variable) SetValue(value interface{}) {
	variable.Value = value
	variable.Empty = false
}
func (variable *Variable) Unset() {
	variable.Empty = true
	variable.Value = nil
}
func (variable *Variable) SetDomain(domain Domain) {
	variable.Domain = domain
}
type Variables []Variable
func (variables *Variables) SetValue(name VariableName, value interface{}) {
	foundIndex := -1
	for index, variable := range *variables {
		if variable.Name == name {
			foundIndex = index
		}
	}
	if !(foundIndex >= 0) {
		panic(fmt.Sprintf("Variable not found by name %v in variables %v", name, variables))
	} else {
		(*variables)[foundIndex].Value = value
		(*variables)[foundIndex].Empty = false
	}
}
func (variables *Variables) Unset(name VariableName) {
	foundIndex := -1
	for index, variable := range *variables {
		if variable.Name == name {
			foundIndex = index
		}
	}
	if !(foundIndex >= 0) {
		panic(fmt.Sprintf("Variable not found by name %v in variables %v", name, variables))
	} else {
		(*variables)[foundIndex].Value = nil
		(*variables)[foundIndex].Empty = true
	}
}
func (variables *Variables) SetDomain(name VariableName, domain Domain) {
	foundIndex := -1
	for index, variable := range *variables {
		if variable.Name == name {
			foundIndex = index
		}
	}
	if !(foundIndex >= 0) {
		panic(fmt.Sprintf("Variable not found by name %v in variables %v", name, variables))
	} else {
		(*variables)[foundIndex].Domain = domain
	}
}
func (variables *Variables) Find(name VariableName) *Variable {
	for i := 0; i < len(*variables); i++ {
		if (*variables)[i].Name == name {
			return &(*variables)[i]
		}
	}
	panic(fmt.Sprintf("Variable not found by name %v in variables %v", name, variables))
}
func (variables *Variables) Contains(name VariableName) bool {
	for _, variable := range *variables {
		if variable.Name == name {
			return true
		}
	}
	return false
}
func (variables *Variables) Unassigned() int {
	count := 0
	for _, variable := range *variables {
		if variable.Empty {
			count++
		}
	}
	return count
}
func (variables *Variables) Complete() bool {
	return variables.Unassigned() == 0
}