Изучение Пролога: решение схемы кроссвордов

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

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

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

Астанте, Астория, Баратто, Кобальто, Пистолет, Статале.

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

схема

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

  • слово (astante, a,s,t,a,n,t,e).
  • слово (Астория, а, с, т, о, г, я, а).
  • слово (baratto, b,a,r,a,t,t,o).
  • слово (кобальто, с, о, б, а, л, т, о).
  • слово (пистолет, р, я, с, т, о, л, а).
  • слово (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). 

(Извините, если это не отформатировано, но я все еще не знаю, какой правильный стиль отступа для 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,

2 ответа

Решение

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

и теперь это работает.

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.
Другие вопросы по тегам