Memecahkan teka-teki di prolog - menghasilkan solusi dengan kendala?

Saya menggunakan prolog untuk mencoba memecahkan teka-teki kakuro. Saya memiliki daftar aturan seperti ini, di mana R dan C mewakili baris dan titik awal setiap kotak, L mewakili panjang dan S adalah jumlah angka pada baris tersebut,

 % across(R, C, L, S)
 across(2,4,2,4).
 across(2,10,2,4).  
 across(3,4,4,12).
 across(3,10,2,6).
 across(4,3,2,6).

Sejauh yang saya tahu, untuk memecahkan teka-teki menggunakan batasan, untuk setiap elemen L, saya harus mencari angka berbeda antara 1 dan 9 yang jika dijumlahkan sama dengan S. Saya benar-benar kesulitan untuk menyelesaikannya, kode yang saya miliki sejauh ini adalah ini:

solveAcross(Solution) :-
    findall([R,C,L,S], across(R,C,L,S), List), 
    Solution = length(List, L),
    Solution ins 1..9,
    all_distinct(Solution),
    labeling([], Solution).

Tapi yang dilakukan hanyalah mengembalikan false.

Bantuan apa pun akan dihargai.


person AgarAgar    schedule 07.04.2016    source sumber
comment
Apa maksudnya Solution = length(List, L) dan Solution = 1..9?   -  person lurker    schedule 07.04.2016
comment
Pertimbangkan gabungan dua tujuan Solution = length(List, L) dan Solution = 1..9, yang keduanya terjadi dalam program Anda. Tentu saja, konjungsi ini saja sudah gagal, karena 1..9 dan length(List, L) tidak menyatu.   -  person mat    schedule 07.04.2016
comment
@lurker, maaf itu seharusnya Solusi di 1..9, artinya solusi yang dihasilkan harus antara 1 dan 9. Solusi = panjang(Daftar, L) Saya pikir akan membuat daftar kosong dengan panjang L tetapi mengetik ini , sepertinya bukan itu yang ingin saya lakukan untuk mencapai tujuan saya.   -  person AgarAgar    schedule 07.04.2016
comment
Solution = length(List, L) menyatukan suku length(List, L) dengan variabel Solution. Di prolog, Anda tidak menetapkan hasil predikat menggunakan = seperti yang Anda lakukan dalam bahasa lain. Jika Anda ingin daftar panjangnya L dan nama daftarnya Solution, maka lakukan saja, length(Solution, L). Jika Anda ingin Solution memiliki panjang yang sama dengan List, lakukanlah, length(List, Len), length(Solution, Len).   -  person lurker    schedule 07.04.2016


Jawaban (1)


Jadi pertama-tama Anda perlu membuat matriks, yang akan menjadi kisi-kisi teka-teki kakuro Anda. Itu jelas merupakan langkah pertama - mohon maaf jika Anda sudah melakukannya.

Kemudian Anda ingin membuat beberapa aturan untuk seluruh batasan:

acrossConstraints(Matrix) :- getAcross(List), applyAcross(Matrix,List).
%this is the overall thing to call, containing two predicates you need to make
getAcross :- findall([R,C,L,S],across(R,C,L,S),List).
%creates a list of the across facts
applyAcross(Matrix,[[R,C,L,S]|T]) :- acrossConstraints(R,C,L,S,M), applyAcross(Matrix,T). 
%call another rule and recurse over the list.

crossConstraints adalah bagian yang rumit - di sini Anda ingin mengambil kotak yang Anda inginkan dan kemudian membuat daftar mulai dari titik itu. Petunjuk: gunakan tambahkan dan petunjuk.

Semoga beruntung!

person eponini    schedule 07.04.2016