我正在学习Alloy,并尝试创建关系为injective
和surjective
的谓词。我在合金中使用以下模型进行了尝试:
sig A {}
sig B {}
pred injective(r: A -> B) {
all disj a, a': r.B | no (a.r & a'.r)
}
pred inj {
no r: A -> B | injective[r]
}
run inj for 8
但是,我在no r
上遇到此错误:
无法执行分析,因为它需要更高阶 无法量化的量化。
我已经阅读了软件抽象中关于skolemization和其他一些SO问题的部分,但是我不清楚这是什么问题。我可以改写以解决此问题,还是遇到基本限制?
编辑:
经过一些试验后,问题似乎与否定有关。立即要求some r: A -> B | injective[r]
产生了一个内射的例子。从概念上讲,这是一个通常较难的问题,但在较小范围内,它们似乎或多或少是同构的问题。
EDIT2:
我发现使用以下模型,合金给了我一些例子,这些例子也满足了给我带来错误的注释谓词。
sig A {}
sig B {}
pred injective(r: A -> B) {
all disj a, a': r.B | no (a.r & a'.r)
}
pred surjective(r: A -> B) {
B = A.r
}
pred function(f: A -> B) {
all a: f.B | one a.f
}
pred inj {
some s: A -> B | function[s] && surjective[s]
// no r: A -> B | function[r] && injective[r]
}
run inj for 8
答案 0 :(得分:1)
这样想:每个Alloy分析都涉及模型查找,其中解决方案是一个将名称映射到关系的模型(在Alloy中称为实例)。要显示公式根本不存在任何模型,可以运行它,并且如果Alloy没有找到解决方案,那么就没有模型(在该范围内)。因此,如果您运行
some s: A -> B | function[s] && surjective[s]
,您没有解决方案,您知道该范围内没有排斥功能。
但是,如果您要求Alloy找到一个与该模型不存在任何关系的模型,那将是一个非常不同的问题,并且需要进行更高阶的分析,因为求解器不能仅仅找到一个解决方案:它需要证明了满足否定约束的解没有扩展。您最初的示例就是这样。
所以,是的,这是一个基本限制,因为从根本上说,高阶逻辑很难处理。但实际上这是否对您构成限制是另一回事。您实际上需要什么分析?
高阶公式的一种令人信服的用法是合成。典型的综合问题采用“为我找到程序结构P,以便没有与规范S相反的例子”的形式。这需要更高阶的分析,这是Alloy *旨在解决的问题。
但是通常没有理由使用Alloy *解决标准验证/模拟问题。