2013-06-11 1 views
0

Я пытаюсь решить проблему ntiles, которая может быть описана как, у нас есть сетка. Затем мы хотим найти N плиток с заданным размером в сетке. У нас есть правила, такие как:Как найти n плиток в сетке - пролог

ntiles(A/B, Grid, N, Pos1/Pos2) :- 

И он должен вернуть возможные позиции, которые мы можем определить местонахождение плитки:

>ntiles(2/1,3,2,P). 

P=[1/1,1/3]?; 
P=[1/1,2/3]?; 
P=[2/1,1/3]?; 
P=[2/1,2/3]?; 
No. 

Я думаю, что это просто рекурсивная проблема, но я не мог управлять, чтобы решить эту проблему. Сначала я попытался найти плитки только в одной строке, начиная с позиции 1/1. Это означает, что я остаюсь в первом ряду только сейчас. Я думал, что, если я этого достиг, его легко реализовать для столбцов.

Вы поймете меня, когда вы проверяете свой код:

ntiles(A/B, G, N, K) :- 
    setof(X/Y, horizontal(A/B, G, N, X/Y), K). 

horizontal(A/B, G, N, P1/P2) :- 
    N > 0, 
    P is A + 2, 
    P =< G, 
    horizontal(A/B, G, N-1, P/1). 

Это коды возвращает «ложь». Я ожидал вернуть ему список К. У вас есть идея, что проблема?

Также вы можете дать мне понимание, чтобы решить эту проблему?

Заранее спасибо.

ответ

0

Есть много проблем.

Главное, что setof/3 следует использовать для получения всех решений, а затем требовать цель «генерировать на обратном пути», но вместо этого горизонтальный/4 кодируется как детерминированный конструктор списков.

Другие проблемы:

  • горизонтальный/4 будет успешным только тогда, когда N> 0. Как насчет базового случая (т.е. N является 0)?
  • P1, P2 singletons: они не могут играть никакой роли в вашем решении.
  • Арифметика должна оцениваться явно, тогда вместо передачи N-1 вы должны добавить - например, M is N-1 и передать M в рекурсивный вызов.

Вас может заинтересовать answer Я дал (очень) аналогичную проблему.