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

Krótka definicja: istnieje zbiór frag taki, że
  • 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 na pos2 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).

Przykład uzgodnienia między dwoma pozycjami

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

Krótka definicja: istnieje zbiór frag taki, że
  • 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 na pos_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 na pos_i takie że card ( tag_|agr_attrs ) = _min_card }
  • partial_frags_i = { tag_|agr_attrs dla _tag tokenu na pos_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.

agrpp.png - Przykład uzgodnienia między dwoma pozycjami (4.2 KB) Adam Radziszewski, 10 Dec 2010 14:39