2016-01-27 2 views
7

enter image description hereРешение Kakuro головоломки (5x5) в Прологе

Предполагая, что:

A+B+C=24 
E+F+G=11 
J+K+L=22 
N+O+P=14 
A+E=17 
B+F+J+N=26 
C+G+K+O=15 
L+P=13 

Как я мог найти возможное решение проблемы, учитывая вышеуказанные ограничения, используя предикат solve/1? Моя первая попытка была ниже, без результата. Заранее спасибо!

solve(L1) :- 
    L1 = [A,B,C,E,F,G,J,K,L,N,O,P], 
    A is 24-B-C, 
    B is 26-F-J-N, 
    C is 15-G-K-O, 
    E is 11-F-G, 
    E is 17-A, 
    J is 22-K-L, 
    N is 14-O-P, 
    L is 13-P, 
    write(L1). 
+1

Хорошо, теперь это лучше? –

+3

Я не вижу, как бы вы получили «никакого результата» от этого кода. Я бы ожидал ошибки при создании. Пожалуйста, опишите ваши результаты точно. Попробуйте использовать CLPFD. Например, 'A + B + C# = 24' вместо' A - 24-B-C'. 'Is/2' требует, чтобы переменные во втором выражении все были созданы. – lurker

+3

Очень хорошо! – false

ответ

3

Как @lurker уже сказал в своем комментарии, используйте CLP (FD) ограничения.

Кроме того, я рекомендую:

  1. вместо solve/1 используйте декларативного имя как solution/1. Вы должны описать то, что имеет место для решения, так что отношение имеет смысл во всех направлениях, например, если решение уже задано, и вы хотите его проверить.
  2. По соглашению, имеет смысл переносить переменные, которые обозначают , перечисляет с   s.
  3. Отдельные побочные эффекты от чистого кода. На самом деле, удалить побочных эффектов в целом. Позвольте сделать печать для вас!

Например:

:- use_module(library(clpfd)). 

solution(Ls) :- 
    Ls = [A,B,C,E,F,G,J,K,L,N,O,P], 
    A #= 24-B-C, 
    B #= 26-F-J-N, 
    C#= 15-G-K-O, 
    E #= 11-F-G, 
    E #= 17-A, 
    J #= 22-K-L, 
    N #= 14-O-P, 
    L #= 13-P. 

Это уже работает для запросов, как:

?- solution(Ls), Ls ins 0..sup, label(Ls). 
Ls = [6, 3, 15, 11, 0, 0, 9, 0, 13, 14, 0, 0] ; 
Ls = [6, 3, 15, 11, 0, 0, 10, 0, 12, 13, 0, 1] ; 
Ls = [6, 3, 15, 11, 0, 0, 11, 0, 11, 12, 0, 2] ; 
etc. 

Я оставляю это как завершения легкого упражнения.

+0

Спасибо за помощь, я также забыл указать, что решения должны быть между [0-9], что означает, что запрос изменен на: решение (Ls), Ls ins 0..9, label (Ls). Проблема в том, что не может быть одинаковых чисел в одной строке или столбце. Объясните: В приведенных ниже списках не должно быть дубликатов. L1 = [A, B, C] L2 = [E, F, G] L3 = [J, K, L, N] L4 = [N, O, P] L5 = [A, E] L6 = [B, F, J, N] L7 = [C, G, K, O] L8 = [L, P] Как я могу выразить эти ограничения? –

+1

Попробуйте ограничение CLP (FD) 'all_distinct/1'. – mat

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