学习Prolog:解决填字游戏计划

Ste*_*TNT 6 prolog crossword

我正在尝试学习网站Prolog上的教程,我找不到练习的解决方案(并且网站上没有解决方案).

这就是我要做的事情:

这里有六个意大利语单词:

astante,astoria,baratto,cobalto,pistola,statale.

它们将被安排,填字游戏时尚,在以下网格中:

方案

以下知识库代表包含以下单词的词典:

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

写一个谓词填字游戏/ 6告诉我们如何填写网格.前三个参数应该是从左到右的垂直单词,最后三个参数是从上到下的水平单词.

现在,同样的问题已被问到,但每个给定的解决方案使用我不知道的东西(我不应该知道解决这个问题).

为了澄清,虽然链接问题中的内容确实有效,但他们使用的内容尚未在我所遵循的指南中解释,这意味着我需要在使用那种东西的情况下解决练习,所以没有maplist和那样的事情.

我的想法是用给定单词中的字母填充董事会,但有一些限制:

  • V1中的单词必须具有H1中单词的第二个字符作为其第二个字符
  • V1中的单词必须具有H2中单词的第二个字符作为其第四个字符
  • V1中的单词必须具有H3中单词的第二个字符作为其第六个字符

等等..

所以这是我的代码:

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). 
Run Code Online (Sandbox Code Playgroud)

(如果格式不正确,我很抱歉,但我仍然不知道什么是正确的缩进样式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).
Run Code Online (Sandbox Code Playgroud)

代码有效,但它有重复的问题,我不介意.

我想要理解的是为什么这个在我的回归时有效No.

小智 7

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.
Run Code Online (Sandbox Code Playgroud)

  • 你如何实际运行查询? (2认同)

Ste*_*TNT 2

经过几次尝试,根据@joel76的评论,我注意到我的第一个代码是错误的,因为我声明了H1,H2H3多次,所以第二行中计算的结果在第六行中被更改,这导致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).
Run Code Online (Sandbox Code Playgroud)

现在它正在发挥作用。