320 likes | 476 Views
Typinferenz. Prolog Aufbaukurs SS 2000 Heinrich-Heine-Universität Düsseldorf Christof Rumpf. Hintergrund. Getypte Merkmalsstrukturen sind von Bedeutung insbesondere für die HPSG. Implementierte Systeme zur Verarbeitung getypter Merkmalsstrukturen sind u.a. ALE, CUF, LKB, TFS, TROLL, ...
E N D
Typinferenz Prolog Aufbaukurs SS 2000 Heinrich-Heine-Universität Düsseldorf Christof Rumpf
Hintergrund • Getypte Merkmalsstrukturen sind von Bedeutung insbesondere für die HPSG. • Implementierte Systeme zur Verarbeitung getypter Merkmalsstrukturen sind u.a. ALE, CUF, LKB, TFS, TROLL, ... • Die nachfolgenden Definitionen liegen dem Düsseldorfer System QType zugrunde, das sich seit 1997 in Entwicklung befindet. Typinferenz
Getypte Merkmalsstrukturen • Sind Mengen von Attribut-Wert-Paaren. • Jede Merkmalsstruktur hat einen Typ. • Jeder Wert eines Attributs ist eine getypte Merkmalsstruktur. • Die Typen sind in einer Vererbungshierarchie (Summenhalbverband) angeordnet, innerhalb der Attribut-Wert-Paare top-down vererbt werden. • Die Vererbungshierarchie wird durch eine Typensignatur etabliert, in der Klassen von Merkmalsstrukturen definiert werden. Typinferenz
Typensignatur - Syntax • 2 Mengen: Types, Features • 2 Relationen: • unmittelbarer Subtyp >> • Appropriateness :: • Typdefinition • Supertyp • >> Subtyp1, ..., Subtypn:: Feature1:Typ1, ...,Featurem:Typm. Typinferenz
Typensignatur zu ‚Shieber 1‘ top >> category, featval. category >> verbal, np ::HEAD:head. featval >> head, agr, gen, pers, num, vform. head >> vhead, nhead. verbal >> v, vp, s ::HEAD:vhead. np ::HEAD:nhead. nhead ::AGREEMENT:agr. agr ::GENDER:gen,PERSON:pers,NUMBER:num. gen >> masc, fem, neut. pers >> first, second, third. num >> sing, plur. vhead ::FORM:vform,SUBJECT:np. vform >> finite, base. Kilbury 1997,QType-Syntax Typinferenz
Typhierarchie top category verbal np v vp s featval vform finite base num sing plur agr gen masc fem neut head vhead nhead pers first second third Typinferenz
FS zu Typ s in ‚Shieber 1‘ Typinferenz
Typensignatur: Prolog-Syntax % Type >> Subtypes :: FeatureValuePairs % Type = Atom % Subtypes = [Type1,...,TypeN] % FeatureValuePairs = [F1:V1,...,Fm:Vm] % Fi = Atom % Vi = Type :- op(800, xfx, '>>'). :- op(700, xfx, '::'). Typinferenz
‚Shieber 1‘ in Prolog-Syntax top >>[category, featval]::[]. category >>[verbal, np]::['HEAD':head]. featval >>[head, agr, gen, pers, num, vform]::[]. head >>[vhead, nhead]::[]. verbal >>[v, vp, s]::['HEAD':vhead]. np >>[]::['HEAD':nhead]. nhead >>[]::['AGREEMENT':agr]. agr >>[]::['GENDER':gen,'PERSON':pers,'NUMBER':num]. gen >>[masc, fem, neut]::[]. pers >>[first, second, third]::[]. num >>[sing, plur]::[]. vhead >>[]::['FORM':vform,'SUBJECT':np]. vform >>[finite, base]::[]. base >>[]::[]. v >>[]::[]. masc >>[]::[]. first >>[]::[]. vp >>[]::[]. fem >>[]::[]. second >>[]::[]. s >>[]::[]. neut >>[]::[]. third >>[]::[]. sing >>[]::[]. plur >>[]::[]. finite >>[]::[]. Typinferenz
Typensignatur-Interpreter • type(?Type) • immediate_subtype(?ImmediateSubType,?Type) • subtype(?SubType,?Type) • immediate_supertype(?SuperType,?Type) • supertype(?SuperType,?Type) • lb(?Type1,?Type2,?Type3) lower bound • glb(?Type1,?Type2,?Type3) greatest lower bound • ub(?Type1,?Type2,?Type3) upper bound • lub(?Type1,?Type2,?Type3) least upper bound • complement(?Type,-Complement) Typinferenz
Typen % type(?Type). % Type is defined as a type. type(T):- call(T >> _). Typinferenz
Unmittelbare Subtypen % immediate_subtype(?ImmediateSubType,?Type) % ImmediateSubType is defined as an immediate % subtype of Type. immediate_subtype(ST,T):- call(T >> STs :: _), member(ST,STs). Typinferenz
Subtypen % subtype(?SubType,?Type) % SubType is a subtype of Type. % Reflexive transitive closure of the % immediate_subtype/2 relation. subtype(T,T):- type(T). subtype(ST,T):- immediate_subtype(IST,T), subtype(ST,IST). Typinferenz
Echte Subtypen % true_subtype(?SubType,?Type) % SubType is a true subtype of Type. true_subtype(T1,T2):- subtype(T1,T2), T1 \= T2. Typinferenz
Minimale (Sub-)Typen minimal_subtype(MiniType,Type):- subtype(MiniType,Type), minimal(MiniType). minimal(T):- T >> [] :: _. Typinferenz
Extension eines Typs % extension(?Type,-Extension) % Extension is the set of minimal subtypes of Type. extension(Type,Extension):- type(Type), setof1(MiniType, minimal_subtype(MiniType,Type), Extension). Typinferenz
Alle Lösungen: setof/3 % setof(?Template,+Goal,?Set) Eingebautes Prädikat. % Set ist die Menge aller Instanzen von Template,% so dass Goal bewiesen werden kann. Falls Set % leer ist, scheitert setof/3. % setof1(?Template,+Goal,?Set) setof1(Template,Goal,Set):- setof(Template,Goal,Set), !. setof1(_,_,[]). Typinferenz
Setof-Beispiel likes(bill, cider). likes(dick, beer). likes(harry, beer). likes(jan, cider). likes(tom, beer). likes(tom, cider). ?- setof(X, likes(X,Y), S). S = [dick,harry,tom], Y = beer -> ; S = [bill,jan,tom], Y = cider -> ; no ?- setof((Y,S), setof(X, likes(X,Y), S), SS).SS = [(beer,[dick,harry,tom]),(cider,[bill,jan,tom])]yes ?- setof(X, Y^(likes(X,Y)), S). % Y existenzquantifiziert S = [bill,dick,harry,jan,tom] Typinferenz
Typen-Unifikation • Die Unifikation zweier Typen t1 und t2 liefert entweder Typ t3, falls t3 der allgemeinste Typ ist, sodaß • t3 Subtyp von t1 ist und • t3 Subtyp von t2 ist • oder ist undefiniert, falls es einen solchen Typ t3 nicht gibt. Typinferenz
Untere Schranken % lb(?Type1,?Type2,?Type3) % Type3 is a lower bound for Type1 and % Type2, if it is a subtype of both. lb(T1,T2,T3):- subtype(T3,T1), subtype(T3,T2). Typinferenz
Grösste untere Schranken % glb(?Type1,?Type2,?Type3) % Type3 is the greatest lower bound of Type1 and Type2. glb(T1,T2,T3):- % T3 is GLB of T1 and T2 if lb(T1,T2,T3), % T3 is a LB of T1 and T2 and setof1(T4, % the set S of types T4 ( % which are true_subtype(T3,T4), % true supertypes of T3 and lb(T1,T2,T4) % lower bounds of T1 and T2 ), S), S=[]. % is the empty set. Typinferenz
extension/2 liegt als berechnete Faktenmenge vor. Das zweite Argument von extension/2 ist alphabetisch sortiert. Jeder Typ hat entweder keinen oder mindestens zwei unmittelbare Subtypen. GLB über Extension Nebenstehende Definition hat folgende Voraussetzungen: % glb(?T1,?T2,?T3) glb(T1,T2,T3):- extension(T1,E1), extension(T2,E2), intersection(E1,E2,E4), sort(E4,E3), extension(T3,E3). Typinferenz
Typen-Generalisierung • Die Generalisierung zweier Typen t1 und t2 liefert entweder Typ t3, falls t3 der spezifischste Typ ist, sodaß • t3 Supertyp von t1 ist und • t3 Supertyp von t2 ist • oder ist undefiniert, falls es einen solchen Typ t3 nicht gibt. Typinferenz
Supertypen % supertype(?SuperType,?Type) % SuperType is a supertype of Type. supertype(ST,T):- subtype(T,ST). % immediate_supertype(?SuperType,?Type) % SuperType is an immediate supertype of Type. immediate_supertype(ST,T):- immediate_subtype(T,ST). Typinferenz
Obere Schranken % ub(?Type1,?Type2,?Type3) % Type3 is an upper bound for Type1 and % Type2 if it is a supertype of both. ub(T1,T2,T3):- subtype(T1,T3), subtype(T2,T3). Typinferenz
Kleinste obere Schranken % lub(?Type1,?Type2,?Type3) % Type3 is the least upper bound of Type1 and Type2. lub(T1,T2,T3):- % T3 is the LUB of T1 and T2 if ub(T1,T2,T3), % T3 is an UB for T1 and T2 and setof1(T4, % the set S of types T4 ( % which are true_subtype(T4,T3), % true subtypes of T3 and ub(T1,T2,T4) % upper bounds for T1 and T2 ), S), S=[]. % is the empty set. Typinferenz
extension/2 liegt als berechnete Faktenmenge vor. Das zweite Argument von extension/2 ist alphabetisch sortiert. Jeder Typ hat entweder keinen oder mindestens zwei unmittelbare Subtypen. LUB über Extension Nebenstehende Definition hat folgende Voraussetzungen: % lub(?T1,?T2,?T3) lub(T1,T2,T3):- extension(T1,E1), extension(T2,E2), union(E1,E2,E4), sort(E4,E3), extension(T3,E3). Typinferenz
LUB-Filter für Typenmenge % lubs(+ListOfTypes1, ?ListOfTypes2) % ListOfTypes2 includes the disjunct least upper bounds for % the types in ListOfTypes1. In other words: every type in % ListOfTypes1 that is a subtype of some other type in % ListOfTypes1 is deleted. lubs(Types,Lubs):- delete(Type1,Types,Types1), member(Type2,Types1), subtype(Type1,Type2), !, lubs(Types1,Lubs). lubs(L,L):- !. naives Verfahren, delete/3 vermeiden! Typinferenz
Komplement % complement(?Type,-Complement) % The Complement of Type relative to all other Types. complement(Type,Complement):- type(Type), complement(Type,top,Complement). % complement(?Type,+ContextType,-Complement) % The Complement of Type relative to ContextType. % ContextType is the LUB for the complement types. complement(Type,CT,Complement):- setof1(ST,subtype(ST,CT),Types), complement_in_context(Type,Types,Complement0), lubs(Complement0,Complement), Complement \= [], !. Typinferenz
Komplement im Kontext % complement_in_context(?Type,+Context,-Complement) % The Complement of Type relative to Context. Context is a % list of candidate types for the complement. Every type in % Context that has no lower bound with Type is in Complement. complement_in_context(_,[],[]):- !. complement_in_context(Type,[T|Ts],Complement):- lb(Type,T,_), !, complement_in_context(Type,Ts,Complement). complement_in_context(Type,[T|Ts],[T|Complement]):- complement_in_context(Type,Ts,Complement). Typinferenz
Komplement: Beispiel ?- complement(first, top, C). C = [agr,category,gen,head,num,second,third,vform] yes ?- complement(first, pers, C). C = [second,third] yes mit der ‚Shieber 1‘-Signatur als Basis Typinferenz
Literatur • Carpenter, Bob (1993): The Logic of Typed Feature Structures. CUP. • O‘Keefe, Richard A. (1990): The Craft of Prolog. MIT Press. • Shieber, Stuart (1986): An Introduction to Unification-based Approaches to Grammar. CSLI Lecture Notes. Typinferenz