在Alloy中隐藏一个子类型的字段

afs*_*tos 3 overloading subtype alloy

假设我在合金4.2中有以下签名声明:

sig Target {}

abstract sig A {
    parent: lone A,
    r: some Target
}

sig B extends A {}
sig C extends A {}
Run Code Online (Sandbox Code Playgroud)

在运行时,生成的实例将具有从每个B到一些Target,从C一些到一些的箭头Target.

我怎么能只隐藏箭头B
我首先尝试了以下内容:

abstract sig A {
    parent: lone A
}

sig B extends A {
    r: some Target
}

sig C extends A {
    r: some Target
}
Run Code Online (Sandbox Code Playgroud)

这会给我掌控rB,但是写性能时,它引入了一个很大的模糊性.我想尽量保持这些简单.例如:

all a: A | a.r = parent.a.r
Run Code Online (Sandbox Code Playgroud)

以上说aTargets是一套a的儿童Targets.
对于后面的声明,我将不得不重写它

all b: B | b.r = parent.b.((B <: r) + (C <: r))
all c: C | c.r = parent.c.((B <: r) + (C <: r))
Run Code Online (Sandbox Code Playgroud)

这是不可取的.

是否有任何解决方法可以拥有一般字段,但仍然可以控制显示的箭头?

小智 5

您可以定义一个与(C <:r)完全对应的函数:

fun C_r : A -> Target {
    (C <: r)
}
Run Code Online (Sandbox Code Playgroud)

在Alloy可视化工具中,您将可以访问关系$ C_r.然后,您可以关闭关系r的"显示为弧",但仍然可以看到$ C_r.这应该隐藏属于(B <:r)的边集.