6

このPrologサイトのチュートリアルに従って学習しようとしていますが、演習の解決策が見つかりません (サイトには解決策がありません)。

これが私がしなければならないことです:

イタリア語の単語は次の6つです。

アスタンテ、アストリア、バラット、コバルト、ピストーラ、スタターレ。

それらは、クロスワード パズルのように、次のグリッドに配置されます。

図式

次のナレッジ ベースは、これらの単語を含むレキシコンを表しています。

  • 単語 (アスタンテ、a、s、t、a、n、t、e)。
  • 単語 (アストリア、a、s、t、o、r、i、a)。
  • 単語(バラっと、b、a、r、a、t、t、o)。
  • 単語 (コバルト、c、o、b、a、l、t、o)。
  • 単語 (ピストラ、p、i、s、t、o、l、a)。
  • 単語 (状態、s、t、a、t、a、l、e)。

グリッドを埋める方法を示す述語クロスワード/6 を書きます。最初の 3 つの引数は左から右への垂直方向の単語であり、最後の 3 つの引数は上から下への水平方向の単語でなければなりません。

さて、同じ質問がそこで尋ねられましたが、与えられた各ソリューションは私が知らないことを使用しています(これを解決するために知っているはずはありません)。

明確にするために、リンクされた質問の内容は確かに機能していますが、私がフォローしているガイドではまだ説明されていないものを使用しています。これは、そのようなものを使用せずに演習を解決する必要があることを意味します。いいえmaplist、そのようなもの。

私のアイデアは、いくつかの制約を付けて、与えられた単語の文字でボードを埋めることでした:

  • V1 の単語の 2 番目の文字は、H1 の単語の 2 番目の文字でなければなりません
  • V1 の単語の 4 番目の文字は、H2 の単語の 2 番目の文字でなければなりません
  • V1 の単語は、6 番目の文字として、H3 の単語の 2 番目の文字を持たなければなりません

等々..

だからここに私のコードがあります:

word(astante,  a,s,t,a,n,t,e).
word(astoria,  a,s,t,o,r,i,a).
word(baratto,  b,a,r,a,t,t,o).
word(cobalto,  c,o,b,a,l,t,o).
word(pistola,  p,i,s,t,o,l,a).
word(statale,  s,t,a,t,a,l,e). 

crossword(V1,V2,V3,H1,H2,H3):- word(V1, V11,V12,V13,V14,V15,V16,V17),
                               word(H1, H11,V12,H13,H14,H15,H16,H17),
                               word(H2, H21,V14,H23,H24,H25,H26,H27),
                               word(H3, H31,V16,H33,H34,H35,H36,H37),

                               word(V2, V21,V22,V23,V24,V25,V26,V27),
                               word(H1, H11,H12,H13,V22,H15,H16,H17),
                               word(H2, H21,H22,H23,V24,H25,H26,H27),
                               word(H3, H31,H32,H33,V26,H35,H36,H37),

                               word(V3, V31,V32,V33,V34,V35,V36,V37),
                               word(H1, H11,H12,H13,H14,H15,V32,H17),
                               word(H2, H21,H22,H23,H24,H25,V34,H27),
                               word(H3, H31,H23,H33,H34,H35,V36,H37). 

(これが適切にフォーマットされていない場合は申し訳ありませんが、 の正しいインデント スタイルはまだわかりませんProlog)。

もちろん、私のアイデアが (少なくとも私には) 正しいと思われる場合、このコードは返さNoれますが、その理由はわかりません。

これに関するヒントはありますか?

編集:

@mbratch のコメントに従って、このソリューションにあるコードを使用してみました。

コードは次のとおりです。

crossword(V1, V2, V3, H1, H2, H3) :-
   word(V1, V1a, V1bH1b, V1c, V1dH2b, V1e, V1fH3b, V1g), 
   word(V2, V2a, V2bH1d, V2c, V2dH2d, V2e, V2fH3d, V2g), 
   word(V3, V3a, V3bH1f, V3c, V3dH2f, V3e, V3fH3f, V3g), 
   word(H1, H1a, V1bH1b, H1c, V2bH1d, H1e, V3bH1f, H1g), 
   word(H2, H2a, V1dH2b, H2c, V2dH2d, H2e, V3dH2f, H2g), 
   word(H3, H3a, V1fH3b, H3c, V2fH3d, H3e, V3fH3f, H3g).

コードは機能しますが、気にしない重複の問題があります。

私が理解したいのは、私のリターン中にこれが機能する理由Noです。

4

2 に答える 2

6
crossword(V1,V2,V3,H1,H2,H3) :-
 word(V1, _, V12, _, V14, _, V16, _),
 word(V2, _, V22, _, V24, _, V26, _),
 word(V3, _, V32, _, V34, _, V36, _),
 word(H1, _, V12, _, V22, _, V32, _),
 word(H2, _, V14, _, V24, _, V34, _),
 word(H3, _, V16, _, V26, _, V36, _),
 V1 \= H1.
于 2015-09-02T13:18:43.740 に答える
2

数回試行した後、@ joel76 のコメントに基づいて、最初のコードが間違っていることに気付きました。これはH1H2H3複数回宣言したため、2 行目で計算された結果が 6 行目で変更され、これがNoProlog によって返された .

したがって、複数の行で処理を行う代わりに、それらを次の結果にマージしました。

crossword(V1,V2,V3,H1,H2,H3):- word(V1, V11, V12, V13, V14, V15, V16, V17),
                               word(V2, V21, V22, V23, V24, V25, V26, V27),
                               word(V3, V31, V32, V33, V34, V35, V36, V37),
                               word(H1, H11, V12, H13, V22, H15, V32, H17),
                               word(H2, H21, V14, H23, V24, H25, V34, H27),
                               word(H3, H31, V16, H33, V26, H35, V36, H37).

そして今それは働いています。

于 2014-01-19T18:35:36.983 に答える