【发布时间】:2013-01-29 19:33:30
【问题描述】:
好的,我是 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 到 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 个排列,所以必须有一个更快的方法,而且这是一个初学者练习,所以我一定会遗漏一些东西。
我找到了this similar question,但是提供的答案似乎很复杂,希望有更简单的方法。我在 Ubuntu 上使用 swi-prolog,以防万一。
谢谢。
【问题讨论】:
-
dif(V1,V2)等maplist(dif(V1),[V2,V3,V3]) -
但是div(V1, V2) 不等于V1 \= V2,所以我还是要做120次才能保证6个变量不一样?!
-
请注意,它是 dif/2。是的,它是一样的。使用 maplist,您已经缩短了。为了进一步缩短,定义一个辅助谓词 alldif/1,如果列表的所有元素都不同,则该谓词为真。
-
好的,我该怎么做?请记住,我还是一个刚开始的初学者,所以不要以为我可以填写
etc.或insert more here。 -
如果你在游戏的早期阶段就不要试图向前跳;逐步解决问题。首先,无论如何,您都必须输入更详细的解决方案。然后,当你接触到更高级的东西时,你会更加欣赏它。
标签: prolog crossword prolog-dif