Как получить функциональность перерыва в PDDL? - PullRequest
2 голосов
/ 23 июня 2019

Я пытаюсь решить головоломку Light Up , используя PDDL. Чтобы реализовать эффект от размещения лампы в ячейке, я должен поместить лампу в (x, y), а затем зажечь ту же строку и столбец, пока не будет черной ячейки. Я не могу осветить клетки до черной клетки.

Например, для сетки 5 * 5, если я хочу разместить лампочку в точке (0,1), а в точке (3, 1) есть черная ячейка, я бы хотел зажечь только ячейки (0,1 ), (1,1), (2,1), если я рассматриваю только столбец. Но я бы не хотел освещать ячейку (4,1), как после черной ячейки.

Итак, если я использую что-то наподобие forall, как бы я разорвал цикл for all, когда он находит черную ячейку на пути в строке / столбце?

1 Ответ

0 голосов
/ 24 июня 2019

Я думаю, что стоило бы взглянуть на аксиомы и производные предикаты в PDDL. Это позволяет построить транзитивное замыкание и получить информацию из других переменных.

Фактически, вы можете определить, какие ячейки имеют свет, исходя из информации о структуре сетки (какие ячейки черные) и лампочек. Таким образом, вы можете определить производный предикат lit ((x, y)) для каждой ячейки и написать фоновую теорию с аксиомами:

  • горит ((х, у)) <= лампа ((х, у)) </li>
  • горит ((x, y)) <= горит ((x ', y')) и подключен ((x, y), (x ', y')) и ~ черный ((x, y)) </li>

Формула цели, вероятно, будет выглядеть примерно так: "lit ((0,0)) и ... and ... lit ((n, m))" для всех не черных ячеек.

...