页Software Abstractions 293说,这两者是等价的:为什么多个Alloy声明不等价于嵌套的Alloy声明?
all x: X, y: Y | F
all x: X | all y: Y | F
但是这两个是不相等的:
one x: X, y: Y | F
one x: X | one y: Y | F
为什么是后两者并不等同?
我用最具体的例子来学习,所以我们举一个具体的例子。
上周我乘坐邮轮去了阿拉斯加。晚餐时,我和另外五个人坐在一起。其中一对夫妇(杰森和丹尼斯)正在庆祝他们的第25次(银)结婚纪念日。
我在餐桌上创建了人的合金模型。该模型规定,有一个L:男,女:女人夫妇其中m的妻子是W,W的丈夫为m,m,w为庆祝银色周年:
one m: Man, w: Woman |
m.wife = w and
w.husband = m and
m.anniversary = Silver and
w.anniversary = Silver
的情况下,合金分析仪生成的是我所期望的。
然后我修改为使用嵌套表达式表达:
one m: Man |
one w: Woman |
m.wife = w and
w.husband = m and
m.anniversary = Silver and
w.anniversary = Silver
的合金分析仪所产生的相同的实例!
接下来,我写了一个声明,声称这两个版本是相同的:
Version1 iff Version2
的合金分析仪返回:未找到反例!
下面是我的模型。为什么这两个版本是相同的?是否可以对模型做一些小小的调整,以显示嵌套版本和非嵌套版本之间的区别?罗杰的餐桌上的游轮到阿拉斯加
abstract sig Man {
wife: lone Woman,
anniversary: lone Anniversary
}
one sig Roger extends Man {}
one sig Jason extends Man {}
abstract sig Woman {
husband: lone Man,
anniversary: lone Anniversary
}
one sig Faye extends Woman {}
one sig Nina extends Woman {}
one sig Claudia extends Woman {}
one sig Denise extends Woman {}
abstract sig Anniversary {}
one sig Silver extends Anniversary {}
pred v1_One_couple_celebrating_25th_wedding_anniversary {
one m: Man, w: Woman | m.wife = w and w.husband = m and
m.anniversary = Silver and w.anniversary = Silver }
pred v2_One_couple_celebrating_25th_wedding_anniversary {
one m: Man |
one w: Woman |
m.wife = w and w.husband = m and
m.anniversary = Silver and w.anniversary = Silver }
assert Both_versions_are_identical {
v1_One_couple_celebrating_25th_wedding_anniversary
iff
v2_One_couple_celebrating_25th_wedding_anniversary
}
check Both_versions_are_identical