2016-05-10 4 views
2

Kakuro PuzzleカックロパズルCSPプロローグ

は受験まで来て、私の改訂を支援するために、過去の紙の質問に答えを持っています。私が答えようとしている質問は、 です。(d)CSPを、 という有限ドメイン制約を使って解決する方法の1つを計算する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」と終わりには、リストのリストはこと に追加 「S」で終わります。
  • append/2は、1レベルのネスティングを削除するために使用されます。

もう一つの変化は、私は強くお勧めします:セパレートコア関係をlabeling/2から!これにより、テストが簡単になり、他にも多くの利点があります。

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

など:最終的なクエリはのようになります

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

を私はさらにあなたのための練習として、これを単純化し、プログラムの残りのままにしておきます。インスタンス表現の選択は、コードの短縮に役立ちます。