我有一个合金模型需要有一些规则,如
abstract sig country {}
one sig US extends country {}
one sig UK extends country {}
one sig DE extends country {}
one sig CA extends country {}
abstract sig currencyCode {}
one sig USD extends currencyCode {}
one sig GBP extends currencyCode {}
one sig CAD extends currencyCode {}
one sig EUR extends currencyCode {}
abstract sig location {}
one sig NewYork extends location {}
one sig Vancouver extends location {}
one sig London extends location {}
one sig Munich extends location {}
所以我想设置一个规则,这样每当实例选择US时,它也会选择USD和NewYork。如果它选择美元,那么它将选择美国和纽约,这意味着国家,地点和货币将被组合在一起。我尝试使用以下事实来做到这一点,但它不起作用。事实上有什么缺陷,无论如何都要做到这一点?
fact UKRL {
all a: itemType.site,
b: item.country,
c: item.currency,
d: startPrice.currencyId,
e: item.locationLink |
(a in UK) <=> (b in UK) <=> (c in GBP) <=> (d in GBP) <=> (e in London)
}
fact DERL {
all a: itemType.site,
b: item.country,
c: item.currency,
d: startPrice.currencyId,
e: item.locationLink |
(a in DE) <=> (b in DE) <=> (c in EUR) <=> (d in EUR) <=> (e in Munich)
}
答案 0 :(得分:0)
您没有展示足够的工作来让问题可靠地再现,因此任何答案都将基于猜想。我猜想您允许多个项目,并且您希望每个项目与某个国家/地区相关联,但您希望不同的项目可以与不同的国家/地区相关联。
您目前的事实表述UKRL和DERL存在一些问题。
首先,我猜你试图要求对任何项目,其国家,货币和locationLink应该相互一致(我非正式地使用'一致'一词)。但是,您的两个事实都不会限制单个项目的国家/地区,货币和locationLink,而是限制国家/地区,货币和locationLink关系的第二个位置中的所有值。所以UKRL意味着,投入英语:(a)所有itemTypes都有'UK'站点,所有商品都有'UK',所有商品货币都是'GBP',所有startPrice货币ID都是'GBP',所有项目位置链接是“伦敦”,否则(b)这些都不是真的。
问问自己:如果我有两个项目会发生什么,一个是国家英国,货币CAD,位置伦敦,一个是国家CA,货币EUR,位置慕尼黑?它是否满足这一事实? DERL这个事实怎么样?
如果您希望为单个国家设置模型的每个实例(所有项目具有相同的国家/地区,货币和位置链接),那么您的量词很好,但您的约束并不是说您想要的它说。你想要它说的是:要么为英国设置了一切,要么为德国设置了一切,或者为加拿大设置了一切,或者为美国设置了一切如果是我,我会尝试定义一个谓词是正确的,当且仅当一切都是为英国设置的 - 非常类似于你的事实UKRL,但使用AND,而不是&lt; =&gt;,和谓词,而不是事实。然后我为其他国家定义了三个。然后我会定义一个最终谓词(如果你愿意,你可以把它作为一个事实,但我通常会找到定义的东西,因为谓词可以帮助我更容易地进行实验),表示UKpred或DEpred或CApred或USpred必须为真。
如果您希望允许同一模型实例中的不同项目具有不同的国家/地区,则需要对项目进行量化,而不是对item.country(等)进行量化。
我希望这会有所帮助。