これを達成する方法についての提案を期待しています:
定義: 無向グラフ G は、頂点の集合 V と辺の集合 E によって定義されます。ここで、各辺はサイズ 2 の V のサブセット、つまり頂点の順序付けられていないペア {u, v} です。G の長さ k のサイクルは、{v_1, v_2}, {v_2, v_3}, ..., {v_k-1, v_k}, {v_k, v_1 の異なる頂点のシーケンス v_1, ..., v_k です。 G のハミルトニアン サイクルは、長さ n = |V| のサイクル、つまり、グラフの各頂点を 1 回だけ通過する chcle です。ハミルトニアン サイクルを持つ場合、G ハミルトニアンと呼びます。
問題: 次の決定問題の命題論理定式化を提供します: 無向グラフ G が与えられた場合、G はハミルトニアンですか? 製剤は Z3 によってチェックされます。
入力形式は次のとおりです。
4
0 1
1 2
2 3
3 0
1 3
ここで、最初の数字は頂点の数を表し、残りのペアはすべて G のエッジです。
出力は次のようになります: 0 1 2 3
明らかに、出力は常に数値 1、...、n-1 の順列になります。ここで、n = |V| です。しかし、命題論理のみを使用して整数を操作する方法がわかりません。
アドバイスをいただければ幸いです。
よろしく。
これは、指定された入力に対して機能するソリューションです。エッジの組み合わせ (n Choose k) を生成する perl ルーチンを書くことができれば、これを任意の数の入力に一般化できます。
(declare-const v0 Bool)
(declare-const v1 Bool)
(declare-const v2 Bool)
(declare-const v3 Bool)
(declare-const e1 Bool)
(declare-const e2 Bool)
(declare-const e3 Bool)
(declare-const e4 Bool)
(declare-const e5 Bool)
(assert (xor (and e1 e2 e3 e4) (and e1 e2 e3 e5) (and e1 e2 e4 e5) (and e1 e3 e4 e5) (and e2 e3 e4 e5)))
(assert (and v0 v1 v2 v3))
(assert (=> e1 (and v0 v1)))
(assert (=> e2 (and v1 v2)))
(assert (=> e3 (and v2 v3)))
(assert (=> e4 (and v3 v0)))
(assert (=> e5 (and v1 v3)))
(check-sat)
(get-model)