2016-05-10 2 views
2

Kakuro Puzzleкакуро Puzzle СНТ Пролог

Есть экзамен придумать и ответить на вопросы прошлых бумаг, чтобы помочь моей ревизии. Вопрос, на который я пытаюсь ответить, заключается в следующем: (d) Перевести CSP в программу Prolog, которая вычисляет только один способ , решая эту проблему, используя ограничения конечного домена. [7] знаки

Я написал следующий код:

kakuro(L):- 
     L = [X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16], 
     L ins 1..9,  
     Z1 = [X1, X2], 
     all_different(Z1), 
     X1 #= 5 - X2,  
     Z2 = [X3, X4, X5, X6], 
     all_different(Z2), 
     X3 #= 29 - (X4+X5+X6), 
     Z3 = [X7, X8], 
     all_different(Z3), 
     X7 #= 14 - X8, 
     Z4 = [X9, X10], 
     all_different(Z4), 
     X9 #= 4 - X10, 
     Z5 = [X11, X12, X13, X14], 
     all_different(Z5), 
     X11 #= 16 - (X12+X13+X14), 
     Z6 = [X15, X16], 
     all_different(Z6), 
     X15 #= 7 - X16, 

     A1 = [X3, X7], 
     all_different(A1), 
     X3 #= 16 - X7, 
     A2 = [X1, X4, X8, X11], 
     all_different(A2), 
     X1 #= 18 - (X4+X8+X11), 
     A3 = [X2, X5], 
     all_different(A3), 
     X2 #= 13 - X5, 
     A4 = [X12, X15], 
     all_different(A4), 
     X12 #= 14 - X15, 
     A5 = [X6, X9, X13, X16], 
     all_different(A5), 
     X6 #= 11 - (X9+X13+X16), 
     A6 = [X10, X14], 
     all_different(A6), 
     X10 #= 3 - X14, 

     labeling([], L). 

Я думаю, что мой ответ немного слишком долго. Есть ли способ сократить его?

Действительно оцените любую помощь!

ответ

1

я покажу вам упрощение до первой пустой строки:

 
kakuro(Ls):- 
     Lss = [[X1,X2], 
      [X3,X4,X5,X6], 
      [X7,X8], 
      [X9,X10], 
      [X11,X12,X13,X14], 
      [X15, X16]], 
     maplist(all_different, Lss), 
     append(Lss, Ls), 
     Ls ins 1..9, 
     X1 #= 5 - X2, 
     X3 #= 29 - (X4+X5+X6), 
     X7 #= 14 - X8, 
     X9 #= 4 - X10, 
     X11 #= 16 - (X12+X13+X14), 
     X15 #= 7 - X16, 

Обратите внимание, в частности:

  • Я выбрал представление головоломки, которая сохраняет больше информации о ее структуре.
  • maplist/2 используется для замены многих индивидуальных вызовов all_different/1.
  • Систематического именование: списки конца с «-s», списки списков заканчиваются   «ами», приложенные к , что.
  • append/2 Используется для удаления одного уровня гнездования.

Еще одно изменение, я настоятельно рекомендую: Отдельные сердцевине соотношение от labeling/2! Это упрощает тестирование и имеет много других преимуществ. Окончательный запрос должен выглядеть так:

?- kakuro(Vs), label(Vs). 

или как:

?- kakuro_(Instance, Vs), label(Vs). 

Я оставляю еще больше упростить это, а остальная часть программы, как упражнение для вас. Обратите внимание, что выбор представления экземпляра может помочь значительно сократить код!