Dalam makalah "Pengkodean CNF yang Efisien untuk Memilih 1 dari Objek N", para penulis memperkenalkan teknik "variabel komandan" mereka untuk mengkodekan kendala, dan kemudian berbicara tentang masalah lubang kubah.
Karena kesalahan saya mungkin ada dalam pemahaman tingkat rendah, izinkan saya menyatakan apa yang saya pikir saya ketahui sebelum mengajukan pertanyaan:
Biarkan dan n menjadi jumlah merpati dan lubang. Pengkodean naif menggunakan variabel proposisional X i , j itu benar ketika saya ' t h merpati adalah untuk diletakkan di j ' t h lubang. Klausa E x a c t l y O n e ( X 1 , 1 , X 1 , 2 , . . . , X 1 , n )menegakkan bahwa merpati 1 harus menempati tepat satu lubang; klausa identik ditambahkan untuk merpati lainnya. Klausa memberlakukan bahwa tidak lebih dari satu merpati menempati lubang 1; klausa identik ditambahkan untuk lubang yang tersisa.
Ketika ada lebih banyak merpati daripada lubang (m> n), masalahnya tidak dapat diselesaikan (jelas bagi manusia) tetapi pemecah SAT tidak "melihat" fakta ini. Ketika tidak dapat menemukan cara untuk menempatkan merpati akan mencari upaya dengan merpati 2 , 1 , 3 , . . . , m . Tidak mengerti bahwa urutan merpati tidak relevan. Makalah ini, antara lain, menyebut simetri ini.
Contoh di mana digunakan sebagai tes berat dari kemampuan SAT solver untuk mendeteksi unsatisfiability.
Makalah ini mengusulkan untuk memecahkan simetri dengan memberlakukan perintah pada merpati. Pigeon harus ditempatkan dalam sebuah lubang di depan lubang merpati i + 1 (yaitu, merpati di dalam lubang j harus memiliki jumlah yang lebih kecil daripada merpati di dalam lubang j + 1 ). Kemudian mengecewakan mengatakan, "Karena keterbatasan ruang, kita tidak secara eksplisit menjelaskan secara rinci kanonik-pemesanan encoding, tetapi jumlah klausul yang dihasilkan dari urutan O ( n * l o g ( n ) ) ".
Jadi pertanyaan saya adalah: apa yang mereka lakukan untuk mendapatkan hasil ini?
Saya ingin memperlakukan variabel sebagai string bit yang, secara numerik, mengidentifikasi pilihan merpati mana yang masuk ke lubang 1, dan seterusnya. Ikuti ini dengan n - 1 pembanding untuk menegakkan saran makalah ini. Konstruksi pembanding naif saya, bagaimanapun, membutuhkan klausa m, satu untuk setiap bit (dengan ukuran semakin jelek). Tolong! :)