Alloy 使用所有定义关系的子集

Alloy 使用所有定义关系的子集,alloy,Alloy,假设我试图在一个断言中定义一个关系,它说“除了Foo和包含Foo的关系之外,没有循环”(通过这里的检查,这是非常正确的) 上面的断言创建了一些最初未在模型中定义的$foo_rel关系。如何将其限制为我在sigs中指定的关系?变量$foo\u rel和$foo\u s是由于对一个算术2元组进行量化而引入的。(就我个人而言,到目前为止,我忽略了skolemization的细节,只在它不起作用时才讨厌它。) 然而,我不认为这是你的问题。我运行了没有整数的模型: module test sig Foo

假设我试图在一个断言中定义一个关系,它说“除了Foo和包含Foo的关系之外,没有循环”(通过这里的检查,这是非常正确的)


上面的断言创建了一些最初未在模型中定义的
$foo_rel
关系。如何将其限制为我在
sig
s中指定的关系?

变量
$foo\u rel
$foo\u s
是由于对一个算术2元组进行量化而引入的。(就我个人而言,到目前为止,我忽略了skolemization的细节,只在它不起作用时才讨厌它。)

然而,我不认为这是你的问题。我运行了没有整数的模型:

module test

sig Foo {}

sig A {
    b: set B,
    foo: one Foo
}

sig B {
    foo: one Foo
}

assert foo {
    all s: (univ - Foo) | all rel: (univ - Foo) -> (univ - Foo) |
    s not in s.*rel
}

check foo for 2
这提供了以下解决方案:

check foo for 2 but 0 int
很明显,如果你量化了
所有rel:(univ-Foo)->(univ-Foo)
这将包括周期

> univ-Foo
┌──┐
│B⁰│
└──┘
> (univ - Foo) -> (univ - Foo)
┌──┬──┐
│B⁰│B⁰│
└──┴──┘

我认为人们对合金模型的工作原理有一些误解。我希望这有助于更好地探索这些模型?

如果您提供一个可运行的模型和关于输出的更多细节,这将有所帮助。我不确定我是否理解你试图实现的目标。如果你有实际产出,你可以描述你想要的不同。谢谢你的回复。我添加了一个例子(希望)使问题更容易理解。谢谢,我不知道评估者,这肯定对实验有很大帮助。
> univ-Foo
┌──┐
│B⁰│
└──┘
> (univ - Foo) -> (univ - Foo)
┌──┬──┐
│B⁰│B⁰│
└──┴──┘
> B⁰.*((univ - Foo) -> (univ - Foo))
┌──┐
│B⁰│
└──┘