Alloy 中没有字段的抽象签名的目的是什么?
What is the purpose of abstract signatures with no fields in Alloy?
我经常看到建模者在他们的模型中使用没有字段的抽象签名。抽象签名通常有子签名扩展但没有字段。例如,考虑杰克逊关于 Alloy 的书中的以下模型:
abstract sig A {}
sig A1 extends A {}
sig A2 extends A {}
没有字段,声明后A怎么用?将 A 抽象化有什么意义?如果 A 不是抽象的,模型将如何受到不同的约束?
你说得对,抽象签名的最大价值在于它有一个字段。因为 Alloy 有并集,所以你可以写 A1+A2
而不是 A
。但即使没有,也有优势:通过将 A
声明为 abstract
信号,我可以使我的模型更容易更改。如果我添加一个新的 sig A3
,我将不得不用 A1 + A2 + A3
替换 A1 + A2
,但是对于一个抽象的 sig,它仍然是 A
。它还为我提供了一个稍后添加字段的位置,并使规格更短。它允许我给它一个范围;如果我只有 A1
和 A2
,我将不得不分别设置它们的范围,但是将 A
的范围设置为 5(比方说)允许分析器以任何比例分配原子在 A1
和 A2
之间。在可视化中,我可以明确地将设置应用于 A。
我经常看到建模者在他们的模型中使用没有字段的抽象签名。抽象签名通常有子签名扩展但没有字段。例如,考虑杰克逊关于 Alloy 的书中的以下模型:
abstract sig A {}
sig A1 extends A {}
sig A2 extends A {}
没有字段,声明后A怎么用?将 A 抽象化有什么意义?如果 A 不是抽象的,模型将如何受到不同的约束?
你说得对,抽象签名的最大价值在于它有一个字段。因为 Alloy 有并集,所以你可以写 A1+A2
而不是 A
。但即使没有,也有优势:通过将 A
声明为 abstract
信号,我可以使我的模型更容易更改。如果我添加一个新的 sig A3
,我将不得不用 A1 + A2 + A3
替换 A1 + A2
,但是对于一个抽象的 sig,它仍然是 A
。它还为我提供了一个稍后添加字段的位置,并使规格更短。它允许我给它一个范围;如果我只有 A1
和 A2
,我将不得不分别设置它们的范围,但是将 A
的范围设置为 5(比方说)允许分析器以任何比例分配原子在 A1
和 A2
之间。在可视化中,我可以明确地将设置应用于 A。