Rodzaj wnioskowanie do unifikacji problemu

głosy
2

Ma ktoś pomysł jak problem wnioskowanie typu

E > hd (cons 1 nil) : α0

ze środowiskiem typowania

                E={
                   hd : list(α1 ) → α1 ,
                   cons : α2 → list(α2 ) → list(α2 ),
                   nil : list(α3 ),
                   1 : int
                }

mogą być przenoszone w problemu zjednoczenia?

Każda pomoc będzie bardzo mile widziana!

Utwórz 09/12/2008 o 14:58
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
3

Po pierwsze, zmiana nazwy zmiennych typu tak, że żadna ze zmiennych w swojej wypowiedzi zderzają się ze zmiennych w środowisku pisania. (W przykładzie jest to już zrobione od odniesień ekspresyjnych {a0} oraz referencje środowisko wpisując {a1, a2, a3}.

Po drugie, przy użyciu nowych zmiennych rodzaju, marki zmienną typu dla każdego podwyrażenie w swojej ekspresji, tworząc coś w rodzaju:

nil : a4
1 : a5
cons : a6
(cons 1 nil) : a7
hd : a8
hd (cons 1 nil) : a0 // already had a type variable

Po trzecie, generowania zestawu równań wśród zmiennych typu, które muszą pomieścić. Można to zrobić od dołu do góry, z góry na dół, lub w inny sposób. Zobacz Heeren, Bastiaan. Top Quality Wiadomości Rodzaj błędu. 2005 do szerokich informacji o tym, dlaczego warto wybrać ten czy inny sposób. Spowoduje to coś takiego:

a4 = list(a3) // = E(nil)
a5 = int // = E(1)
a6 = a2 -> list(a2) -> list(a2) // = E(cons)

// now it gets tricky, since we need to deal with application for the first time
a5 = a2 // first actual param of cons matches first formal param of cons
a4 = list(a2) // second actual param of cons matches type of second formal param of cons
a7 = list(a2) // result of (cons 1 nil) matches result type of cons with 2 params

a8 = list(a1) -> a1 // = E(hd)    

// now the application of hd
a7 = list(a1) // first actual param of hd matches type of first formal param of hd
a0 = a1 // result of hd (cons 1 nil) matches result type of hd with 1 param

Zauważ, że jeśli dokładnie taka sama funkcja została wykorzystana ze środowiska typu dwukrotnie, będziemy potrzebować więcej nowych zmiennych typu (w drugim etapie, powyżej) w celu ujednolicenia z, tak, że nie będzie przypadkowo zrobić wszystkie połączenia do minusy używać tego samego typu , Nie jestem pewien, jak wyjaśnić tę część bardziej wyraźnie, przepraszam. Oto jesteśmy w łatwej przypadku od hd i minusy każdy używany tylko raz.

Po czwarte, ujednolicenie tych równań, w wyniku (jeśli nie pomylił) coś takiego:

a4 = list(int)
a5 = int
a6 = int -> list(int) -> list(int)
a7 = list(int)
a8 = list(int) -> int
a0 = int

Raduj się, ty teraz znać rodzaj każdym podwyrażenie w oryginalnej wypowiedzi.

(Fair ostrzeżenie, jestem nieco od amatora sobie w tych sprawach, a ja może dobrze zrobiony błąd literowy lub przypadkowo oszukany gdzieś tutaj.)

Odpowiedział 19/12/2008 o 21:33
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more