0

私は SAT ソルバー (主に DPLL または部分 DPLL) を行っており、Unit Propogation の方法があります。基本的には、スタンドアロンのリテラルがあるかどうかをチェックし、そのリテラルと、他の句で見つかったインスタンスを削除します。任意の例は

(x) (x,y) (w,z)

ユニットの伝播は「x」になり、ユニットのプロップを実行すると、(w,z)

このメソッドには、いくつかのネストされたforeachループがあり、2 つの変数(bool) と charList<literals> <literals>を持つカスタムメイドのクラスです。hasNegationliteralCharacter

コーディングは以下にあり、以下から説明します

       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>ありtemplistlistOfLiterals後者は「親」です

listOfLiteralsその一致のエントリを削除しようとしていますがtempListc2.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;
    }

}
4

1 に答える 1

1

少しの LINQ マジックを使用しても問題ない場合は、次のようにします。

c2.listOfLiterals = c2.listOfLiterals.Except(tempList).ToList();

またはループオーバーtempList

foreach (var item in tempList)
{
    c2.listOfLiterals.Remove(item);
}

literalsクラスを実装してから、およびIEqualityComparer<literal>の実装を提供する必要がある場合があります。この良い例については、 MSDN のページを参照してください。EqualsGetHashCodeExcept

于 2014-07-23T11:34:35.763 に答える