public Formula ReduceVertexCoverToSat(AdjacentMap pUndirectedGraph, int pMinVertexCount) { Dictionary <string, Variable> variables = new Dictionary <string, Variable>(); foreach (var key in pUndirectedGraph.Keys) { for (int i = 1; i <= pMinVertexCount; i++) { variables.Add($"{key}|{i}", new Variable($"{key}|{i}")); } } Console.WriteLine("Created Variables"); foreach (var variable in variables) { Console.WriteLine(variable.Value.ToString()); } var formula = new Formula(); for (int i = 1; i <= pMinVertexCount; i++) { if (i > 1) { formula.Add(_and); } var atMostOneList = variables.Values.Where(v => v.Name.EndsWith($"|{i}")).ToList(); var atMostOneFormular = AtMostOne(atMostOneList); formula.AddRange(atMostOneFormular); } List <string> processedEdges = new List <string>(); foreach (var key in pUndirectedGraph.Keys) { foreach (var adjacent in pUndirectedGraph[key]) { if (!processedEdges.Contains($"{key}|{adjacent}") && !processedEdges.Contains($"{adjacent}|{key}")) { var atLeastOneList = new List <Variable>(); for (int i = 1; i <= pMinVertexCount; i++) { atLeastOneList.Add(variables[$"{key}|{i}"]); atLeastOneList.Add(variables[$"{adjacent}|{i}"]); } var atleastOneFormular = AtLeastOne(atLeastOneList); formula.Add(_and); formula.Add(atleastOneFormular); processedEdges.Add($"{key}|{adjacent}"); } } } return(formula); }