繁体   English   中英

合金均等

[英]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始终为真:对于任何模型实例,实例中的人员集合将与实例中的人员集合相同。 因此,条件将始终为真,并且事实实际上不会对模型实例施加任何约束。

目前尚不清楚如何最好地帮助您前进。 也许一种开始的方法是问自己要尝试在模型中捕获以下哪些语句。

  • 有一组人。
  • 有些人是男性(性别=“男人”)。 其他不是男性。
  • 约翰是男性。
  • 史蒂夫是男性。
  • 约翰和史蒂夫是不同的人。
  • 如果x和y是具有相同性别的个体,则x和y是相同的个体。 即没有两个人具有相同的性别。

请注意,这些语句不能同时全部成立。 (如果不是很明显,那么您可能比尝试找出原因做得更糟。Alloy在此方面可能会有所帮助。)

祝好运。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM