Uzgodnienia¶
Uzgodnienie zachodzi, gdy tagi przypisane tokenom spełniają określone warunki. Warunki te są określane poprzez podanie zbioru atrybutów czy, mówiąc bardziej precyzyjnie, zbiorów wartości różnych atrybutów. Najczęściej używanym uzgodnieniem jest uzgodnienie na liczbie, rodzaju i przypadku, choć w praktyce abstrahujemy od konkretnego tagsetu i będziemy mówić o atrybutach i ich wartościach. Argument określający atrybuty/wartości, na których ma zajść uzgodnienie jest dowolnym wyrażeniem funkcyjnym zwracającym typ zbiór symboli z tagsetu. Najczęściej użytkownik będzie podawał jednak nazwy atrybutów (np. właśnie liczbę, rodzaj i przypadek), które to zostaną rozwinięte do zbioru zawierającego wszystkie wartości tych atrybutów. Można też podać konkretne wartości (bądź podać funkcję zwracającę je), np. by zawęzić uzgodnienie do sytuacji, gdy mamy ten samą liczbę i rodzaj, ale konkretny przypadek, np. dopełniacz.
Uzgodnienia jako takie są predykatami, ale interesuje nas też zbiór wartości, które spełniają uzgodnienie (ze względu na operator agrflt
, który jest funkcją zwracającą zbiór symboli z tagsetu).
Do specyfikacji uzgodnień potrzebna jest funkcja count_categories
, która określa liczbę różnych atrybutów, których wartości pojawiły się w zbiorze (nazwa wzięta z implementacji disasterowej: ops_agr.count_categories).
Niech tag|maska
to część wspólna zbioru zwracanego przez operator maska
i zbioru wartości wszystkich atrybutów tagu tag
. Np. subst:pl:nom:m1|{m1,m2,m3}
= {m1}
, subst:pl:nom:m1|{sg,pl,m1,m2,m3}
= {pl,m1}
.
Uwaga: przekazane zakresy uzgodnienia (parametry pos1
i pos2
) są najpierw przycinane do granic zdania. W poniższych opisach określane to jest za pomocą symbolu cut(pos
), które interpretacją jest przycięcie początku zakresu do początku zdania (gdyby był przed nim) i przycięcie końca zakresu do końca zdania (gdyby był za nim). Jeśli po przycięciu otrzymujemy zakres pusty, to uzgodnienia nie ma.
Silne uzgodnienie między dwoma pozycjami.¶
Parametry: pos1
, pos2
, agr_attrs
(zb. symboli z tagsetu — atrybuty/wartości, na których sprawdzamy uzgodnienie)
Pre-condition: przedział tworzony przez pos1
i pos2
musi mieć niepustą część w granicach z dania; inaczej zwracamy False
- card ( _frag ) =
count_categories
(agr_attrs
) oraz - istnieje tag1 w tokenie cut(
pos1
) i tag2 w tokenie cut(pos2
) dla których ( tag1 |agr_attrs
) = ( tag2 |agr_attrs
) = frag
Długa definicja
Niech- min_card =
count_categories
(agr_attrs
) - frags1 = { tag_|
agr_attrs
dla _tag tokenu na cut(pos1
) takie że card ( tag_|agr_attrs
) = _min_card } - frags2 = { tag_|
agr_attrs
dla _tag tokenu napos2
takie że card ( tag_|agr_attrs
) = _min_card }
frags1 i frags2 to rodziny zbiorów; każdy zbiór z rodziny reprezentuje tag tokenu rzutowany na agr_attrs
(jest to zbiór wartości atrybutów z agr_attrs
)
Teraz silne uzgodnienie zachodzi wtt., gdy część wspólna ( frags1, frags2 ) jest niepusta.
Gdyby wprowadzić filtr mocnego uzgodnienia między dwoma pozycjami, to zwracałby tą część wspólną (ewentualnie każdy jej element rzutowany na maskę podaną przez użytkownika).
Silne uzgodnienie na zakresie¶
Podajemy dwa krańce zakresu, zakres uwzględnia oba krańce. Jest to uogólnienie silnego uzgodnienia na dwóch pozycjach do sytuacji, gdy bierzemy pod uwagę wszystkie tokeny z podanego zakresu.
Pre-condition: przedział tworzony przez pos1
i pos2
musi mieć niepustą część w granicach z dania; inaczej zwracamy False
- card ( _frag ) =
count_categories
(agr_attrs
) oraz - dla każdego tokenu i z zakresu istnieje tag i dla których ( tag i |
agr_attrs
) = frag
Długa definicja
- min_card =
count_categories
(agr_attrs
) - frags_i = { tag_|
agr_attrs
dla _tag tokenu napos_i
takie że card ( tag_|agr_attrs
) = _min_card }
Uzgodnienie zachodzi wtt, gdy część wspólna wszystkich frags_i dla każdego tokenu z zakresu jest niepusta.
Słabe uzgodnienie na zakresie¶
Podajemy dwa krańce zakresu, zakres uwzględnia oba krańce. Krańce traktujemy w sposób szczególny (musi zachodzić tam silne uzgodnienie), natomiast tokeny leżące między nimi są albo niedospecyfikowane (i nie wymagamy wtedy od nich nic więcej), albo również muszą brać udział w silnym uzgodnieniu.
Pre-condition: przedział tworzony przez pos1
i pos2
musi mieć niepustą część w granicach z dania; inaczej zwracamy False
Długa definicja
Dla uproszczenia, niech pos1 := cut(pos1)
i pos2 := cut(pos2)
.
- min_card =
count_categories
(agr_attrs
) - frags_i = { tag_|
agr_attrs
dla _tag tokenu napos_i
takie że card ( tag_|agr_attrs
) = _min_card } - partial_frags_i = { tag_|
agr_attrs
dla _tag tokenu napos_i
takie że card ( _tag_|agr_attrs
) > 0 }
- frags_ends = część wspólna ( frags_pos1, frags_pos2 )
Zbiór spełniający uzgodnienie to frags = { frag należące do frag_ends : dla każdego pos
należącego do specified_positions
albo partial_frags_pos jest zbiorem pustym albo istnieje f należący do partial_frags_pos taki, że f jest podzbiorem frag }
Uzgodnienie jest spełnione, gdy frags jest niepuste.
Filtr słabego uzgodnienia to operator zwracający zbiór frags przetworzony za pomocą podanego zbioru–filtra (opisane w specyfikacji języka).
Por. ops_agr.find_weak_agr_constrs — to implementacja znajdowania zbioru frags.