无法量化的高阶量化

时间:2018-12-15 17:05:52

标签: alloy

我正在学习Alloy,并尝试创建关系为injectivesurjective的谓词。我在合金中使用以下模型进行了尝试:


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

1 个答案:

答案 0 :(得分:1)

这样想:每个Alloy分析都涉及模型查找,其中解决方案是一个将名称映射到关系的模型(在Alloy中称为实例)。要显示公式根本不存在任何模型,可以运行它,并且如果Alloy没有找到解决方案,那么就没有模型(在该范围内)。因此,如果您运行

some s: A -> B | function[s] && surjective[s]

,您没有解决方案,您知道该范围内没有排斥功能。

但是,如果您要求Alloy找到一个与该模型不存在任何关系的模型,那将是一个非常不同的问题,并且需要进行更高阶的分析,因为求解器不能仅仅找到一个解决方案:它需要证明了满足否定约束的解没有扩展。您最初的示例就是这样。

所以,是的,这是一个基本限制,因为从根本上说,高阶逻辑很难处理。但实际上这是否对您构成限制是另一回事。您实际上需要什么分析?

高阶公式的一种令人信服的用法是合成。典型的综合问题采用“为我找到程序结构P,以便没有与规范S相反的例子”的形式。这需要更高阶的分析,这是Alloy *旨在解决的问题。

但是通常没有理由使用Alloy *解决标准验证/模拟问题。