我正在做SAT解算器(主要是DPLL或部分DPLL(,我有单元建议的方法。基本上,它所做的是检查是否有任何独立的文字,并删除该文字以及在其他子句中找到的任何实例。任何例子都是
(x) (x,y) (w,z)
单位建议为"x",执行单位建议时,只留下(w,z)
在这个方法中,我有几个嵌套的foreach
循环,List<literals>
<literals>
是一个自定义类,它有两个变量hasNegation
(bool(和字符literalCharacter
编码如下,并将从下面的中进行解释
foreach (clauses c1 in listOfClauses)
{
if (c1.listOfLiterals.Count == 1)
{
literals l1 = c1.listOfLiterals[0];
solved.Add(l1);
foreach (clauses c2 in listOfClauses)
{
List<literals> tempList = new List<literals>();
foreach (literals l2 in listOfLiterals)
{
if (l2.solveDPLL(l1))
{
removable.Add(c2);
}
else
{
if (c2.listOfLiterals.Count == 1)
{
UNSAT = true;
return false;
}
else
{
if (l1.solveDPLL(l2))
{
tempList.Add(l2);
}
}
}
c2.listOfLiterals.RemoveAll(tempList); //obviously giving error
}
}
}
}
return true;
}
我有两个List <literals>
,分别是templist
和listOfLiterals
,其中LATTER是"父">
我正在尝试删除listOfLiterals
中与tempList
匹配的条目,并且我使用c2.listOfLiterals.RemoveAll(tempList);
显然会输出错误,因为它不是Delegate。
我已经搜索了很多,甚至在stackoverflow上,但每一个都可以与ID或整数进行比较。在我的情况下,由于我只是在比较2个Lists
,我如何进行委托,以便从listOfLiterals中删除listOfLittles和tempList中相同的条目
非常感谢
编辑:
文字类
public class literals
{
public char literalCharacter { get; set; }
public bool negation { get; set; }
public literals(char lc, bool neg )
{
literalCharacter = lc;
negation = neg;
}
public bool solveDPLL (literals lit)
{
return ((Object.Equals(literalCharacter, lit.literalCharacter) && (negation == lit.negation)));
}
public String toString()
{
return literalCharacter + " : " + !negation;
}
}
如果你可以使用一点LINQ魔法:
c2.listOfLiterals = c2.listOfLiterals.Except(tempList).ToList();
或在tempList
:上循环
foreach (var item in tempList)
{
c2.listOfLiterals.Remove(item);
}
您可能需要literals
类来实现IEqualityComparer<literal>
,然后提供Equals
和GetHashCode
的实现。请参阅Except
的MSDN页面以获得一个很好的示例。