好的,我是一名新手,对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
、V1b
直至V1g
表示,而V1bH1b
到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
?
如果我一个一个地做,需要进行 120 种排列组合,所以一定有更快的方法。由于这是初学者练习,我必须遗漏了什么。
我发现了这个类似的问题,但提供的答案看起来很复杂,我希望能有更简单的方法。我在 Ubuntu 上使用 swi-prolog,以防有影响。
谢谢。
dif(V1,V2)
等等maplist(dif(V1),[V2,V3,V3])
- false