2016-05-10 12 views
2

Kakuro PuzzleKakuro Puzzle CSP Prolog

Hat sie eine Prüfung kommen und die Beantwortung von Fragen Vergangenheit Papier meiner Revision zu unterstützen. Die Frage, die ich zu beantworten versuche, ist: (d) Übersetzen Sie das CSP in ein Prolog-Programm, das nur eine Möglichkeit von berechnet, dieses Problem zu lösen, das endliche Domäne-Einschränkungen verwendet. [7 Punkte]

ich den folgenden Code geschrieben haben:

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). 

denke, ich meine Antwort ein bisschen zu lang ist. Kann ich es irgendwie verkürzen?

Wirklich zu schätzen jede Hilfe!

Antwort

1

zeige ich Ihnen eine Vereinfachung bis zur ersten Leerzeile:

 
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, 

Hinweis insbesondere:

  • wählte ich eine Darstellung des Puzzles, die mehr Informationen über seine Struktur behält.
  • Die maplist/2 wird verwendet, um viele einzelne Anrufe von all_different/1 zu ersetzen.
  • eine systematische Namenskonvention: Listen Ende mit einem „s“, Listen von Listen Ende mit einem   „s“, dass zu angehängt.
  • append/2 wird verwendet, um eine Verschachtelungsebene zu entfernen.

Eine weitere Änderung Ich empfehle: Separate der Kern-Beziehung von labeling/2! Dies vereinfacht das Testen und hat viele weitere Vorteile. Die eventuelle Abfrage sollte ähnlich aussehen wie:

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

oder wie:

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

ich dies weiter zu verlassen vereinfacht, und der Rest des Programms, als eine Übung für Sie. Beachten Sie, dass die Auswahl der Instanzdarstellung den Code deutlich verkürzen kann!