我想知道为什么这个模型不一致?我们可以在剃须中使用以下元组。
shaves = {(man,man)}
sig Man {shaves: set Man}
one sig Barber extends Man {}
fact {
Barber.shaves = (m:Man |m not in m.shaves}
}
Barber.shaves将产生0个元组。在这种情况下,事实应该是有效的。那么为什么允许告诉我我的模型不一致?
非常感谢对此提出一些建议。
答案 0 :(得分:3)
好的,这是解决方案。这个想法非常简单,我认为作者真的应该在他们的书中解释这一点。
混乱的关键在于事实陈述。
Barber.shaves = {m:Man |我不在m.shaves}
基本上,上述陈述所说的是,Barber.shaves中的任何元组都不能刮胡子。例如= Barber.shaves = {(m)},那么(m,m)绝不会出现在剃须关系集中。还有m:男人表示每个不刮胡子的男人也应该在Barber.shaves。
当我们来到Barber实例时会出现问题。如果理发师不在Barber.shaves中,那么它违反了m:Man。如果包括理发师,那么它会违反m而不是m.shaves,因为剃须会包含{(barber,barber)}
我希望这能像我一样清除合金初学者的困惑。
因此,鉴于我的问题中的当前模型,合金无法创建满足此事实的实例。
答案 1 :(得分:3)
只使用英语有一个简单的解释。
上面的合金事实说,理发师(只有一个理发师,因为one sig Barber
)刮胡子的男人组完全等于所有不刮胡子的男人。起初,这种说法是有道理的,因为每个人要么刮胡子,要么被理发师刮胡子。
然后问题就是“谁刮胡子”。如果理发师不刮胡子,那么理发师必须刮掉理发师,这与理发师不刮胡子的假设相矛盾。如果理发师确实刮胡子,那么事实迫使理发师不得刮掉理发师,这又是一个悖论,因此找不到任何实例。