Это абсолютно точно, никаких сомнений? Просто то, что Вы говорите, кажется мне достаточно простым, а то, что мне казалось стоит за фразой "соответствие между программами и доказательствами" казалось совершенно мистическим, поэтому я весьма удивлён.
Ну, это достаточно просто, но если копнуть поглубже, то вылезают разные интересные вещи. Скажем, dependent types. Пруверы, опять же, можно пытаться делать. Формальное доказательство корректности функции можно писать в виде другой функции и т.п.
Иными словами, абсолютно точно, что соответствие не взаимно-однозначное? То есть, множеству программ, делающих совершенно разные вещи, может соответствовать одно доказательство?
Почему же. Разные функции - это разные доказательства того, что их тип непуст. Вот, скажем, тождественная функция Double->Double - это доказательство одно, не зависящее ни от чего, а функция
доказывает Double->Double исходя из того, что нам дано умножение, т.е. постулат
. Вообще, о конкретных типах в этой области редко говорят, естественнее говорить о полиморфных. Соответственно, функции будут в этом случае затрагивать только структуры данных, а таких вот произвольных постулатов как
не будет. Кстати, таким вот сборникам постулатов соответствуют интерфейсы и type classes.
А почему A->B соответствует какое-то "доказательство"?
Совершенно верно, поэтому полиморфную функцию из произвольного типа в произвольный можно написать только с помощью грязных хаков. Она не имеет математического смысла.
Но если бы доказательство было - то оно соответствовало некоторой полиморфной функции
.