MIT Alloy:接收者表示法中的谓词

MIT Alloy: Predicate in Receiver Notation

我有一个简单的银行模型,有两种账户类型 A 和 B

abstract sig Account {}
sig A extends Account {}
sig B extends Account {}

sig Customer {
    hasAccount: some Account
}

sig Bank {
    hasCustomer: some Customer
}

我想表达的是,所有客户如果有一个A类账户,就必须至少有一个B类账户。我的判断:

pred Customer::BifA(){
    some a:A,b:B | a in this.hasAccount => b in this.hasAccount
}

但是,这不会产生预期的结果。分析器给我的许多实例都包含拥有 A 类帐户但不是 B 类帐户的客户。

我的谓词哪里错了?

您不应该对 A 使用存在量化。假设客户没有 A 类型的帐户。有了那个帐户,暗示是微不足道的。

改成通用量化应该可以。类似于:

all a:A | a in this.hasAccount => some b:B | b in this.hasAccount