私は SAT ソルバー (主に DPLL または部分 DPLL) を行っており、Unit Propogation の方法があります。基本的には、スタンドアロンのリテラルがあるかどうかをチェックし、そのリテラルと、他の句で見つかったインスタンスを削除します。任意の例は
(x) (x,y) (w,z)
ユニットの伝播は「x」になり、ユニットのプロップを実行すると、(w,z)
このメソッドには、いくつかのネストされたforeach
ループがあり、2 つの変数(bool) と charList<literals>
<literals>
を持つカスタムメイドのクラスです。hasNegation
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
後者は「親」です
listOfLiterals
その一致のエントリを削除しようとしていますがtempList
、c2.listOfLiterals.RemoveAll(tempList);
デリゲートではないため、明らかにエラーを出力します。
stackoverflow でさえ、私はたくさん検索しましたが、それらのすべてが ID または整数のいずれかと比較されます。私の場合、 2Lists
を比較しているだけなので、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;
}
}