Если есть исполнение, есть и модель.
Какое, например, исполнение, если взять чекер выводов исчисления высказываний?
То есть даже если в metаmath есть только декларативный язык задания неких математических структур, то обработка этих структур всё же исходит из каких-то правил, увязанных с декларативным языком. Непосредственно проверка после подстановки может выполняться разными способами, но вот отказаться от подстановки вряд ли возможно, а это как раз модель исполнения, хоть и не детализированная до операций более низкого уровня.
Вы понимаете «модель исполнения», вероятно, широковато. Вообще, конечно, как раз то, как выглядят выводы во внутреннем формате Metamath, можно считать программами на конкатенативном языке, но придание им семантики будет сильно зависеть от того, какие же аксиомы / правила вывода определены, потому что именно это (для Metamath — не более и не менее, никаких примитивных правил вывода там нет, мы определяем
всё) задаёт, из чего такие «программы» состоят и какие из них корректны. В любом случае это слегка иррелевантно вопросу о полезности того или иного подхода.
Да, это важно, но всё же второстепенно. Ведь разработка программы это удел достаточно квалифицированных в области её применения людей.
Это вам может быть легко довериться, что авторы чекера не наделали трудновыявляемых и значительных для смысла результатов ошибок, а людям, которые собираются полагаться на такие системы значительно, может оказаться важным убедиться в корректности поближе — возможно просмотром кода.
Плюс если бы математики сами взялись за изучение алгоритма работы программы автоматического вывода, то банально количество глаз, нацеленных на относительно скромный объём кода, очень сильно помогло бы отлову множества ошибок.
Так вот же именно!
Не учтена многопоточность? Ввод-вывод?
Не все формальные языки, имеющие хоть какое-то отношение к компьютеру, являются языками программирования; не все языки программирования тьюринг-полны и «тьюринг-реализуемы» (то есть они могут быть и слабее, и сильнее машины Тьюринга, хотя вторые будут представлять в основном академический интерес; что не помешает их друг в друга например компилировать, хоть выполнять программы на них будет и нельзя).
А каким способом достигается большая выразительность?
Разными. Ну как вот языки программирования позволяют писать выражения по-человечески и при этом не писать лишних скобок? Грамматики, парсинг с приоритетами, такие штуки. Всё это усложняет код. А если использовать библиотеку, придётся и её код проверять.
Системы автоматического вывода написаны на ещё более низкоуровневых языках.
Погодите, не путайте системы автоматического вывода и системы автоматической проверки, в обсуждаемом случае необходимо только второе.
Ладно, допустим вы говорите, что можно на прологе написать некий встроенный DSL и уже вместе с ним напасть на ZFC (а конкретно уметь представлять её аксиомы, выводы в ней и проверять эти выводы на корректность). Давайте. Можно взять ZF, и даже её кусок, только чур оставить хотя бы одну схему аксиом и включить аксиому бесконечности. Возьмётесь?
Да, напрямую доказательства общего вида непонятно как сделать. Видимо только через некую промежуточную сущность, вводящую дополнительную логику в модель исполнения.
Ну вот, видимо не возьмётесь, потому что даже нет идей. Боюсь, в недостаточно динамическом прологе это вообще будет невозможно, ну или условно говоря поверх пролога будет написан целиком новый язык, что не годится.