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
我有一个简单的银行模型,有两种账户类型 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