Intersection TU-München Sommersemester 2011
Themen Zusammenfassung
Anwendungsbeispiel 1: chars Programmiersprache C: signed und unsigned chars Wertebereiche: signed char: [ 128, +127] unsigned char: [0, +255] Intersection Type Typ: (signedchar unsignedchar) Wertebereich: [0, +127] Anwendungsbeispiel 2: Funktionen Funktion f mit Typ: (Int Int) (Float Float) Typ des Arguments der Funktion g: (Int Int) g akzeptiert f als Eingabe: (g f)
Anwendungsbeispiel 1: chars Programmiersprache C: signed und unsigned chars Wertebereiche: signed char: [ 128, +127] unsigned char: [0, +255] Intersection Type Typ: (signedchar unsignedchar) Wertebereich: [0, +127] Anwendungsbeispiel 2: Funktionen Funktion f mit Typ: (Int Int) (Float Float) Typ des Arguments der Funktion g: (Int Int) g akzeptiert f als Eingabe: (g f)
Grundlagen Typsystem Definition (Term-Variablen) Eine Variable x ist ein λ-term (Abstraktion) Ist t ein λ-term und x eine Variable, so ist λx.t ein λ-term (Applikation) Sind t, s, so ist (ts) ebenfalls ein λ-term
1) Definition Definition: Eine Typ-Variable σ ist ein Typ Sind σ und τ, so ist auch (σ τ) ein Typ Interpretation von : x.[x σ und fx ist definiert fx τ] 2) Type-Assignment System TA λ Ableitungsvorschrift für Terme...
1) Definition Definition: Eine Typ-Variable σ ist ein Typ Sind σ und τ, so ist auch (σ τ) ein Typ Interpretation von : x.[x σ und fx ist definiert fx τ] 2) Type-Assignment System TA λ Ableitungsvorschrift für Terme...
2) Type-Assignment System TA λ [x : σ] M : (σ τ) N : σ ( E). (MN) : τ M : τ λx.m : (σ τ) Regeln und Axiome Ableitungsvorschriften: Elimination, Introduction Vorgehen bei Ableitung ( I)
Beispiel: Typbestimmung Beispiel II I λx.x Beispiel: II (λx.x)(λx.x) Example [x : a a] ( I) (λx.x) : (a a) (a a) II : a a [x : a] ( I) (λx.x) : a a ( E)
z.b. keine Invarianz bei β-reduktion (auch Funktionsanwendung) Beispiel: (λx.x)i I (λx.x)i β x[x/i] I Problematik: Unterschiedliche für semantisch gleiche Terme
Problem im Curry System kann β-reduziert werden (λx.xx)i β II (λx.xx)i β xx[x/i] II. rechte Seite: typisierbar (II : a a) linke Seite: kein Typ x : σ τ x : σ ( E) xx : τ ( I) nicht anwendbar (λx.xx) :?
, Y Kombinator: durch Grossbuchstaben abgekürzter Term Beispiel Y-Fixpunkt-Kombinator: Y λx.(λy.x(yy))(λy.x(yy)) Nicht typisierbar Problem: Term λy.x(yy) Anmerkung: praktische Relevanz von Y
Intersection - 1) Definition Eine Typ-Variable σ und ω sind Sind σ und τ, so sind auch (σ τ), (σ τ) 2) Type-Assignment System TA λ (, ω)...
2) Type-Assignment System TA λ (, ω) Axiome globale Konstante ω für alle Terme folgendes Axiom Regeln ( E), ( I) von Curry Neu: ( E), ( I) M : ω M : (σ 1 σ 2 ) M : σ 1 M : (σ 1 σ 2 ) M : σ 2 ( E) M : σ 1 M : σ 2 M : (σ 1 σ 2 ) ( I)
2) Type-Assignment System TA λ (, ω) Axiome globale Konstante ω für alle Terme folgendes Axiom Regeln ( E), ( I) von Curry Neu: ( E), ( I) M : ω M : (σ 1 σ 2 ) M : σ 1 M : (σ 1 σ 2 ) M : σ 2 ( E) M : σ 1 M : σ 2 M : (σ 1 σ 2 ) ( I)
Example (Kürzel: σ a a) (λx.xx)i β II A B ( E) (λx.xx)i : σ
(λx.xx)i (2) (Kürzel: σ a a) [x : (σ (σ σ))] [x : (σ (σ σ))] ( E) ( E) x : σ σ x : σ ( E) xx : σ ( I) cancel x A (λx.xx) : (σ (σ σ)) σ
(λx.xx)i (3) (Kürzel: σ a a) [x : a] [x : σ] ( I) I : a a I : σ σ B I : σ (σ σ) ( I) ( I)
(λx.xx)i (4) (Kürzel: σ a a) A (λx.xx) : (σ (σ σ)) σ B I : σ (σ σ) (λx.xx)i : σ Anmerkungen: Selbstanwendung typisierbar Intersection Type notwendig Ausgang: β-invarianz (λx.xx)i β xx[x/i] II ( E) : (λx.xx)i : a a, II : a a
(Kürzel: Y λx.zz, Z λy.x(yy)) A B ( E) ZZ : τ Y λx.zz : ((ω τ) τ) ( I)
Y (Kürzel: Y λx.zz, Z λy.x(yy)) (ω-axiom) [x : ω τ] yy : ω ( E) x(yy) : τ B Z : ω τ ( I) cancel vacuous y : ω A Z : (ω τ) τ ( I)
(Kürzel: Y λx.zz, Z λy.x(yy)) Anmerkungen: Y typisierbar A B ( E) ZZ : τ Y λx.zz : ((ω τ) τ) Verwendung ω-axiome ( I)
Intersection gegenüber anderen Typsystemen Nicht in Programmiersprache vorhanden Gründe kein Inferenz-Algorithmus für uneingeschränkte Intersection Typ für nicht-terminierende Programme nicht entscheidbar (z.b. (λx.xx)(λx.xx), endlose Rekursion) Ansätze Forsythe auch: Java, Scala (Compound)