То, что вы делаете, прекрасно, особенно учитывая, что размер вашей матрицы постоянный и никогда не меняется. SMTLib не имеет понятия циклов, хотя последние версии позволяют рекурсивные определения функций, которые могут быть использованы для этого эффекта. См. Этот ответ для другого, но связанного с этим вопроса о том, как использовать рекурсию: https://stackoverflow.com/a/51140049/936310 . Тем не менее, я бы рекомендовал придерживаться вашего текущего кода для простоты и более широкой поддержки от множества решателей.
На мой взгляд, SMTLib действительно должен быть «сгенерирован» вместо прямого использования; и большинство инструментов используют его таким образом. Если вам нужно усложнить программирование, я бы рекомендовал вместо этого использовать интерфейс более высокого уровня. Есть интерфейсы для Z3 и других решателей практически на любом языке, который вы можете себе представить. Python и Haskell обеспечивают действительно высокоуровневые привязки, которые избавляются от большей части шаблона для вас. У вас также есть привязки низкого уровня от C / C ++ / Java, если это ваш выбор. См. с использованием арифметики с плавающей точкой с API-интерфейсами Z3 C ++ для сравнения стилей.
Это потому, что нетерпеливо загруженные отношения (usermeta
в вашем случае) выполняются как отдельный SQL-запрос. Затем они сопоставляются с моделью User
с помощью PHP, а не на уровне вашей базы данных.