对于这种合金模型ff_next
中的排序谓词的第一分支,似乎有些不了解。
open util/ordering[Exposure]
open util/ordering[Tile]
open util/ordering[Point]
sig Exposure {}
sig Tile {}
sig Point {
ex: one Exposure,
tl: one Tile
} fact {
// Uncommenting the line below makes the model unsatisfiable
// Point.ex = Exposure
Point.tl = Tile
}
pred ff_next[p, p': Point] {
(p.tl = last) => (p'.ex = next[p.ex] and p'.tl = first)
else (p'.ex = p.ex and p'.tl = next[p.tl])
}
fact ff_ordering {
first.ex = first
first.tl = first
all p: Point - last | ff_next[p, next[p]]
}
run {}
这里的直觉是我有很多曝光,我想在多个平铺位置上执行每个曝光。您可以考虑先制作全景图像,然后将它们拼接在一起,但是要使用不同的相机设置多次进行此操作。
在注释行注释掉的情况下,我得到的第一个实例是:
这等效于一次全景曝光,一次曝光一次,然后将另一次曝光降到地板上。
问题似乎是=>
中ff_next
之后的第一个分支,但我不明白这是怎么回事。该分支永远不会满足,它将移至下一个曝光和全景图的开始。如果我取消注释行Point.ex = Exposure
,则该模型将变得不满意,因为它需要该分支。
关于该分支为什么不能令人满意的任何帮助吗?
答案 0 :(得分:2)
您似乎要表达“在转到下一个曝光之前,每个图块都必须与当前曝光的点相对应”。问题是ordering
的一个重大陷阱:它迫使签名准确。如果你写
run {} for 6 but 3 Tile, 2 Exposure
然后按预期工作。 #Point = #Exposure * #Tile
时只有型号。如果您遇到问题,可以编写自己的ordering
简化版。