C#
あなたのタスクは、多項式時間で実行されるように見えるSAT用のプログラムを書くことです。
「表示」は不要です。SAT問題を解決するために多項式時間で実際に実行するプログラムを書くことができます。実際、これは非常に簡単です。
メガボーナス:実際に多項式時間で実行されるSATソルバーを作成すると、100万ドルを獲得できます。しかし、とにかくスポイラータグを使用してください。
驚くばかり。百万ドルを送ってください。真剣に、私は多項式ランタイムでSATを解決するプログラムをここに持っています。
まず、SAT問題のバリエーションを解決することを述べることから始めましょう。3-SAT問題の独自の解決策を示すプログラムの作成方法を説明します。各ブール変数の評価は、ソルバーが機能するために一意でなければなりません。
まず、いくつかの単純なヘルパーメソッドと型を宣言します。
class MainClass
{
class T { }
class F { }
delegate void DT(T t);
delegate void DF(F f);
static void M(string name, DT dt)
{
System.Console.WriteLine(name + ": true");
dt(new T());
}
static void M(string name, DF df)
{
System.Console.WriteLine(name + ": false");
df(new F());
}
static T Or(T a1, T a2, T a3) { return new T(); }
static T Or(T a1, T a2, F a3) { return new T(); }
static T Or(T a1, F a2, T a3) { return new T(); }
static T Or(T a1, F a2, F a3) { return new T(); }
static T Or(F a1, T a2, T a3) { return new T(); }
static T Or(F a1, T a2, F a3) { return new T(); }
static T Or(F a1, F a2, T a3) { return new T(); }
static F Or(F a1, F a2, F a3) { return new F(); }
static T And(T a1, T a2) { return new T(); }
static F And(T a1, F a2) { return new F(); }
static F And(F a1, T a2) { return new F(); }
static F And(F a1, F a2) { return new F(); }
static F Not(T a) { return new F(); }
static T Not(F a) { return new T(); }
static void MustBeT(T t) { }
それでは、3-SAT問題を選んで解決しましょう。まあ言ってみれば
(!x3) &
(!x1) &
(x1 | x2 | x1) &
(x2 | x3 | x2)
それをもう少し括弧で括りましょう。
(!x3) & (
(!x1) & (
(x1 | x2 | x1) &
(x2 | x3 | x2)))
このようにエンコードします:
static void Main()
{
M("x1", x1 => M("x2", x2 => M("x3", x3 => MustBeT(
And(
Not(x3),
And(
Not(x1),
And(
Or(x1, x2, x1),
Or(x2, x3, x2))))))));
}
プログラムを実行すると、多項式時間で3-SATの解が得られます。実際、ランタイムは問題のサイズに比例します!
x1: false
x2: true
x3: false
あなたは多項式ランタイムを言った。多項式コンパイル時間については何も言わなかった。このプログラムは、C#コンパイラにx1、x2、およびx3のすべての可能な型の組み合わせを試行させ、型エラーを示さない一意の組み合わせを選択します。コンパイラがすべての作業を行うため、ランタイムは必要ありません。2007年にブログでこの興味深い技術を初めて公開しました:http ://blogs.msdn.com/b/ericlippert/archive/2007/03/28/lambda-expressions-vs-anonymous-methods-part-five.aspx 注もちろんこの例は、C#のオーバーロード解決が少なくともNP-HARDであることを示しています。NP-HARDか実際には決定不能か 型の互換性が一般的な反変の存在下でどのように機能するかについての特定の微妙な詳細に依存しますが、それは別の日の主題です。