2014-01-19 2 views
4

Я пытаюсь изучить Prolog после уроков на сайте this, и я не могу найти решение для упражнения (и на сайте нет решения).Изучение пролога: решение схемы кроссворда

Вот что я должен сделать:

Вот шесть итальянских слов:

astante, Астория, baratto, Cobalto, пистолетного, Statale.

Они должны быть организованы, кроссворд моды, в следующей сетке:

scheme

Следующая база знаний представляет собой лексикон, содержащий эти слова:

  • слово (astante, , с, т, а, п, т, е).
  • слово (astoria, 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).
  • слово (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, и я не знаю почему.

Любой намек на это?

EDIT:

После комментария @ 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 свой комментарий, я заметил, что мой первый код был неправ, потому что я объявил H1, H2 и H3 несколько раз, так что результат вычисляется во второй строке вносятся изменения в шестом, и это привело к No, возвращенному Prolog.

Таким образом, вместо того, чтобы делать вещи в несколько строк, я слил их с этим результатом:

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

Смежные вопросы