Известно, что парадокс парикмахера решается, если есть несколько парикмахеров, чтобы они могли брить друг друга.
Эта спецификация соответствует:
sig Man {shaves: set Man}
some sig Barber extends Man {}
fact {
Barber.shaves = {m: Man | m not in m.shaves}
}
run { } for 4
Однако следующее, хотя и выглядит эквивалентным, все же несовместимо:
sig Man {
shavedMen : set Man
}
fact {
# {barber:Man | barber.shavedMen = {m: Man | m not in m.shavedMen} } > 1
}
run {} for 4
Почему?