Ein Ansatz für solche Fragen ist die Codierung .
Angenommen, Sie haben eine Sprache L.1 und eine Sprache L.2 und möchten zeigen, dass sie irgendwie "gleich" sind. Sie können dies tun, indem Sie eine Codierung finden
[[ ⋅ ]] : L.1→ L.2
und zeigen Sie dann, dass für alle Programme Folgendes gilt:L.1M., N.
M.≅1N.iff[[ M.1]]] ≅2[[ M.2]]]]
Hier ist ein gewählter Begriff der Programmäquivalenz für . Um dies für typisierte Sprachen zu tun, ordnet man Typen normalerweise auch über eine Funktion die auf Typisierungsumgebungen erweitert ist, so dass etwa Folgendes gilt:≅ichL.ichL.1L.2┌ ⋅ ┐
Γ Γ1M.: αimpliziert┌ Γ Γ ┐2[[ M.]]] : ┌ α ┐
Hier ist das Typisierungsurteil für . Der gesamte Ansatz wird als
vollständige Abstraktion bezeichnet .
⊢ichL.ich
Um den "Fluch der Church-Turing-Universalität" zu vermeiden, werden typischerweise Bedingungen auferlegt , z. B. dass es kompositorisch ist oder unter injektiver Umbenennung geschlossen wird. Je mehr Bedingungen erfüllt, stärker ist das vollständige Abstraktionsergebnis.[[ ⋅ ]]][[ ⋅ ]]]
Dies versuchen auch Orchard & Yoshida (Theoreme 1-5), obwohl sie es nicht ganz erreichen.