OK、私はPrologを初めて使用するので、これが些細なことである場合は申し訳ありませんが、これに対する適切なエレガントな答えを見つけることができないようです. 私はここでlearnprolognow.orgの演習2.4(クロスワード)を解決しようとしています。
この演習では、次の事実が提供されます。
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, 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).
V1a
toV1g
などは各単語の文字であり、toV1bH1b
はV3fH3f
クロスワードの単語間で共通する文字です。
解決策は機能しているように見えますが、結果は重複した値を生成しています。最初の結果は次のとおりです。
?- crossword(V1, V2, V3, H1, H2, H3).
V1 = astante,
V2 = baratto,
V3 = statale,
H1 = astante,
H2 = baratto,
H3 = statale .
Prologに強制するにはどうすればよいV1 \= V2 \= V3 \= H1 \= H2 \= H3
ですか? 1つずつ個別に行うと、120個の順列が必要になるため、より迅速な方法が必要であり、これは初心者の演習であるため、何かが欠けているに違いありません.
この同様の質問を見つけましたが、提供された回答は非常に複雑に思えます。もっと簡単な方法があることを願っています。念のため、Ubuntuでswi-prologを使用しています。
ありがとう。