[英]Equality in alloy
我有一个包含以下内容的Alloy模型:
abstract sig person{}
one sig john,Steve extends person {Gender: man}
sig man{}
fact {
all name: person, Gender: man |
name.Gender = name.Gender => person =person}
如何使两个签名相等?
从您的问题中尚不清楚您要做什么,并且从您的示例Alloy代码来看,您似乎似乎正遭受一些困惑。
首先,您显示的模型以两种不同的方式使用名称Gender,这本身不是非法的,但似乎暗示了一些混淆。 (这肯定会使读者迷惑不解。)
在两个单例签名john和Steve的声明中,性别表示两个二进制关系,一个在签名john和签名的man之间持有,另一个在Steve和man之间持有。 用符号形式说同样的事情,性别代表(a)john-> man的一些子集,和(b)Steve-> man的一些子集。
但是,在匿名事实中,性别表示类型为man的变量。
如果您找到一种方法来重命名它们中的一个,则模型将更容易理解。 由于量化表达式中的变量名称是任意的,因此,如果将其重新格式化为
fact { all P : person, M : man | P.M = P.M => person = person }
如果这不是您要说的话,那么您可能想说些类似的话
fact { all P : person, M : man |
P.Gender = P.Gender => person = person
}
重命名变量将迫使您选择一种含义或另一种含义。 这是一件好事。 (一个不幸的事实是,Alloy的配方都不令人满意。但是让我们一次处理一个问题;摆脱双重使用Gender是第一步。)
第二个问题是无论您要表达的事实是什么,几乎可以肯定它并不意味着您要表达的意思。 暂时忽略模型的细节,您的事实采用以下形式
fact { all V1 : sig1, V2 : sig2 |
Expression = Expression => sig1 = sig1
}
对于模型中定义的某些Relation,其中Expression为V1.V2或V1.Relation。 这里有几处错误:
V1.V2是无意义的,其中V1和V2都是签名的名称或在给定签名范围内的变量:点运算符仅在其参数之一是关系的名称时才有意义。
如果任何表达式E都是有意义的,则无论E意味着什么,形式为E = E的布尔表达式(例如person.Gender = person.Gender)都是正确的。 用E表示的任何事物自然都将等于其自身。 所以有条件的话也可以写成
1 = 1 => person = person
出于相同的原因,无论模型如何,person = person始终为真:对于任何模型实例,实例中的人员集合将与实例中的人员集合相同。 因此,条件将始终为真,并且事实实际上不会对模型实例施加任何约束。
目前尚不清楚如何最好地帮助您前进。 也许一种开始的方法是问自己要尝试在模型中捕获以下哪些语句。
请注意,这些语句不能同时全部成立。 (如果不是很明显,那么您可能比尝试找出原因做得更糟。Alloy在此方面可能会有所帮助。)
祝好运。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.