学习序言:解决填字游戏 [英] Learning Prolog: solving a crossword scheme

查看:13
本文介绍了学习序言:解决填字游戏的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试按照 问了同样的问题,但每个给定的解决方案都使用了我不知道(而且我不应该知道要解决这个问题).

澄清一下,虽然链接问题中的内容确实有效,但它们使用了我正在遵循的指南中尚未解释的内容,这意味着我需要解决这个练习 没有使用那种东西,所以没有maplist之类的东西.

我的想法是用给定单词中的字母填满黑板,但有一些限制:

  • V1 中的单词的第二个字符必须是 H1 中单词的第二个字符
  • V1 中的单词的第四个字符必须是 H2 中单词的第二个字符
  • V1 中的单词的第六个字符必须是 H3 中单词的第二个字符

等等..

这是我的代码:

word(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).填字游戏(V1,V2,V3,H1,H2,H3):- 字(V1,V11,V12,V13,V14,V15,V16,V17),字(H1,H11,V12,H13,H14,H15,H16,H17),字(H2,H21,V14,H23,H24,H25,H26,H27),字(H3,H31,V16,H33,H34,H35,H36,H37),字(V2,V21,V22,V23,V24,V25,V26,V27),字(H1,H11,H12,H13,V22,H15,H16,H17),字(H2,H21,H22,H23,V24,H25,H26,H27),字(H3,H31,H32,H33,V26,H35,H36,H37),字(V3,V31,V32,V33,V34,V35,V36,V37),字(H1,H11,H12,H13,H14,H15,V32,H17),字(H2,H21,H22,H23,H24,H25,V34,H27),字(H3,H31,H23,H33,H34,H35,V36,H37).

(如果格式不正确,我很抱歉,但我仍然不知道 Prolog 的正确缩进样式是什么).

当然,如果我的想法似乎是正确的(至少对我而言),这段代码会返回 No 而我不知道为什么.

对此有任何提示吗?

根据@mbratch 的评论,我尝试使用 这个解决方案.

代码如下:

填字游戏(V1、V2、V3、H1、H2、H3):-字(V1,V1a,V1bH1b,V1c,V1dH2b,V1e,V1fH3b,V1g),字(V2,V2a,V2bH1d,V2c,V2dH2d,V2e,V2fH3d,V2g),字(V3,V3a,V3bH1f,V3c,V3dH2f,V3e,V3fH3f,V3g),字(H1,H1a,V1bH1b,H1c,V2bH1d,H1e,V3bH1f,H1g),字(H2,H2a,V1dH2b,H2c,V2dH2d,H2e,V3dH2f,H2g),字(H3,H3a,V1fH3b,H3c,V2fH3d,H3e,V3fH3f,H3g).

代码可以工作,但它有重复的问题,我不介意.

我想了解的是为什么这个有效,而我的返回No.

解决方案

经过几次尝试,根据@joel76 的评论,我注意到我的第一个代码是错误的,因为我声明了 H1,H2H3 多次,因此第二行计算的结果在第六行被更改,这导致 Prolog 返回 No.

因此,我没有在多行中执行操作,而是将它们与以下结果合并:

填字游戏(V1,V2,V3,H1,H2,H3):- 字(V1,V11,V12,V13,V14,V15,V16,V17),字(V2,V21,V22,V23,V24,V25,V26,V27),字(V3,V31,V32,V33,V34,V35,V36,V37),字(H1,H11,V12,H13,V22,H15,V32,H17),字(H2,H21,V14,H23,V24,H25,V34,H27),字(H3、H31、V16、H33、V26、H35、V36、H37).

现在它正在工作.

I'm trying to learn Prolog following the tutorials on this site and I can't find a solution to an exercise (and there's no solution on the site).

Here's what I have to do:

Here are six Italian words:

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

They are to be arranged, crossword puzzle fashion, in the following grid:

The following knowledge base represents a lexicon containing these words:

  • 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).

Write a predicate crossword/6 that tells us how to fill in the grid. The first three arguments should be the vertical words from left to right, and the last three arguments the horizontal words from top to bottom.

Now, the same question has been asked there but each given solution uses things that I don't know (and I'm not supposed to know to solve this).

To clarify, while the things in the linked question are surely working, they use stuff that hasn't been explained yet in the guide that I'm following, and this means that I need to solve the exercise without using that kind stuff, so no maplist and things like that.

My idea was to fill the board with the letters from the given words, with some constraints:

  • the word in V1 must have, as its second character, the second character of the word in H1
  • the word in V1 must have, as its fourth character, the second character of the word in H2
  • the word in V1 must have, as its sixth character, the second character of the word in H3

and so on..

So here's my code:

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). 

(I'm sorry if this is not formatted well but I still don't know what's the correct indentation style for Prolog).

Of course, event if my idea seems correct (at least to me), this code returns No and I don't know why.

Any hint on this?

EDIT:

Following @mbratch's comment, I've tried using the code found in this solution.

Here's the code:

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).

The code works, but it has a problem with duplicates which I don't mind.

What I'd like to understand is why this one works while mine returns No.

解决方案

After few tries, and based on @joel76's comment, I noticed that my first code was wrong because I declared H1,H2 and H3 multiple times, so the result computed in the second line was being changed in the sixth and this led to the No returned by Prolog.

So, instead of doing things in multiple lines, I merged them with this result:

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).

and now it's working.

这篇关于学习序言:解决填字游戏的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆