Barber Paradox为什么这个模型不一致?

时间:2012-11-21 12:48:55

标签: alloy

我想知道为什么这个模型不一致?我们可以在剃须中使用以下元组。

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个元组。在这种情况下,事实应该是有效的。那么为什么允许告诉我我的模型不一致?

非常感谢对此提出一些建议。

2 个答案:

答案 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)刮胡子的男人组完全等于所有不刮胡子的男人。起初,这种说法是有道理的,因为每个人要么刮胡子,要么被理发师刮胡子。

然后问题就是“谁刮胡子”。如果理发师不刮胡子,那么理发师必须刮掉理发师,这与理发师不刮胡子的假设相矛盾。如果理发师确实刮胡子,那么事实迫使理发师不得刮掉理发师,这又是一个悖论,因此找不到任何实例。