我正在尝试按照本Prolog
网站上的教程学习,但我找不到练习的解决方案(并且网站上没有解决方案)。
这是我必须做的:
这里有六个意大利语单词:
astante , astoria , baratto , cocoto , pistola , statale .
它们将按照填字游戏的方式排列在以下网格中:
以下知识库表示包含这些单词的词典:
- 单词(astante,a,s,t,a,n,t,e)。
- 字(阿斯托利亚,a,s,t,o,r,i,a)。
- 单词(baratto,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,告诉我们如何填写网格。前三个参数应该是从左到右的垂直词,后三个参数应该是从上到下的水平词。
现在,那里已经提出了同样的问题,但是每个给定的解决方案都使用了我不知道的东西(而且我不应该知道解决这个问题)。
澄清一下,虽然链接问题中的东西肯定有效,但它们使用了我正在遵循的指南中尚未解释的东西,这意味着我需要在不使用那种东西的情况下解决练习,所以不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).
(如果格式不正确,我很抱歉,但我仍然不知道正确的缩进样式是什么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
。