我正在执行SAT解算器(主要是DPLL或部分DPLL),并且具有用于单位传播的方法。基本上,它所做的是检查是否有任何独立的文字,并删除该文字以及在其他子句中找到的所有实例。任何例子都是
(x) (x,y) (w,z)
单位传播为'x',并且在执行单位传播时仅留下(w,z)
在此方法中,我有几个嵌套的foreach
循环,List<literals>
<literals>
是定制类,具有2个变量hasNegation
(布尔)和char 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;
}
我有2个List <literals>
,分别是templist
和listOfLiterals
,其中LATTER是“父母”
我试图删除与listOfLiterals
匹配的tempList
条目,并且我使用c2.listOfLiterals.RemoveAll(tempList);
显然会输出错误,因为它不是委托。
即使在stackoverflow上,我也进行了很多搜索,但是每个搜索结果都比较一个ID或一个整数。就我而言,由于我只是比较2 Lists
,因此我该如何进行委托,以便将listOfLiterals和tempList中相同的条目从listOfLiterals?
非常感谢
编辑:
文学班
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
提供一个实现。有关此示例,请参见MSDN page for Except
。