2012-03-13 3 views
6

Креоль острова Рая имеет 14 слов: «отбросить», «ушка», «анаграмма», «лодка», «лодочник», «ребенок», «подключиться», «изящно», «улучшить «остров», «человек», «песок», «солнце» и «женщина».Решатель кроссвордов в PROLOG

Рай Времена опубликовали этот кроссворд:

The Paradise Times Crossword

Кроссворд содержит некоторые из 14 слов, но без каких-либо других слов.

Написать программа Пролог, который начинается с

word(X) :- 
member(X, 
[ 
[a,b,a,n,d,o,n], [a,b,a,l,o,n,e], [a,n,a,g,r,a,m], 
[b,o,a,t], [b,o,a,t,m,a,n], [c,h,i,l,d], 
[c,o,n,n,e,c,t], [e,l,e,g,a,n,t], [e,n,h,a,n,c,e], 
[i,s,l,a,n,d], [m, a, n], [s,a,n,d], 
[s,u,n], [w, o, m, a, n] 
]). 

solution(H1,H2,H3,V1,V2,V3) :- 

и определяет предикат solution таким образом, что

solution(H1,H2,H3,V1,V2,V3) 

истинно тогда и только тогда, когда H1, H2, H3, V1, V2 и V3 являются действительными словами P aradise Остров, который образует действительное кроссворд, записанный в сетку, указанную выше. (Например, вторая буква H1 должна совпадать со второй буквой из V1.)

использовать запрос

?- solution(H1,H2,H3,V1,V2,V3). 

решить кроссворд. Найти все решения кроссворда.

Подсказка: вы можете начать с меньшего кроссворда и менее богатого лексикона .

+0

OMG, я пытаюсь решить этот самый вопрос прямо сейчас! Я не могу в это поверить! – andreapier

+0

Дайте мне знать, как вы прогрессируете –

+1

Упомянуто и смотрело, потому что я хотел бы видеть решения. домашняя работа, хотя, пожалуйста, пометьте ее как таковую. – Bill

ответ

1

Не пролог программа сама по себе, но решение с использованием Constraint Logic Programming можно найти в Hakan Kjellerstrand's excellent blog on CP. Он находится в ECLiPSe, но легко адаптируется к другим системам Prolog с конечными решателями домена. Использование CLP вместо чистого Prolog сделает поиск намного быстрее.

9

Просто посмотрите на картинку, слова написаны буквами, у вас есть все на картинке, переведите ее в строки Prolog (мое решение имеет 12 строк, 2 строки для одного слова).

[EDIT] Поскольку каждое тело дает свое собственное решение, вот мое:

solution(H1,H2,H3,V1,V2,V3) :- 
    H1 = [_,A2,_,A4,_,A6,_], 
    H2 = [_,B2,_,B4,_,B6,_], 
    H3 = [_,C2,_,C4,_,C6,_], 
    V1 = [_,A2,_,B2,_,C2,_], 
    V2 = [_,A4,_,B4,_,C4,_], 
    V3 = [_,A6,_,B6,_,C6,_], 
    maplist(word, [H1,H2,H3,V1,V2,V3]). 

PS Первоначально я написал слово (H1), слово (H2) ...

+0

Я не кодировал в Prolog 15 лет, даже не могу вспомнить, как это выглядит, но я бы хотел увидеть ваше решение из любопытства! – assylias

+0

Мое решение для это кроссворд, это не общее решение. Я просто переводил то, что вижу. – joel76

+0

Это тот же пример, который я написал сегодня ... Однако это не совсем то, что @Jonny Tim спросил. – andreapier

1
solution(H1, H2, H3, V1, V2, V3) :- 
    crosswordize([H1,H2,H3], [V1,V2,V3]), 
    maplist(word, [H1,H2,H3,V1,V2,V3]). 

crosswordize([], [[_],[_],[_]]). 
crosswordize([[_, X1, _, X2, _, X3, _]|Lines], 
      [[_, X1|R1], [_, X2|R2], [_, X3|R3]]) :- 
    crosswordize(Lines, [R1,R2,R3]). 

Алгоритм не является сложным:

  • мы строим сетку через crosswordize/2 предикат вызова
  • мы говорим пролог, что каждый список слово

crosswordize/2 сказуемое происходит через колонки две ячейки в то время, при строительстве линий.Если вы этого не сделаете, вы по-прежнему можете «жестко записать» его, как это сделал Уилл, он тоже работает!

+0

нам разрешено использовать одно и то же слово более одного раза в кроссвордах? Я думаю, обычно нет. –

+0

Хорошо, что определение говорит, что кроссворд действителен тогда и только тогда, когда каждое lis Это действительное рая. Так как это то, если и только если я рассматриваю участника вместо того, чтобы выбрать, чтобы он был действительным! – m09

+0

btw with member/2 У меня нет решения с тем же словом, которое повторяется, так что так или иначе не изменится, что многие вещи в этой проблеме: p – m09

2

Уникально домена выбора select/2 делает трюк:

select([A|As],S):- select(A,S,S1),select(As,S1). 
select([],_). 
words(X) :- X = [ 
    [a,b,a,n,d,o,n], [a,b,a,l,o,n,e], [a,n,a,g,r,a,m], 
    [b,o,a,t],  [b,o,a,t,m,a,n], [c,h,i,l,d], 
    [c,o,n,n,e,c,t], [e,l,e,g,a,n,t], [e,n,h,a,n,c,e], 
    [i,s,l,a,n,d], [m, a, n],  [s,a,n,d], 
    [s,u,n],   [w, o, m, a, n] 
    ]. 
solve(Crossword):- words(Words), 
    Crossword = [ [_,A2,_,A4,_,A6,_], 
        [_,B2,_,B4,_,B6,_], 
        [_,C2,_,C4,_,C6,_], 
        [_,A2,_,B2,_,C2,_], 
        [_,A4,_,B4,_,C4,_], 
        [_,A6,_,B6,_,C6,_] ], 
    select(Crossword, Words). 
solve:- solve(Crossword), 
     maplist(writeln, Crossword), writeln(';'), fail 
    ; writeln('No more solutions!'). 

Тест:

7 ?- solve. 
[a, b, a, n, d, o, n] 
[e, l, e, g, a, n, t] 
[e, n, h, a, n, c, e] 
[a, b, a, l, o, n, e] 
[a, n, a, g, r, a, m] 
[c, o, n, n, e, c, t] 
; 
[a, b, a, l, o, n, e] 
[a, n, a, g, r, a, m] 
[c, o, n, n, e, c, t] 
[a, b, a, n, d, o, n] 
[e, l, e, g, a, n, t] 
[e, n, h, a, n, c, e] 
; 
No more solutions! 

Это решение позволяет только уникальные слова, которые будут использоваться в головоломке (без дубликатов не допускается). Это может быть или не быть тем, что вы намеревались.

0

Теория здесь состоит в том, чтобы проверить буквы, которые соответствуют им в вертикальных и горизонтальных словах. Это может быть достигнуто с помощью заполнителей в правиле word. Оформить заказ этого вопроса https://gist.github.com/ITPol/f8f5418d4f95015b3586, он дает ответ, в котором претензии не имеют повторений. Однако, исходя из SQL, я думаю, что для правильного сдерживания повторений потребуется решение по строкам V1 @< V2; потому что просто использовать «не равно» недостаточно. Простите множественные «[k] nots»; на самом деле это не так сложно. Pun предназначенный (:

+0

, если мы удалим выбранный элемент из пула доступных предметов, автоматически не будет повторений. Как я покажу в своем ответе. (вот что делает 'select/3'). –

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