7

パラダイス島のクレオールには、「放棄」、「アワビ」、「アナグラム」、「ボート」、「ボートマン」、「子供」、「接続」、「エレガント」、「強化」、「島」、「男」、「砂」、「太陽」、「女」。

パラダイスタイムズはこのクロスワードを公開しています:

パラダイスタイムズクロスワード

クロスワードには14語の一部が含まれていますが、他の語は含まれていません。

から始まるPrologプログラムを書く

word(X) :-
member(X,
[
[a,b,a,n,d,o,n], [a,b,a,l,o,n,e], [a,n,a,g,r,a,m],
[b,o,a,t], [b,o,a,t,m,a,n], [c,h,i,l,d],
[c,o,n,n,e,c,t], [e,l,e,g,a,n,t], [e,n,h,a,n,c,e],
[i,s,l,a,n,d], [m, a, n], [s,a,n,d],
[s,u,n], [w, o, m, a, n]
]).

solution(H1,H2,H3,V1,V2,V3) :-

solution述語を次のように定義します

solution(H1,H2,H3,V1,V2,V3)

、、、、、、およびがパラダイス島の有効な単語であり、上記のグリッドに書き込まれたときに有効なクロスワードを形成する場合H1にのみ真です。(たとえば、の2番目の文字はの2番目の文字と一致する必要があります。)H2H3V1V2V3H1V1

クエリを使用する

?- solution(H1,H2,H3,V1,V2,V3).

クロスワードを解くために。クロスワードのすべての解決策を見つけてください。

ヒント:小さなクロスワードパズルとあまりリッチでないレキシコンから始めたいと思うかもしれません。

4

5 に答える 5

10

写真を見てください。単語は文字で書かれています。写真にはすべてが含まれており、Prolog 行で翻訳します (私のソリューションでは 12 行、1 つの単語に 2 行あります)。

[編集] すべての人が独自の解決策を提供するので、ここに私のものがあります:

solution(H1,H2,H3,V1,V2,V3) :-
    H1 = [_,A2,_,A4,_,A6,_],
    H2 = [_,B2,_,B4,_,B6,_],
    H3 = [_,C2,_,C4,_,C6,_],
    V1 = [_,A2,_,B2,_,C2,_],
    V2 = [_,A4,_,B4,_,C4,_],
    V3 = [_,A6,_,B6,_,C6,_],
    maplist(word, [H1,H2,H3,V1,V2,V3]).

PS私はもともと単語(H1)、単語(H2)を書きました...

于 2012-03-14T08:29:58.627 に答える
3

一意にドメインを選択するselect/2と、次のようになります。

select([A|As],S):- select(A,S,S1),select(As,S1).
select([],_). 
words(X) :- X = [
    [a,b,a,n,d,o,n], [a,b,a,l,o,n,e], [a,n,a,g,r,a,m],
    [b,o,a,t],       [b,o,a,t,m,a,n], [c,h,i,l,d],
    [c,o,n,n,e,c,t], [e,l,e,g,a,n,t], [e,n,h,a,n,c,e],
    [i,s,l,a,n,d],   [m, a, n],       [s,a,n,d],
    [s,u,n],         [w, o, m, a, n]
    ].
solve(Crossword):- words(Words), 
    Crossword = [ [_,A2,_,A4,_,A6,_],
                  [_,B2,_,B4,_,B6,_],
                  [_,C2,_,C4,_,C6,_],
                  [_,A2,_,B2,_,C2,_],
                  [_,A4,_,B4,_,C4,_],
                  [_,A6,_,B6,_,C6,_] ],
    select(Crossword, Words).
solve:- solve(Crossword),
        maplist(writeln, Crossword), writeln(';'), fail 
     ;  writeln('No more solutions!').

テスト:

7 ?- solve.
[a, b, a, n, d, o, n]
[e, l, e, g, a, n, t]
[e, n, h, a, n, c, e]
[a, b, a, l, o, n, e]
[a, n, a, g, r, a, m]
[c, o, n, n, e, c, t]
;
[a, b, a, l, o, n, e]
[a, n, a, g, r, a, m]
[c, o, n, n, e, c, t]
[a, b, a, n, d, o, n]
[e, l, e, g, a, n, t]
[e, n, h, a, n, c, e]
;
No more solutions!

このソリューションでは、パズルで一意の単語のみを使用できます (重複は許可されません)。これは、意図したものである場合とそうでない場合があります。

于 2012-03-14T11:39:57.543 に答える
1
solution(H1, H2, H3, V1, V2, V3) :-
    crosswordize([H1,H2,H3], [V1,V2,V3]),
    maplist(word, [H1,H2,H3,V1,V2,V3]).

crosswordize([], [[_],[_],[_]]).
crosswordize([[_, X1, _, X2, _, X3, _]|Lines],
             [[_, X1|R1], [_, X2|R2], [_, X3|R3]]) :-
    crosswordize(Lines, [R1,R2,R3]).

アルゴリズムを取得するのは難しくありません。

  • crosswordize/2述語呼び出しによってグリッドを構築します
  • すべてのリストが単語であることをプロローグに伝えます

述語は、crosswordize/2行を作成している間、一度に 2 つのセルを列を通過します。わからない場合でも、Will が行ったように「ハードコード」することができます。これも機能します。

于 2012-03-14T11:38:04.440 に答える
1

それ自体は Prolog プログラムではありませんが、Constraint Logic Programming を使用したソリューションは、CP に関する Hakan Kjellerstrand の優れたブログにあります。これは ECLiPSe にありますが、有限領域ソルバーを備えた他の Prolog システムに簡単に適応できます。純粋な Prolog の代わりに CLP を使用すると、検索がはるかに高速になります。

于 2012-03-14T07:19:05.113 に答える