我是OCL的新手,目前正试图弄清楚如何进行不变式。 我附上了正在处理的图表的图片。
我要解决的不变式是:
a)玩家手中有0或2张牌。
Context Player
inv i1: self.card->size()=0 or self.card->size()=2
b)没有玩过任何回合的玩家,其游戏资本不能超过桌子的最高买入额。
Context Player
inv i2: self.numberOfRounds=0 implies (self.gameCapital < self.Table.maxBuyIn)
c)在每个桌子上只能有属于不同用户的玩家
Context Player
inv i3: Player.UserAccount.allInstances().userID->isUnique()
我不确定'allInstances()'应该在Player之后还是在PlayerAccount之后。 而且我不知道我该如何处理文本的“在每张桌子上”部分。
还有两点我真的不知道该怎么做。
d)甲板上有52张卡片,它们在颜色或价值上互不相同
e)当bidDone为True时,手中仍然有纸牌的所有玩家的输入均相等。
您能告诉我我到目前为止所做的是否正确,也许可以为d)和e)提供一些建议或解决方案?
感谢您的帮助!
答案 0 :(得分:0)
似乎合理,但我建议您使用明智的名称,因为验证工具会报告例如Constraint Player :: i2对于...不满意。
b)似乎有一个<=错误
c)allInstances采用类型源,因此为“ Player”。是错的。 allInstances通常执行效率非常低,因此仅应作为最后的手段。对于您而言,这显然是错误的,因为您的范围是“在每个表中”。您应该使用上下文表,然后在表上对玩家进行推理。
d)如果将“与...不同”改写为“相对于”而言是唯一的,则也许可以看到如何使用颜色+值元组作为唯一性的基础。
e)不知道输入是什么,但似乎就像是一系列的impacts子句。