如何在 PDDL 中获取中断功能



我正在尝试使用 PDDL 解决 Light Up 难题。为了实现在单元格中放置灯泡的动作的效果,我必须在 (x, y( 中放置一个灯泡,然后只要没有黑色单元格就点亮同一行和同一列。我无法照亮牢房,直到黑色牢房。

例如,对于 5*5 的网格,如果我想在 (0,1( 处放置一个灯泡,并且在 (3, 1( 处有黑色单元格,如果我只考虑列,我只想点亮单元格 (0,1(、(1,1(、(2,1(。但我不想像黑色单元格之后那样点亮单元格 (4,1(。

那么,如果我使用 forall 之类的东西,当它在行/列中找到一个黑色单元格时,我将如何打破 for all 循环?

我认为值得看看PDDL中的公理和派生谓词。这使得构建传递闭包并从其他变量中获取信息成为可能。

事实上,你可以从网格结构(哪些细胞是黑色的(和灯泡的信息中得出哪些细胞有光。因此,您可以为每个单元格定义一个派生谓词 lit((x,y((,并用公理编写背景理论:

  • lit((x,y(( <= bulb((x,y((
  • lit((x,y(( <= lit
  • ((x',y'(( 和 connected((x,y(,(x',y'(( 和 ~black((x,y((

目标公式可能是这样的:"lit((0,0(( 和......和。。。lit((n,m(("表示所有非黑色单元格。

最新更新