К сожалению, здесь слишком много всего происходит. Так что все легко перепутать. Использование «полной» в «полной полноте» и «полной абстракции» относится к совершенно разным представлениям о полноте. Но есть также некоторая неопределенная связь между ними. Таким образом, это будет сложный ответ.
Полная завершенность : «Звук и завершенность» - это свойство, которое вы хотите, чтобы традиционная логика имела в отношении своей семантики. Обоснованность означает, что все, что вы можете доказать в логике, верно в семантической модели. Полнота означает, что все, что верно в семантической модели, доказуемо в логике. Мы говорим, что логика является правильной и полной для конкретной семантической модели. Когда мы приходим к конструктивной логикеНапример, теорию типа Мартина-Лофа или линейную логику, нас интересует не только доказуемость формул, но и их доказательства. У доказуемой формулы может быть много доказательств, и конструктивная логика хочет их отделить. Таким образом, семантика для конструктивной логики включает в себя указание не только того, является ли формула истинной, но также некоторое абстрактное семантическое понятие «доказательства» («доказательства») для ее истинности. Абрамский и его коллеги придумали термин «полная полнота», чтобы обозначить, что доказательства в логике могут выражать все семантические доказательства в модели. Итак, «полный» относится к доказательствам здесь. «Полная» логика может доказать все, что нужно. «Полностью завершенная» логика имеет все доказательства, которые ей необходимы. Таким образом, «полная полнота» означает «конструктивная полнота» или «доказательная полнота». Это не имеет ничего общего с полной абстракцией.
Полная абстракция : «Адекватный и полностью абстрактный» - это свойство, которое вы хотите для семантической модели языка программирования. (Обратите внимание на первое отличие: мы сейчас имеем дело со свойствами семантической модели, а не свойства языка!) Адекватность означает, что всякий раз, когда два термина имеют одинаковое значение в семантической модели, они обсервационно эквивалентны в языке программирования (по отношению к некоторому понятию исполнения). Полная абстракция означает, что, если два термина обсервационно эквивалентны, они имеют одинаковое значение в семантической модели. Эти идеи могут быть связаны с обоснованностью и полнотой, но несколько надуманным способом. Если мы думаем о семантической модели языка программирования как о «логике» или «методе доказательства», чтобы говорить о наблюдательной эквивалентности, то адекватность означает, что этот метод доказательства является надежным; полная абстракция означает, что этот метод доказательства завершен. Нет понятия «полная полнота»метод доказательства. (Но такая вещь теоретически возможна, и на днях кто-то может сделать это.)
В вашем случае вас интересуют переводы, а не семантические модели. Свойства адекватности и полной абстракции могут быть расширены, чтобы иметь дело с переводами следующим образом. Вы рассматриваете целевой язык как свою «семантическую модель», то есть формализм, который вы как-то полностью понимаете. Если это так, у вас есть некоторое представление об эквивалентности для него. Затем мы говорим, что перевод является адекватным, если всякий раз, когда переводы двух исходных программ эквивалентны на целевом языке, они обсервационно эквивалентны на исходном языке. Мы говорим, что это полностью абстрактно, если, когда две исходные программы обсервационно эквивалентны на исходном языке, их переводы эквивалентны на целевом языке.
τ( М) ≅τ( N) ⟹ М≅N
M≅N⟹ τ( М) ≅τ( N)
M≅N⟺τ( М) ≅τ( N)
AA
∀ N: τ( А ) .∃ М: .τ( М) = N
Теперь о неясной связи между полной полнотой и полной абстракцией. Доказательство того, что семантическая модель или перевод полностью абстрактны, часто подразумевает определенность. Это потому, что наши языки, как правило, высшего порядка. Таким образом, если у семантической модели или целевого языка слишком много «контекстов», тогда он сможет высовывать наши термины или смысловые значения нежелательными способами и испортить их эквивалентность. «Нежелательные пути» означают, что язык программирования сам по себе их не сможет сунуть. Таким образом, чтобы получить полную абстракцию, нам нужно убедиться, что «контексты», доступные в семантической модели или в целевом языке, исходят от тех, которые в исходном языке в той или иной форме. Обратите внимание, что это относится к свойству полной полноты.
Почему мы хотим такие свойства? Это не имеет ничегоделать с компиляторами! Мы хотим эти свойства, чтобы утверждать, что исходный язык встраивается в целевой язык. Если мы довольны определенным целевым языком (чистым, понятным, каким-то фундаментальным или богоданным), то, если исходный язык встраивается в него, то мы можем утверждать, что в исходном языке нет ничего нового. Это просто фрагмент целевого языка, который мы знаем и любим. Это просто синтаксический сахар. Таким образом, полностью абстрактные переводы даются людьми, чтобы установить, что конкретные целевые языки великолепны. Они также иногда даются людьми, которые имеют большой или сложный язык для общения. Таким образом, вместо определения семантики для него напрямую, они переводят его на некоторый базовый язык и затем дают семантику для базового языка. Например, отчет Haskell делает это. Но полная абстракция этих переводов редко когда-либо доказывается, потому что исходные языки большие и сложные. Люди верят, что перевод хорош.
Еще раз, это не имеет ничего общего с компиляторами. Компиляторы редко бывают адекватными или полностью абстрактными. И они не должны быть! Все, что нужно сделать компилятору - это сохранить поведение выполнения завершенных программ. Целевой язык компилятора, как правило, огромный, что означает, что он имеет много контекстов, которые могут испортить эквивалентность. Таким образом, эквивалентные программы на исходном языке практически никогда не являются контекстно-эквивалентными при компиляции.