Думайте об этом так: каждый анализ Alloy включает в себя поиск модели, в которой решением является модель (называемая экземпляром в Alloy), которая отображает имена в связи.Чтобы показать, что для формулы вообще не существует модели, вы можете запустить ее, и если Alloy не найдет решения, то модели нет (в этой области).Поэтому, если вы запускаете
some s: A -> B | function[s] && surjective[s]
и не получаете решения, вы знаете, что в этой области нет сюръективной функции.
Но если вы попросите Alloy найти модель, для которой не существует никакого отношения к этой модели, это совсем другой вопрос, требующий анализа более высокого порядка, потому что решатель не может просто найти решение:нужно показать, что нет расширения этого решения, удовлетворяющего отрицательному ограничению.Ваш первоначальный пример подобен этому.
Итак, да, это фундаментальное ограничение в том смысле, что логика более высокого порядка принципиально менее поддающаяся изучению.Но является ли это ограничением для вас на практике, это другой вопрос.Какой анализ вам на самом деле нужен?
Одним из убедительных примеров использования формул более высокого порядка является синтез.Типичная проблема синтеза имеет вид «найди мне программную структуру P такую, что нет контрпримеров к спецификации S».Это требует анализа более высокого порядка и является той проблемой, для решения которой был разработан Alloy *.
Но, как правило, нет причин использовать Alloy * для стандартных задач проверки / моделирования.