2014-01-19 30 views
4

我想學習Prolog關於this網站的教程,我無法找到一個解決方案的練習(並沒有在網站上的解決方案)。學習序言:解決填字遊戲計劃

這是我必須做的:

這裏有六個意言:

astante,道夫,baratto,cobalto,pistola,statale。

它們應佈置,縱橫字謎方式,在下面的網格:

scheme

下列知識庫表示含有這些詞的詞典:

  • 字(astante,一個,S,T,A,N,T,E)。
  • 單詞(astoria,a,s,t,o,r,i,a)。
  • 單詞(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)。
  • 單詞(statale,s,t,a,t,a,l,e)。

寫一個謂詞填字/ 6,告訴我們如何填寫網格。前三個參數應該是從左到右的垂直單詞,最後三個參數應該是從上到下的水平單詞。現在

,同樣的問題已經被問there但每個給定的解決方案使用的東西,我不知道(我不應該知道解決這一問題)。

爲了說明問題,雖然鏈接問題中的內容肯定有效,但它們使用的是我正在遵循的指南中尚未解釋的內容,這意味着我需要解決練習而沒有使用那種東西,所以沒有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的評論,我已經使用this溶液中發現的代碼嘗試。

下面的代碼:

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

+1

你可以看一下這個問題http://stackoverflow.com/questions/9693501/crossword-solver-in-prolog/9698240#9698240 – joel76

+0

你真的花了一些時間來閱讀這個問題?我已經說過,我不必使用這個問題中提出的事情。我編輯了這個問題來澄清這件事。 – StepTNT

+2

好的,但我認爲你應該仔細閱讀它們,例如你只需要定義一次V1,V2,V3,H1,H2,H3並查看它們之間常見的單元格。 – joel76

回答

2

試了幾次後,並根據@ joel76的評論,我發現我的第一個代碼是錯誤的,因爲我宣佈H1H2H3多次,所以在第二行計算出的結果是在第六,這正在改變導致由Prolog返回的No

所以,與其在多行做的事情,我合併他們對這個結果:

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

,現在它的工作。

+1

您在發表我的最新評論時發佈了此答案。 – joel76

5
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. 
+0

謝謝,我瞭解了匿名變量。 – goelakash

+0

感謝您給我添加'V1 \ = H1'的想法。我想出了相當於你的東西,但是減去了這個數字,它給了我一個「astante,baratto,statale,astante,baratto,statale」(它適合,但看起來很不雅,因爲有一半的詞語會浪費掉)。但爲什麼它停止在那?我認爲列舉所有解決方案並非列入Prolog的性質,而是要找到一個解決方案後才能停下來? – Lori

+0

@Lori對不起,但我不明白你的問題:( – Arik