From c62ea3383cf93bf21cf9a481f400a36d3aa4a0c9 Mon Sep 17 00:00:00 2001 From: claude Date: Thu, 13 Aug 2026 09:49:20 -0500 Subject: [PATCH] stage(elp-es): emit vocabulary-es.el + lang_profile_es.el; extend morphology-es.el; parity harness MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Port the validated sandbox Spanish realizer into the ELP .el runtime (STAGE only). - vocabulary-es.el: 342 entries generated from UniMorph via morphology_es_full (real forms; nouns carry REAL per-lemma lexicon gender in form2 — kills the el-mano/la-dia masculine-default class). - lang_profile_es.el: Spanish typology flags incl. mandatory contractions + govt. - morphology-es.el: add es_participle, es_inflect_adj, es_contract, es_article_for_gender; accent-correct plural/preterite/participle. - parity harness: 90.1% morphology parity vs Python oracle; gender heuristic 73.6% vs vocab-real 100%; contraction 100%. --- elp/src/lang_profile_es.el | 45 ++ elp/src/morphology-es.el | 181 +++++- elp/src/vocabulary-es.el | 362 +++++++++++ elp/tests/gen_elp_es.py | 262 ++++++++ elp/tests/gen_parity_es.py | 100 +++ elp/tests/parity-es-checks.el | 1035 +++++++++++++++++++++++++++++++ elp/tests/parity-es-results.txt | 1020 ++++++++++++++++++++++++++++++ 7 files changed, 2995 insertions(+), 10 deletions(-) create mode 100644 elp/src/lang_profile_es.el create mode 100644 elp/src/vocabulary-es.el create mode 100644 elp/tests/gen_elp_es.py create mode 100644 elp/tests/gen_parity_es.py create mode 100644 elp/tests/parity-es-checks.el create mode 100644 elp/tests/parity-es-results.txt diff --git a/elp/src/lang_profile_es.el b/elp/src/lang_profile_es.el new file mode 100644 index 0000000..1507132 --- /dev/null +++ b/elp/src/lang_profile_es.el @@ -0,0 +1,45 @@ +;;; lang_profile_es.el — Spanish language profile for ELP. +;;; Keys the realizer's construction switches. Mirrors lang_profile_en / _pt. + +(lang_profile_es + (language "Spanish") + (iso639 "es") + (family "Romance") + + ;; -- core typology flags ------------------------------------------------- + (pro-drop yes) ; subjects routinely dropped; agreement carries person + (obligatory-subject no) + (grammatical-gender yes) ; m/f on every noun; article+adjective AGREE + (gender-source lexicon); REAL per-noun gender from UniMorph — NOT a heuristic + (do-support no) + (subject-aux-inversion no) ; questions by intonation/punctuation, not inversion + (question-strategy intonation) + (article-selection "el/la/los/las un/una/unos/unas") + (stressed-a-rule yes) ; fem sg noun in stressed a-/ha- takes el/un (el agua) + (adjective-position postnominal) ; default post; a few prenominal + apocope + (adjective-agreement "gender+number") + (question-punct inverted) ; opening ¿ ¡ required + + ;; -- MANDATORY CONTRACTIONS (coordinator quality bar) -------------------- + (contractions ((de el "del") (a el "al"))) + (contraction-mandatory yes) ; 'de el'/'a el' MUST surface as del/al + + ;; -- verb / aspect system ------------------------------------------------ + (verb-classes (ar er ir)) + (tenses (present preterite imperfect future conditional)) + (moods (ind sbjv imp)) + (finite-agreement "person+number (6 slots)") + (perfect-aux "haber") ; haber + past participle (invariant -o) + (progressive-aux "estar") ; estar + gerund + (passive-aux "ser") ; ser + participle (agrees) + por-agent + (copula-split "ser/estar") ; permanent vs stage-level + (future "infinitive + é/ás/á/emos/éis/án") + + ;; -- clitics / government ------------------------------------------------ + (object-clitics yes) ; me te lo la le nos os los las; proclisis/enclisis + (clitic-order "se II I III (le+lo -> se lo)") + (enclisis "imperative/infinitive/gerund + accent repair (dá+me+lo->dámelo)") + (verb-prep-government yes) ; verbs select prep (protestar+contra, escapar+de) + + ;; -- SACRED safety bar (shared with en/pt) ------------------------------- + (negation-faithful yes)) ; polarity never dropped/inverted; unplaceable -> FLAG diff --git a/elp/src/morphology-es.el b/elp/src/morphology-es.el index 8b2a744..e15e844 100644 --- a/elp/src/morphology-es.el +++ b/elp/src/morphology-es.el @@ -54,6 +54,16 @@ fn es_str_last3(s: String) -> String { // Spanish verbs fall into three conjugation classes defined by the infinitive // ending: -ar, -er, -ir. The stem is the infinitive minus those two characters. +// Strong-vowel-final test (a/e/o) — used for orthographic y-insertion and the +// accented -ído participle (caer->caído/cayó; but ui/iu diphthongs stay plain). +fn es_strong_vowel_final(s: String) -> Bool { + let c: String = es_str_last_char(s) + if str_eq(c, "a") { return true } + if str_eq(c, "e") { return true } + if str_eq(c, "o") { return true } + return false +} + fn es_verb_class(base: String) -> String { if es_str_ends(base, "ar") { return "ar" } if es_str_ends(base, "er") { return "er" } @@ -453,12 +463,18 @@ fn es_regular_preterite(stem: String, vclass: String, slot: Int) -> String { if slot == 4 { return stem + "asteis" } return stem + "aron" } - // -er and -ir share the same preterite endings + // -er and -ir share the same preterite endings. + // Orthographic rule: a vowel-final stem takes -yó/-yeron (caer->cayó, + // leer->leyó, creer->creyó) since -ió after a vowel becomes -yó. if slot == 0 { return stem + "í" } if slot == 1 { return stem + "iste" } - if slot == 2 { return stem + "ió" } + if slot == 2 { + if es_strong_vowel_final(stem) { return stem + "yó" } + return stem + "ió" + } if slot == 3 { return stem + "imos" } if slot == 4 { return stem + "isteis" } + if es_strong_vowel_final(stem) { return stem + "yeron" } return stem + "ieron" } @@ -640,17 +656,35 @@ fn es_pluralize(noun: String) -> String { if !str_eq(inv, "") { return inv } - let last: String = es_str_last_char(noun) + // Oxytone nouns ending accented-vowel + n LOSE the written accent in the + // plural (canción->canciones, razón->razones, jardín->jardines). + // NOTE El strings are byte-indexed; "ón"/"án"/... are 3 bytes (accent=2 +n). + if es_str_ends(noun, "ón") { return es_str_drop_last(noun, 3) + "ones" } + if es_str_ends(noun, "án") { return es_str_drop_last(noun, 3) + "anes" } + if es_str_ends(noun, "én") { return es_str_drop_last(noun, 3) + "enes" } + if es_str_ends(noun, "ín") { return es_str_drop_last(noun, 3) + "ines" } + if es_str_ends(noun, "ún") { return es_str_drop_last(noun, 3) + "unes" } + // Oxytone accented-vowel + s also loses the accent (francés->franceses, + // inglés->ingleses). í/ú stay (país->países via the consonant rule). + if es_str_ends(noun, "és") { return es_str_drop_last(noun, 3) + "eses" } + if es_str_ends(noun, "ás") { return es_str_drop_last(noun, 3) + "ases" } + if es_str_ends(noun, "ós") { return es_str_drop_last(noun, 3) + "oses" } // Ends in -z: replace with -ces - if str_eq(last, "z") { + if es_str_ends(noun, "z") { return es_str_drop_last(noun, 1) + "ces" } - // Ends in a vowel: add -s - if str_eq(last, "a") { return noun + "s" } - if str_eq(last, "e") { return noun + "s" } - if str_eq(last, "i") { return noun + "s" } - if str_eq(last, "o") { return noun + "s" } - if str_eq(last, "u") { return noun + "s" } + // Stressed final vowel: á/é/ó -> +s (café->cafés); í/ú -> +es (rubí->rubíes) + if es_str_ends(noun, "á") { return noun + "s" } + if es_str_ends(noun, "é") { return noun + "s" } + if es_str_ends(noun, "ó") { return noun + "s" } + if es_str_ends(noun, "í") { return noun + "es" } + if es_str_ends(noun, "ú") { return noun + "es" } + // Plain final vowel: add -s + if es_str_ends(noun, "a") { return noun + "s" } + if es_str_ends(noun, "e") { return noun + "s" } + if es_str_ends(noun, "i") { return noun + "s" } + if es_str_ends(noun, "o") { return noun + "s" } + if es_str_ends(noun, "u") { return noun + "s" } // Ends in consonant (including -s for stressed words like autobús): add -es return noun + "es" } @@ -687,6 +721,37 @@ fn es_starts_with_stressed_a(noun: String) -> Bool { return false } +// es_article_for_gender: the article logic, given gender EXPLICITLY. +// The realizer should call this with the REAL per-noun gender from +// vocabulary-es.el (form2), NOT the es_gender heuristic — that is what +// eliminates the 'el mano' / 'la día' masculine-default error class. +fn es_article_for_gender(gender: String, noun: String, definite: String, number: String) -> String { + let is_plural: Bool = str_eq(number, "plural") + let is_def: Bool = str_eq(definite, "true") + + if is_def { + if is_plural { + if str_eq(gender, "f") { return "las" } + return "los" + } + if str_eq(gender, "f") { + if es_starts_with_stressed_a(noun) { return "el" } + return "la" + } + return "el" + } + + if is_plural { + if str_eq(gender, "f") { return "unas" } + return "unos" + } + if str_eq(gender, "f") { + if es_starts_with_stressed_a(noun) { return "un" } + return "una" + } + return "un" +} + fn es_agree_article(noun: String, definite: String, number: String) -> String { let gender: String = es_gender(noun) let is_plural: Bool = str_eq(number, "plural") @@ -714,3 +779,99 @@ fn es_agree_article(noun: String, definite: String, number: String) -> String { if str_eq(gender, "f") { return "una" } return "un" } + +// ── Past participle (compound tenses: haber + participle) ───────────────────── +// +// Irregular participle table (transcribed from morphology_es_full._IRREG_PART), +// then the regular rule: -ar -> -ado, -er/-ir -> -ido. + +fn es_participle(verb: String) -> String { + if str_eq(verb, "escribir") { return "escrito" } + if str_eq(verb, "describir") { return "descrito" } + if str_eq(verb, "abrir") { return "abierto" } + if str_eq(verb, "cubrir") { return "cubierto" } + if str_eq(verb, "descubrir") { return "descubierto" } + if str_eq(verb, "morir") { return "muerto" } + if str_eq(verb, "poner") { return "puesto" } + if str_eq(verb, "ver") { return "visto" } + if str_eq(verb, "volver") { return "vuelto" } + if str_eq(verb, "devolver") { return "devuelto" } + if str_eq(verb, "hacer") { return "hecho" } + if str_eq(verb, "deshacer") { return "deshecho" } + if str_eq(verb, "decir") { return "dicho" } + if str_eq(verb, "romper") { return "roto" } + if str_eq(verb, "resolver") { return "resuelto" } + if str_eq(verb, "freír") { return "frito" } + if str_eq(verb, "imprimir") { return "impreso" } + if str_eq(verb, "satisfacer") { return "satisfecho" } + if str_eq(verb, "prever") { return "previsto" } + if str_eq(verb, "revolver") { return "revuelto" } + // Accented -ír infinitives (oír->oído, sonreír->sonreído): "ír" is 3 bytes. + if es_str_ends(verb, "ír") { return es_str_drop_last(verb, 3) + "ído" } + if es_str_ends(verb, "ar") { return es_str_drop_last(verb, 2) + "ado" } + // -er/-ir: a strong-vowel stem takes the accented -ído (caer->caído, + // leer->leído, poseer->poseído); consonant stems stay -ido; ui/iu + // diphthongs (construir->construido) stay plain. + if es_str_ends(verb, "er") { + let st: String = es_str_drop_last(verb, 2) + if es_strong_vowel_final(st) { return st + "ído" } + return st + "ido" + } + if es_str_ends(verb, "ir") { + let st: String = es_str_drop_last(verb, 2) + if es_strong_vowel_final(st) { return st + "ído" } + return st + "ido" + } + return verb +} + +// ── Adjective agreement (gender + number) ───────────────────────────────────── +// +// Rule-based agreement mirroring morphology_es_full.inflect_adj (rule path): +// feminine: -o -> -a; nationality/-dor exceptions add -a; else invariant +// plural: reuse es_pluralize on the agreed singular +// (Lexicon-backed adjectives in Python may differ; those divergences are what +// the parity check surfaces.) + +fn es_adj_feminine(lemma: String) -> String { + if str_eq(lemma, "español") { return "española" } + if str_eq(lemma, "francés") { return "francesa" } + if str_eq(lemma, "inglés") { return "inglesa" } + if str_eq(lemma, "alemán") { return "alemana" } + if str_eq(lemma, "trabajador") { return "trabajadora" } + if str_eq(lemma, "hablador") { return "habladora" } + if str_eq(lemma, "encantador") { return "encantadora" } + if es_str_ends(lemma, "o") { return es_str_drop_last(lemma, 1) + "a" } + return lemma +} + +fn es_inflect_adj(lemma: String, gender: String, number: String) -> String { + if str_eq(gender, "f") { + let fem: String = es_adj_feminine(lemma) + if str_eq(number, "plural") { return es_pluralize(fem) } + return fem + } + // masculine (citation) + if str_eq(number, "plural") { return es_pluralize(lemma) } + return lemma +} + +// ── Mandatory preposition + article contraction (de+el->del, a+el->al) ──────── +// +// Transcribed from realizer_es._contract. np_text is the already-realized NP +// beginning with "el " when the contraction fires. + +fn es_starts_el(np_text: String) -> Bool { + let n: Int = str_len(np_text) + if n < 3 { return false } + return str_eq(str_slice(np_text, 0, 3), "el ") +} + +fn es_contract(prep: String, np_text: String) -> String { + if es_starts_el(np_text) { + let rest: String = str_slice(np_text, 3, str_len(np_text)) + if str_eq(prep, "de") { return "del " + rest } + if str_eq(prep, "a") { return "al " + rest } + } + return prep + " " + np_text +} diff --git a/elp/src/vocabulary-es.el b/elp/src/vocabulary-es.el new file mode 100644 index 0000000..fd2b81f --- /dev/null +++ b/elp/src/vocabulary-es.el @@ -0,0 +1,362 @@ +;;; vocabulary-es.el — Spanish vocabulary for ELP surface realization. +;;; Schema: (lemma pos form0 form1 form2 en_translation semantic_hint) +;;; Source: UniMorph Spanish (github.com/unimorph/spa, CC-BY-SA 3.0), +;;; generated by gen_elp_es.py via morphology_es_full (real forms). +;;; Verbs: form0=present-ind-3sg form1=preterite-3sg form2=past-participle +;;; Nouns: form0=singular form1=plural form2=REAL gender (m/f, from lexicon — +;;; NOT an ending heuristic; this is what kills 'el mano'/'la día' errors) +;;; Adjs : form0=masc-sg form1=fem-sg form2=masc-pl + +(vocabulary-es + + ;; -- function / closed class (incl. mandatory contractions del/al) -------- + ("el" "det" "el" "los" "m" "the" "definite article m.sg") + ("la" "det" "la" "las" "f" "the" "definite article f.sg") + ("un" "det" "un" "unos" "m" "a" "indefinite article m.sg") + ("una" "det" "una" "unas" "f" "a" "indefinite article f.sg") + ("del" "contraction" "del" "" "" "of the" "de + el (mandatory contraction)") + ("al" "contraction" "al" "" "" "to the" "a + el (mandatory contraction)") + ("este" "dem" "este" "estos" "m" "this" "proximal dem m") + ("esta" "dem" "esta" "estas" "f" "this" "proximal dem f") + ("no" "neg" "no" "" "" "not/no" "sentential negator (preverbal)") + ("ninguno" "det" "ningún" "ninguna" "" "none" "negative determiner (apocope ningún m.sg)") + ("y" "conj" "y" "e" "" "and" "coordinator (e before i-/hi-)") + ("o" "conj" "o" "u" "" "or" "coordinator (u before o-/ho-)") + ("pero" "conj" "pero" "" "" "but" "adversative coordinator") + ("que" "conj" "que" "" "" "that" "complementizer / relative") + ("si" "conj" "si" "" "" "if" "conditional subordinator") + ("porque" "conj" "porque" "" "" "because" "causal subordinator") + ("cuando" "conj" "cuando" "" "" "when" "temporal subordinator") + ("a" "prep" "a" "" "" "to" "dir-obj (personal a) / dative / allative; a+el=al") + ("de" "prep" "de" "" "" "of/from" "genitive/ablative government; de+el=del") + ("en" "prep" "en" "" "" "in/on" "locative") + ("con" "prep" "con" "" "" "with" "comitative") + ("por" "prep" "por" "" "" "by/for" "passive agent / cause") + ("para" "prep" "para" "" "" "for" "purpose/benefactive") + ("contra" "prep" "contra" "" "" "against" "adversative government (protestar contra)") + ("sin" "prep" "sin" "" "" "without" "privative") + ("yo" "pron" "yo" "me" "mi" "I" "1sg subj/obj/poss") + ("tú" "pron" "tú" "te" "tu" "you" "2sg informal") + ("usted" "pron" "usted" "lo" "su" "you" "2sg formal (3sg agreement)") + ("él" "pron" "él" "lo" "su" "he" "3sg m subj/DO-clitic/poss") + ("ella" "pron" "ella" "la" "su" "she" "3sg f subj/DO-clitic/poss") + ("nosotros" "pron" "nosotros" "nos" "nuestro" "we" "1pl") + ("vosotros" "pron" "vosotros" "os" "vuestro" "you" "2pl informal") + ("ellos" "pron" "ellos" "los" "su" "they" "3pl m") + ("ellas" "pron" "ellas" "las" "su" "they" "3pl f") + ("le" "clitic" "le" "les" "" "to-him/her" "dative clitic 3sg/3pl (->se before lo/la)") + ("se" "clitic" "se" "se" "" "himself/-self" "reflexive / spurious-se (le+lo->se lo)") + + ;; -- verbs (form0=pres-3sg form1=pret-3sg form2=past-participle) ----------- + ("abrazar" "verb" "abraza" "abrazó" "abrazado" "abrazar" "ar/regular") + ("abrir" "verb" "abre" "abrió" "abierto" "abrir" "ir/irregular") + ("aceptar" "verb" "acepta" "aceptó" "aceptado" "aceptar" "ar/regular") + ("acordar" "verb" "acuerda" "acordó" "acordado" "acordar" "ar/regular") + ("amar" "verb" "ama" "amó" "amado" "amar" "ar/regular") + ("anunciar" "verb" "anuncia" "anunció" "anunciado" "anunciar" "ar/regular") + ("aprobar" "verb" "aprueba" "aprobó" "aprobado" "aprobar" "ar/regular") + ("aumentar" "verb" "aumenta" "aumentó" "aumentado" "aumentar" "ar/regular") + ("ayudar" "verb" "ayuda" "ayudó" "ayudado" "ayudar" "ar/regular") + ("bajar" "verb" "baja" "bajó" "bajado" "bajar" "ar/regular") + ("besar" "verb" "besa" "besó" "besado" "besar" "ar/regular") + ("buscar" "verb" "busca" "buscó" "buscado" "buscar" "ar/regular") + ("caer" "verb" "cae" "cayó" "caído" "caer" "er/regular") + ("cambiar" "verb" "cambia" "cambió" "cambiado" "cambiar" "ar/regular") + ("caminar" "verb" "camina" "caminó" "caminado" "caminar" "ar/regular") + ("cantar" "verb" "canta" "cantó" "cantado" "cantar" "ar/regular") + ("celebrar" "verb" "celebra" "celebró" "celebrado" "celebrar" "ar/regular") + ("cerrar" "verb" "cierra" "cerró" "cerrado" "cerrar" "ar/regular") + ("comenzar" "verb" "comienza" "comenzó" "comenzado" "comenzar" "ar/regular") + ("comer" "verb" "come" "comió" "comido" "comer" "er/regular") + ("condenar" "verb" "condena" "condenó" "condenado" "condenar" "ar/regular") + ("confirmar" "verb" "confirma" "confirmó" "confirmado" "confirmar" "ar/regular") + ("conocer" "verb" "conoce" "conoció" "conocido" "conocer" "er/regular") + ("contar" "verb" "cuenta" "contó" "contado" "contar" "ar/regular") + ("contratar" "verb" "contrata" "contrató" "contratado" "contratar" "ar/regular") + ("costar" "verb" "cuesta" "costó" "costado" "costar" "ar/regular") + ("crear" "verb" "crea" "creó" "creado" "crear" "ar/regular") + ("crecer" "verb" "crece" "creció" "crecido" "crecer" "er/regular") + ("creer" "verb" "cree" "creyó" "creído" "creer" "er/regular") + ("dar" "verb" "da" "dio" "dado" "dar" "ar/irregular") + ("deber" "verb" "debe" "debió" "debido" "deber" "er/regular") + ("decir" "verb" "dice" "dijo" "dicho" "decir" "ir/irregular") + ("dejar" "verb" "deja" "dejó" "dejado" "dejar" "ar/regular") + ("desaparecer" "verb" "desaparece" "desapareció" "desaparecido" "desaparecer" "er/regular") + ("descubrir" "verb" "descubre" "descubrió" "descubierto" "descubrir" "ir/irregular") + ("despedir" "verb" "despide" "despidió" "despedido" "despedir" "ir/regular") + ("detener" "verb" "detiene" "detuvo" "detenido" "detener" "er/regular") + ("dimitir" "verb" "dimite" "dimitió" "dimitido" "dimitir" "ir/regular") + ("doler" "verb" "duele" "dolió" "dolido" "doler" "er/regular") + ("dormir" "verb" "duerme" "durmió" "dormido" "dormir" "ir/regular") + ("durar" "verb" "dura" "duró" "durado" "durar" "ar/regular") + ("empezar" "verb" "empieza" "empezó" "empezado" "empezar" "ar/regular") + ("encontrar" "verb" "encuentra" "encontró" "encontrado" "encontrar" "ar/regular") + ("entender" "verb" "entiende" "entendió" "entendido" "entender" "er/regular") + ("entrar" "verb" "entra" "entró" "entrado" "entrar" "ar/regular") + ("entregar" "verb" "entrega" "entregó" "entregado" "entregar" "ar/regular") + ("escapar" "verb" "escapa" "escapó" "escapado" "escapar" "ar/regular") + ("escribir" "verb" "escribe" "escribió" "escrito" "escribir" "ir/regular") + ("escuchar" "verb" "escucha" "escuchó" "escuchado" "escuchar" "ar/regular") + ("esperar" "verb" "espera" "esperó" "esperado" "esperar" "ar/regular") + ("estar" "verb" "está" "estuvo" "estado" "estar" "ar/irregular") + ("estudiar" "verb" "estudia" "estudió" "estudiado" "estudiar" "ar/regular") + ("existir" "verb" "existe" "existió" "existido" "existir" "ir/regular") + ("explicar" "verb" "explica" "explicó" "explicado" "explicar" "ar/regular") + ("firmar" "verb" "firma" "firmó" "firmado" "firmar" "ar/regular") + ("ganar" "verb" "gana" "ganó" "ganado" "ganar" "ar/regular") + ("gritar" "verb" "grita" "gritó" "gritado" "gritar" "ar/regular") + ("guardar" "verb" "guarda" "guardó" "guardado" "guardar" "ar/regular") + ("gustar" "verb" "gusta" "gustó" "gustado" "gustar" "ar/regular") + ("haber" "verb" "ha" "hubo" "habido" "haber" "er/irregular") + ("hablar" "verb" "habla" "habló" "hablado" "hablar" "ar/regular") + ("hacer" "verb" "hace" "hizo" "hecho" "hacer" "er/irregular") + ("ir" "verb" "va" "fue" "ido" "ir" "ir/irregular") + ("jugar" "verb" "juega" "jugó" "jugado" "jugar" "ar/regular") + ("lavar" "verb" "lava" "lavó" "lavado" "lavar" "ar/regular") + ("leer" "verb" "lee" "leyó" "leído" "leer" "er/regular") + ("llamar" "verb" "llama" "llamó" "llamado" "llamar" "ar/regular") + ("llegar" "verb" "llega" "llegó" "llegado" "llegar" "ar/regular") + ("llevar" "verb" "lleva" "llevó" "llevado" "llevar" "ar/regular") + ("llover" "verb" "llueve" "llovió" "llovido" "llover" "er/regular") + ("mirar" "verb" "mira" "miró" "mirado" "mirar" "ar/regular") + ("morir" "verb" "muere" "murió" "muerto" "morir" "ir/irregular") + ("mostrar" "verb" "muestra" "mostró" "mostrado" "mostrar" "ar/regular") + ("nacer" "verb" "nace" "nació" "nacido" "nacer" "er/regular") + ("ocultar" "verb" "oculta" "ocultó" "ocultado" "ocultar" "ar/regular") + ("ofrecer" "verb" "ofrece" "ofreció" "ofrecido" "ofrecer" "er/regular") + ("olvidar" "verb" "olvida" "olvidó" "olvidado" "olvidar" "ar/regular") + ("oír" "verb" "oye" "oyó" "oído" "oír" "ar/regular") + ("parecer" "verb" "parece" "pareció" "parecido" "parecer" "er/regular") + ("pasar" "verb" "pasa" "pasó" "pasado" "pasar" "ar/regular") + ("pedir" "verb" "pide" "pidió" "pedido" "pedir" "ir/regular") + ("pensar" "verb" "piensa" "pensó" "pensado" "pensar" "ar/regular") + ("perder" "verb" "pierde" "perdió" "perdido" "perder" "er/regular") + ("perdonar" "verb" "perdona" "perdonó" "perdonado" "perdonar" "ar/regular") + ("poder" "verb" "puede" "pudo" "podido" "poder" "er/irregular") + ("poner" "verb" "pone" "puso" "puesto" "poner" "er/irregular") + ("preocupar" "verb" "preocupa" "preocupó" "preocupado" "preocupar" "ar/regular") + ("producir" "verb" "produce" "produjo" "producido" "producir" "ir/regular") + ("prometer" "verb" "promete" "prometió" "prometido" "prometer" "er/regular") + ("proponer" "verb" "propone" "propuso" "propuesto" "proponer" "er/regular") + ("prosperar" "verb" "prospera" "prosperó" "prosperado" "prosperar" "ar/regular") + ("protestar" "verb" "protesta" "protestó" "protestado" "protestar" "ar/regular") + ("quedar" "verb" "queda" "quedó" "quedado" "quedar" "ar/regular") + ("querer" "verb" "quiere" "quiso" "querido" "querer" "er/irregular") + ("recordar" "verb" "recuerda" "recordó" "recordado" "recordar" "ar/regular") + ("recorrer" "verb" "recorre" "recorrió" "recorrido" "recorrer" "er/regular") + ("regresar" "verb" "regresa" "regresó" "regresado" "regresar" "ar/regular") + ("renacer" "verb" "renace" "renació" "renacido" "renacer" "er/regular") + ("saber" "verb" "sabe" "supo" "sabido" "saber" "er/irregular") + ("salir" "verb" "sale" "salió" "salido" "salir" "ir/irregular") + ("sentar" "verb" "sienta" "sentó" "sentado" "sentar" "ar/regular") + ("sentir" "verb" "siente" "sintió" "sentido" "sentir" "ir/regular") + ("separar" "verb" "separa" "separó" "separado" "separar" "ar/regular") + ("ser" "verb" "es" "fue" "sido" "ser" "er/irregular") + ("sonreír" "verb" "sonríe" "sonrió" "sonreído" "sonreír" "ar/regular") + ("soplar" "verb" "sopla" "sopló" "soplado" "soplar" "ar/regular") + ("sorprender" "verb" "sorprende" "sorprendió" "sorprendido" "sorprender" "er/regular") + ("soñar" "verb" "sueña" "soñó" "soñado" "soñar" "ar/regular") + ("subir" "verb" "sube" "subió" "subido" "subir" "ir/regular") + ("tener" "verb" "tiene" "tuvo" "tenido" "tener" "er/irregular") + ("terminar" "verb" "termina" "terminó" "terminado" "terminar" "ar/regular") + ("tocar" "verb" "toca" "tocó" "tocado" "tocar" "ar/regular") + ("tomar" "verb" "toma" "tomó" "tomado" "tomar" "ar/regular") + ("trabajar" "verb" "trabaja" "trabajó" "trabajado" "trabajar" "ar/regular") + ("vender" "verb" "vende" "vendió" "vendido" "vender" "er/regular") + ("venir" "verb" "viene" "vino" "venido" "venir" "ir/irregular") + ("ver" "verb" "ve" "vio" "visto" "ver" "er/irregular") + ("viajar" "verb" "viaja" "viajó" "viajado" "viajar" "ar/regular") + ("vivir" "verb" "vive" "vivió" "vivido" "vivir" "ir/regular") + ("volver" "verb" "vuelve" "volvió" "vuelto" "volver" "er/irregular") + + ;; -- nouns (form0=sg form1=pl form2=REAL gender m/f) ---------------------- + ("Barcelona" "noun" "barcelona" "barcelonas" "f" "Barcelona" "gender:heuristic") + ("Madrid" "noun" "madrid" "madrides" "m" "Madrid" "gender:heuristic") + ("María" "noun" "maría" "marías" "f" "María" "gender:heuristic") + ("acuerdo" "noun" "acuerdo" "acuerdos" "m" "acuerdo" "gender:lexicon") + ("acusado" "noun" "acusado" "acusados" "m" "acusado" "gender:lexicon") + ("agua" "noun" "agua" "aguas" "f" "agua" "gender:lexicon") + ("amigo" "noun" "amigo" "amigos" "m" "amigo" "gender:lexicon") + ("amor" "noun" "amor" "amores" "m" "amor" "gender:lexicon") + ("anciano" "noun" "anciano" "ancianos" "m" "anciano" "gender:lexicon") + ("autor" "noun" "autor" "autores" "m" "autor" "gender:lexicon") + ("ayuda" "noun" "ayuda" "ayudas" "f" "ayuda" "gender:lexicon") + ("año" "noun" "año" "años" "m" "año" "gender:lexicon") + ("banco" "noun" "banco" "bancos" "m" "banco" "gender:lexicon") + ("barco" "noun" "barco" "barcos" "m" "barco" "gender:lexicon") + ("baño" "noun" "baño" "baños" "m" "baño" "gender:lexicon") + ("beneficio" "noun" "beneficio" "beneficios" "m" "beneficio" "gender:lexicon") + ("billete" "noun" "billete" "billetes" "m" "billete" "gender:lexicon") + ("café" "noun" "café" "cafés" "m" "café" "gender:lexicon") + ("calma" "noun" "calma" "calmas" "f" "calma" "gender:lexicon") + ("camino" "noun" "camino" "caminos" "m" "camino" "gender:lexicon") + ("canción" "noun" "canción" "canciones" "f" "canción" "gender:lexicon") + ("candidato" "noun" "candidato" "candidatos" "m" "candidato" "gender:lexicon") + ("casa" "noun" "casa" "casas" "f" "casa" "gender:lexicon") + ("cena" "noun" "cena" "cenas" "f" "cena" "gender:lexicon") + ("ciudad" "noun" "ciudad" "ciudades" "f" "ciudad" "gender:lexicon") + ("ciudadano" "noun" "ciudadano" "ciudadanos" "m" "ciudadano" "gender:lexicon") + ("color" "noun" "color" "colores" "m" "color" "gender:lexicon") + ("condición" "noun" "condición" "condiciones" "f" "condición" "gender:lexicon") + ("corazón" "noun" "corazón" "corazones" "m" "corazón" "gender:lexicon") + ("costa" "noun" "costa" "costas" "f" "costa" "gender:lexicon") + ("crisis" "noun" "crisis" "crisis" "f" "crisis" "gender:lexicon") + ("crédito" "noun" "crédito" "créditos" "m" "crédito" "gender:lexicon") + ("culpa" "noun" "culpa" "culpas" "f" "culpa" "gender:lexicon") + ("damnificado" "noun" "damnificado" "damnificados" "m" "damnificado" "gender:lexicon") + ("demás" "noun" "demás" "demás" "m" "demás" "gender:heuristic") + ("dinero" "noun" "dinero" "dineros" "m" "dinero" "gender:lexicon") + ("día" "noun" "día" "días" "m" "día" "gender:lexicon") + ("economía" "noun" "economía" "economías" "f" "economía" "gender:lexicon") + ("elección" "noun" "elección" "elecciones" "f" "elección" "gender:lexicon") + ("empleo" "noun" "empleo" "empleos" "m" "empleo" "gender:lexicon") + ("empresa" "noun" "empresa" "empresas" "f" "empresa" "gender:lexicon") + ("equipo" "noun" "equipo" "equipos" "m" "equipo" "gender:lexicon") + ("estación" "noun" "estación" "estaciones" "f" "estación" "gender:lexicon") + ("estudiante" "noun" "estudiante" "estudiantes" "m" "estudiante" "gender:lexicon") + ("experto" "noun" "experto" "expertos" "m" "experto" "gender:lexicon") + ("fiesta" "noun" "fiesta" "fiestas" "f" "fiesta" "gender:lexicon") + ("flor" "noun" "flor" "flores" "f" "flor" "gender:lexicon") + ("foto" "noun" "foto" "fotos" "f" "foto" "gender:lexicon") + ("frío" "noun" "frío" "fríos" "m" "frío" "gender:lexicon") + ("fuego" "noun" "fuego" "fuegos" "m" "fuego" "gender:lexicon") + ("fuerza" "noun" "fuerza" "fuerzas" "f" "fuerza" "gender:lexicon") + ("gato" "noun" "gato" "gatos" "m" "gato" "gender:lexicon") + ("gobierno" "noun" "gobierno" "gobiernos" "m" "gobierno" "gender:lexicon") + ("gusto" "noun" "gusto" "gustos" "m" "gusto" "gender:lexicon") + ("hermano" "noun" "hermano" "hermanos" "m" "hermano" "gender:lexicon") + ("hombre" "noun" "hombre" "hombres" "m" "hombre" "gender:lexicon") + ("jardín" "noun" "jardín" "jardines" "m" "jardín" "gender:lexicon") + ("juez" "noun" "juez" "jueces" "m" "juez" "gender:lexicon") + ("juicio" "noun" "juicio" "juicios" "m" "juicio" "gender:lexicon") + ("lentitud" "noun" "lentitud" "lentitudes" "f" "lentitud" "gender:lexicon") + ("ley" "noun" "ley" "leyes" "f" "ley" "gender:lexicon") + ("libertad" "noun" "libertad" "libertades" "f" "libertad" "gender:lexicon") + ("libro" "noun" "libro" "libros" "m" "libro" "gender:lexicon") + ("llave" "noun" "llave" "llaves" "f" "llave" "gender:lexicon") + ("lluvia" "noun" "lluvia" "lluvias" "f" "lluvia" "gender:lexicon") + ("luna" "noun" "luna" "lunas" "f" "luna" "gender:lexicon") + ("luz" "noun" "luz" "luces" "f" "luz" "gender:lexicon") + ("madre" "noun" "madre" "madres" "f" "madre" "gender:lexicon") + ("mano" "noun" "mano" "manos" "f" "mano" "gender:lexicon") + ("mapa" "noun" "mapa" "mapas" "m" "mapa" "gender:lexicon") + ("mar" "noun" "mar" "mares" "m" "mar" "gender:lexicon") + ("marea" "noun" "marea" "mareas" "f" "marea" "gender:lexicon") + ("memoria" "noun" "memoria" "memorias" "f" "memoria" "gender:lexicon") + ("mesa" "noun" "mesa" "mesas" "f" "mesa" "gender:lexicon") + ("ministro" "noun" "ministro" "ministros" "m" "ministro" "gender:lexicon") + ("montaña" "noun" "montaña" "montañas" "f" "montaña" "gender:lexicon") + ("moto" "noun" "moto" "motos" "f" "moto" "gender:lexicon") + ("mujer" "noun" "mujer" "mujeres" "f" "mujer" "gender:lexicon") + ("mundo" "noun" "mundo" "mundos" "m" "mundo" "gender:lexicon") + ("música" "noun" "música" "músicas" "f" "música" "gender:lexicon") + ("nación" "noun" "nación" "naciones" "f" "nación" "gender:lexicon") + ("niebla" "noun" "niebla" "nieblas" "f" "niebla" "gender:lexicon") + ("nieve" "noun" "nieve" "nieves" "f" "nieve" "gender:lexicon") + ("niña" "noun" "niña" "niñas" "f" "niña" "gender:lexicon") + ("niño" "noun" "niño" "niños" "m" "niño" "gender:lexicon") + ("noche" "noun" "noche" "noches" "f" "noche" "gender:lexicon") + ("nombre" "noun" "nombre" "nombres" "m" "nombre" "gender:lexicon") + ("ojo" "noun" "ojo" "ojos" "m" "ojo" "gender:heuristic") + ("orilla" "noun" "orilla" "orillas" "f" "orilla" "gender:lexicon") + ("paisaje" "noun" "paisaje" "paisajes" "m" "paisaje" "gender:lexicon") + ("parlamento" "noun" "parlamento" "parlamentos" "m" "parlamento" "gender:lexicon") + ("parte" "noun" "parte" "partes" "f" "parte" "gender:lexicon") + ("pasillo" "noun" "pasillo" "pasillos" "m" "pasillo" "gender:lexicon") + ("país" "noun" "país" "países" "m" "país" "gender:lexicon") + ("película" "noun" "película" "películas" "f" "película" "gender:lexicon") + ("perro" "noun" "perro" "perros" "m" "perro" "gender:lexicon") + ("persona" "noun" "persona" "personas" "f" "persona" "gender:lexicon") + ("petróleo" "noun" "petróleo" "petróleos" "m" "petróleo" "gender:lexicon") + ("pez" "noun" "pez" "peces" "f" "pez" "gender:lexicon") + ("plan" "noun" "plan" "planes" "m" "plan" "gender:lexicon") + ("policía" "noun" "policía" "policías" "f" "policía" "gender:lexicon") + ("portavoz" "noun" "portavoz" "portavoces" "m" "portavoz" "gender:lexicon") + ("portero" "noun" "portero" "porteros" "m" "portero" "gender:lexicon") + ("precio" "noun" "precio" "precios" "m" "precio" "gender:lexicon") + ("presidente" "noun" "presidente" "presidentes" "m" "presidente" "gender:lexicon") + ("problema" "noun" "problema" "problemas" "m" "problema" "gender:lexicon") + ("programa" "noun" "programa" "programas" "m" "programa" "gender:lexicon") + ("proyecto" "noun" "proyecto" "proyectos" "m" "proyecto" "gender:lexicon") + ("puerta" "noun" "puerta" "puertas" "f" "puerta" "gender:lexicon") + ("pájaro" "noun" "pájaro" "pájaros" "m" "pájaro" "gender:lexicon") + ("razón" "noun" "razón" "razones" "f" "razón" "gender:lexicon") + ("raíz" "noun" "raíz" "raíces" "f" "raíz" "gender:lexicon") + ("recuerdo" "noun" "recuerdo" "recuerdos" "m" "recuerdo" "gender:lexicon") + ("reforma" "noun" "reforma" "reformas" "f" "reforma" "gender:lexicon") + ("región" "noun" "región" "regiones" "f" "región" "gender:lexicon") + ("río" "noun" "río" "ríos" "m" "río" "gender:lexicon") + ("semilla" "noun" "semilla" "semillas" "f" "semilla" "gender:lexicon") + ("sendero" "noun" "sendero" "senderos" "m" "sendero" "gender:lexicon") + ("señor" "noun" "señor" "señores" "m" "señor" "gender:lexicon") + ("silencio" "noun" "silencio" "silencios" "m" "silencio" "gender:lexicon") + ("silla" "noun" "silla" "sillas" "f" "silla" "gender:lexicon") + ("sol" "noun" "sol" "soles" "m" "sol" "gender:lexicon") + ("tarea" "noun" "tarea" "tareas" "f" "tarea" "gender:lexicon") + ("tema" "noun" "tema" "temas" "m" "tema" "gender:lexicon") + ("ti" "noun" "ti" "tis" "m" "ti" "gender:heuristic") + ("tiempo" "noun" "tiempo" "tiempos" "m" "tiempo" "gender:lexicon") + ("tipo" "noun" "tipo" "tipos" "m" "tipo" "gender:lexicon") + ("todo" "noun" "todo" "todos" "m" "todo" "gender:heuristic") + ("tormenta" "noun" "tormenta" "tormentas" "f" "tormenta" "gender:lexicon") + ("trabajador" "noun" "trabajador" "trabajadores" "m" "trabajador" "gender:lexicon") + ("tristeza" "noun" "tristeza" "tristezas" "f" "tristeza" "gender:lexicon") + ("ventana" "noun" "ventana" "ventanas" "f" "ventana" "gender:lexicon") + ("verdad" "noun" "verdad" "verdades" "f" "verdad" "gender:lexicon") + ("viaje" "noun" "viaje" "viajes" "m" "viaje" "gender:lexicon") + ("victoria" "noun" "victoria" "victorias" "f" "victoria" "gender:lexicon") + ("vida" "noun" "vida" "vidas" "f" "vida" "gender:lexicon") + ("viento" "noun" "viento" "vientos" "m" "viento" "gender:lexicon") + ("voz" "noun" "voz" "voces" "f" "voz" "gender:lexicon") + ("vuelta" "noun" "vuelta" "vueltas" "f" "vuelta" "gender:lexicon") + ("árbol" "noun" "árbol" "árboles" "m" "árbol" "gender:lexicon") + + ;; -- adjectives (form0=masc-sg form1=fem-sg form2=masc-pl) ---------------- + ("alto" "adj" "alto" "alta" "altos" "alto" "lexicon") + ("ambos" "adj" "ambos" "ambos" "ambos" "ambos" "rule") + ("antiguo" "adj" "antiguo" "antigua" "antiguos" "antiguo" "lexicon") + ("azul" "adj" "azul" "azul" "azules" "azul" "lexicon") + ("bajo" "adj" "bajo" "baja" "bajos" "bajo" "lexicon") + ("blanco" "adj" "blanco" "blanca" "blancos" "blanco" "lexicon") + ("bondadoso" "adj" "bondadoso" "bondadosa" "bondadosos" "bondadoso" "lexicon") + ("bonito" "adj" "bonito" "bonita" "bonitos" "bonito" "lexicon") + ("bueno" "adj" "bueno" "buena" "buenos" "bueno" "lexicon") + ("cansado" "adj" "cansado" "cansada" "cansados" "cansado" "lexicon") + ("corto" "adj" "corto" "corta" "cortos" "corto" "lexicon") + ("difícil" "adj" "difícil" "difícil" "difíciles" "difícil" "lexicon") + ("dos" "adj" "dos" "dos" "dos" "dos" "rule") + ("económico" "adj" "económico" "económica" "económicos" "económico" "lexicon") + ("español" "adj" "español" "española" "españoles" "español" "lexicon") + ("estrecho" "adj" "estrecho" "estrecha" "estrechos" "estrecho" "lexicon") + ("fascinante" "adj" "fascinante" "fascinante" "fascinantes" "fascinante" "rule") + ("feliz" "adj" "feliz" "feliz" "felices" "feliz" "lexicon") + ("francés" "adj" "francés" "francesa" "franceses" "francés" "lexicon") + ("frío" "adj" "frío" "fría" "fríos" "frío" "lexicon") + ("fácil" "adj" "fácil" "fácil" "fáciles" "fácil" "lexicon") + ("grande" "adj" "grande" "grande" "grandes" "grande" "lexicon") + ("hermoso" "adj" "hermoso" "hermosa" "hermosos" "hermoso" "lexicon") + ("importante" "adj" "importante" "importante" "importantes" "importante" "lexicon") + ("inglés" "adj" "inglés" "inglesa" "ingleses" "inglés" "lexicon") + ("largo" "adj" "largo" "larga" "largos" "largo" "lexicon") + ("lento" "adj" "lento" "lenta" "lentos" "lento" "lexicon") + ("malo" "adj" "malo" "mala" "malos" "malo" "lexicon") + ("mucho" "adj" "mucho" "mucha" "muchos" "mucho" "lexicon") + ("necesario" "adj" "necesario" "necesaria" "necesarios" "necesario" "lexicon") + ("negro" "adj" "negro" "negra" "negros" "negro" "lexicon") + ("nuevo" "adj" "nuevo" "nueva" "nuevos" "nuevo" "lexicon") + ("olvidado" "adj" "olvidado" "olvidada" "olvidados" "olvidado" "lexicon") + ("oscuro" "adj" "oscuro" "oscura" "oscuros" "oscuro" "lexicon") + ("pequeño" "adj" "pequeño" "pequeña" "pequeños" "pequeño" "lexicon") + ("político" "adj" "político" "política" "políticos" "político" "lexicon") + ("posible" "adj" "posible" "posible" "posibles" "posible" "lexicon") + ("rojo" "adj" "rojo" "roja" "rojos" "rojo" "lexicon") + ("rápido" "adj" "rápido" "rápida" "rápidos" "rápido" "lexicon") + ("sabio" "adj" "sabio" "sabia" "sabios" "sabio" "lexicon") + ("silencioso" "adj" "silencioso" "silenciosa" "silenciosos" "silencioso" "lexicon") + ("social" "adj" "social" "social" "sociales" "social" "lexicon") + ("trabajador" "adj" "trabajador" "trabajadora" "trabajadores" "trabajador" "lexicon") + ("triste" "adj" "triste" "triste" "tristes" "triste" "rule") + ("verde" "adj" "verde" "verde" "verdes" "verde" "lexicon") + ("viejo" "adj" "viejo" "vieja" "viejos" "viejo" "lexicon") + +) diff --git a/elp/tests/gen_elp_es.py b/elp/tests/gen_elp_es.py new file mode 100644 index 0000000..c9623cf --- /dev/null +++ b/elp/tests/gen_elp_es.py @@ -0,0 +1,262 @@ +# -*- coding: utf-8 -*- +"""gen_elp_es.py — emit the ELP (.el) port artifacts for Spanish. + +Mirrors gen_elp_en.py. Produces: + vocabulary-es.el real generated vocabulary in the established schema + [lemma, pos, form0, form1, form2, en_translation, semantic_hint] + (same schema as vocabulary-got.el / vocabulary-en.el; + UniMorph spa lineage). + Verbs : form0=present-ind-3sg form1=preterite-3sg form2=past-participle + Nouns : form0=singular form1=plural form2=REAL gender (m/f, lexicon) + Adjs : form0=masc-sg form1=fem-sg form2=masc-pl + lang_profile_es.el the Spanish profile with the flags the realizer keys on. + +Every form is generated by morphology_es_full (real UniMorph lexicon, not +hand-typed), so the .el vocabulary is honest and reproduces the forms the +realizer used. CRITICAL (coordinator quality bar): noun gender in form2 is the +REAL per-lemma lexicon gender (N;FEM/MASC), NOT an ending heuristic — this is +what kills the 'el mano / la día' masculine-default error class. +""" +import morphology_es_full as M +from test_set_es import TESTS +from held_out_es import HELD + +# ── core closed class + common content lemmas so the vocab is usable beyond the +# validated sentences ────────────────────────────────────────────────────── +_CORE_VERBS = ["ser", "estar", "haber", "tener", "hacer", "ir", "ver", "dar", + "saber", "poder", "querer", "venir", "decir", "poner", "salir", + "hablar", "comer", "vivir", "trabajar", "estudiar", "llegar", + "pasar", "deber", "parecer", "quedar", "creer", "dejar", "llevar", + "encontrar", "llamar", "pensar", "volver", "conocer", "sentir", + "contar", "empezar", "buscar", "esperar", "existir", "entrar", + "escribir", "perder", "producir", "recordar", "morir", "nacer", + "abrir", "escapar", "soñar", "amar", "caer", "leer", "oír"] +_CORE_NOUNS = ["tiempo", "persona", "año", "día", "mano", "mundo", "vida", + "hombre", "mujer", "parte", "casa", "país", "problema", "programa", + "tema", "mapa", "agua", "foto", "moto", "ciudad", "libertad", + "canción", "nación", "flor", "color", "amor", "señor", "viaje", + "paisaje", "gato", "perro", "libro", "mesa", "silla", "noche", + "luz", "voz", "pez", "raíz", "crisis", "sol", "luna", "mar", + "corazón", "flor", "árbol", "camino", "puerta", "ventana"] +_CORE_ADJS = ["bueno", "malo", "nuevo", "viejo", "grande", "pequeño", "alto", + "bajo", "largo", "corto", "feliz", "triste", "fácil", "difícil", + "rápido", "lento", "hermoso", "económico", "político", "social", + "azul", "rojo", "verde", "blanco", "negro", "español", "francés", + "inglés", "importante", "posible", "necesario", "trabajador"] + +# closed-class function words. Contractions (del/al) and the government notes +# are the coordinator's quality bar (mandatory contraction; verb-prep govt). +_FUNCTION = [ + # articles (gender/number agreement is in morphology; these are citation) + ("el", "det", "el", "los", "m", "the", "definite article m.sg"), + ("la", "det", "la", "las", "f", "the", "definite article f.sg"), + ("un", "det", "un", "unos","m", "a", "indefinite article m.sg"), + ("una", "det", "una", "unas","f", "a", "indefinite article f.sg"), + # MANDATORY CONTRACTIONS (prep + el) — del / al + ("del", "contraction", "del", "", "", "of the", "de + el (mandatory contraction)"), + ("al", "contraction", "al", "", "", "to the", "a + el (mandatory contraction)"), + # demonstratives + ("este", "dem", "este", "estos", "m", "this", "proximal dem m"), + ("esta", "dem", "esta", "estas", "f", "this", "proximal dem f"), + # negation (SACRED — polarity never dropped) + ("no", "neg", "no", "", "", "not/no", "sentential negator (preverbal)"), + ("ninguno", "det", "ningún", "ninguna", "", "none", "negative determiner (apocope ningún m.sg)"), + # conjunctions + ("y", "conj", "y", "e", "", "and", "coordinator (e before i-/hi-)"), + ("o", "conj", "o", "u", "", "or", "coordinator (u before o-/ho-)"), + ("pero", "conj", "pero", "", "", "but", "adversative coordinator"), + ("que", "conj", "que", "", "", "that", "complementizer / relative"), + ("si", "conj", "si", "", "", "if", "conditional subordinator"), + ("porque", "conj", "porque", "", "", "because", "causal subordinator"), + ("cuando", "conj", "cuando", "", "", "when", "temporal subordinator"), + # prepositions (government: verbs select these; contraction with el applies to a/de) + ("a", "prep", "a", "", "", "to", "dir-obj (personal a) / dative / allative; a+el=al"), + ("de", "prep", "de", "", "", "of/from", "genitive/ablative government; de+el=del"), + ("en", "prep", "en", "", "", "in/on", "locative"), + ("con", "prep", "con", "", "", "with", "comitative"), + ("por", "prep", "por", "", "", "by/for", "passive agent / cause"), + ("para", "prep", "para", "", "", "for", "purpose/benefactive"), + ("contra", "prep", "contra", "", "", "against", "adversative government (protestar contra)"), + ("sin", "prep", "sin", "", "", "without", "privative"), + # subject pronouns + ("yo", "pron", "yo", "me", "mi", "I", "1sg subj/obj/poss"), + ("tú", "pron", "tú", "te", "tu", "you", "2sg informal"), + ("usted", "pron", "usted", "lo", "su", "you", "2sg formal (3sg agreement)"), + ("él", "pron", "él", "lo", "su", "he", "3sg m subj/DO-clitic/poss"), + ("ella", "pron", "ella", "la", "su", "she", "3sg f subj/DO-clitic/poss"), + ("nosotros", "pron", "nosotros", "nos", "nuestro", "we", "1pl"), + ("vosotros", "pron", "vosotros", "os", "vuestro", "you", "2pl informal"), + ("ellos", "pron", "ellos", "los", "su", "they", "3pl m"), + ("ellas", "pron", "ellas", "las", "su", "they", "3pl f"), + # indirect-object clitics + ("le", "clitic", "le", "les", "", "to-him/her", "dative clitic 3sg/3pl (->se before lo/la)"), + ("se", "clitic", "se", "se", "", "himself/-self", "reflexive / spurious-se (le+lo->se lo)"), +] + + +def _walk_collect(spec, verbs, nouns, adjs): + """Recursively collect verb/noun/adj lemmas from a semantic spec.""" + if isinstance(spec, dict): + if spec.get("pred"): + verbs.add(spec["pred"]) + if spec.get("noun"): + nouns.add(spec["noun"]) + if spec.get("adj"): + adjs.add(spec["adj"]) + if spec.get("superlative"): + adjs.add(spec["superlative"]) + if spec.get("from_adj"): + adjs.add(spec["from_adj"]) + # adjs: [{"lemma":..,"pos":..}] | ["lemma", ..] + for a in spec.get("adjs", []) or []: + adjs.add(a["lemma"] if isinstance(a, dict) else a) + for a in spec.get("adj_coord", []) or []: + adjs.add(a["lemma"] if isinstance(a, dict) else a) + if isinstance(spec.get("pcomp"), dict): + pc = spec["pcomp"] + if pc.get("adj"): + adjs.add(pc["adj"]) + for a in pc.get("adj_coord", []) or []: + adjs.add(a["lemma"] if isinstance(a, dict) else a) + for v in spec.values(): + _walk_collect(v, verbs, nouns, adjs) + elif isinstance(spec, list): + for it in spec: + _walk_collect(it, verbs, nouns, adjs) + + +def _collect_from_specs(): + verbs, nouns, adjs = set(), set(), set() + for t in TESTS + HELD: + _walk_collect(t["spec"], verbs, nouns, adjs) + return verbs, nouns, adjs + + +def _esc(s): + return str(s).replace('"', '\\"') + + +def _row(fields): + return " (" + " ".join(f'"{_esc(f)}"' for f in fields) + ")" + + +def emit_vocabulary(path): + v_specs, n_specs, a_specs = _collect_from_specs() + verbs = sorted(set(_CORE_VERBS) | v_specs) + nouns = sorted(set(_CORE_NOUNS) | n_specs) + adjs = sorted(set(_CORE_ADJS) | a_specs) + + lines = [ + ";;; vocabulary-es.el — Spanish vocabulary for ELP surface realization.", + ";;; Schema: (lemma pos form0 form1 form2 en_translation semantic_hint)", + ";;; Source: UniMorph Spanish (github.com/unimorph/spa, CC-BY-SA 3.0),", + ";;; generated by gen_elp_es.py via morphology_es_full (real forms).", + ";;; Verbs: form0=present-ind-3sg form1=preterite-3sg form2=past-participle", + ";;; Nouns: form0=singular form1=plural form2=REAL gender (m/f, from lexicon —", + ";;; NOT an ending heuristic; this is what kills 'el mano'/'la día' errors)", + ";;; Adjs : form0=masc-sg form1=fem-sg form2=masc-pl", + "", + "(vocabulary-es", + "", + " ;; -- function / closed class (incl. mandatory contractions del/al) --------", + ] + for f in _FUNCTION: + lines.append(_row(f)) + + lines.append("") + lines.append(" ;; -- verbs (form0=pres-3sg form1=pret-3sg form2=past-participle) -----------") + for lem in verbs: + f0, c0 = M.conjugate(lem, "ind", "present", "third", "singular") + f1, c1 = M.conjugate(lem, "ind", "preterite", "third", "singular") + pp, cp = M.participle(lem) + vclass = lem[-2:] if lem[-2:] in ("ar", "er", "ir") else "ar" + irr = "irregular" if (c0 == "lexicon" and pp in M._IRREG_PART.values()) or \ + lem in ("ser", "estar", "ir", "haber", "tener", "hacer", "ver", + "dar", "saber", "poder", "querer", "venir", "decir", + "poner", "salir") else "regular" + lines.append(_row([lem, "verb", f0, f1, pp, lem, vclass + "/" + irr])) + + lines.append("") + lines.append(" ;; -- nouns (form0=sg form1=pl form2=REAL gender m/f) ----------------------") + for lem in nouns: + sg, _ = M.inflect_noun(lem, "singular") + pl, _ = M.inflect_noun(lem, "plural") + g = M.noun_gender(lem) + # honesty flag: did gender come from the lexicon, or a heuristic fallback? + src = "lexicon" if (lem in M._NOUNS and M._NOUNS[lem].get("g")) else "heuristic" + lines.append(_row([lem, "noun", sg, pl, g, lem, "gender:" + src])) + + lines.append("") + lines.append(" ;; -- adjectives (form0=masc-sg form1=fem-sg form2=masc-pl) ----------------") + for lem in adjs: + m_sg, _ = M.inflect_adj(lem, "m", "singular") + f_sg, _ = M.inflect_adj(lem, "f", "singular") + m_pl, _ = M.inflect_adj(lem, "m", "plural") + src = "lexicon" if lem in M._ADJS else "rule" + lines.append(_row([lem, "adj", m_sg, f_sg, m_pl, lem, src])) + + lines.append("") + lines.append(")") + with open(path, "w", encoding="utf-8") as fh: + fh.write("\n".join(lines) + "\n") + return len(_FUNCTION) + len(verbs) + len(nouns) + len(adjs), len(verbs), len(nouns), len(adjs) + + +LANG_PROFILE = ''';;; lang_profile_es.el — Spanish language profile for ELP. +;;; Keys the realizer's construction switches. Mirrors lang_profile_en / _pt. + +(lang_profile_es + (language "Spanish") + (iso639 "es") + (family "Romance") + + ;; -- core typology flags ------------------------------------------------- + (pro-drop yes) ; subjects routinely dropped; agreement carries person + (obligatory-subject no) + (grammatical-gender yes) ; m/f on every noun; article+adjective AGREE + (gender-source lexicon); REAL per-noun gender from UniMorph — NOT a heuristic + (do-support no) + (subject-aux-inversion no) ; questions by intonation/punctuation, not inversion + (question-strategy intonation) + (article-selection "el/la/los/las un/una/unos/unas") + (stressed-a-rule yes) ; fem sg noun in stressed a-/ha- takes el/un (el agua) + (adjective-position postnominal) ; default post; a few prenominal + apocope + (adjective-agreement "gender+number") + (question-punct inverted) ; opening ¿ ¡ required + + ;; -- MANDATORY CONTRACTIONS (coordinator quality bar) -------------------- + (contractions ((de el "del") (a el "al"))) + (contraction-mandatory yes) ; 'de el'/'a el' MUST surface as del/al + + ;; -- verb / aspect system ------------------------------------------------ + (verb-classes (ar er ir)) + (tenses (present preterite imperfect future conditional)) + (moods (ind sbjv imp)) + (finite-agreement "person+number (6 slots)") + (perfect-aux "haber") ; haber + past participle (invariant -o) + (progressive-aux "estar") ; estar + gerund + (passive-aux "ser") ; ser + participle (agrees) + por-agent + (copula-split "ser/estar") ; permanent vs stage-level + (future "infinitive + é/ás/á/emos/éis/án") + + ;; -- clitics / government ------------------------------------------------ + (object-clitics yes) ; me te lo la le nos os los las; proclisis/enclisis + (clitic-order "se II I III (le+lo -> se lo)") + (enclisis "imperative/infinitive/gerund + accent repair (dá+me+lo->dámelo)") + (verb-prep-government yes) ; verbs select prep (protestar+contra, escapar+de) + + ;; -- SACRED safety bar (shared with en/pt) ------------------------------- + (negation-faithful yes)) ; polarity never dropped/inverted; unplaceable -> FLAG +''' + + +if __name__ == "__main__": + import sys + voc_path = sys.argv[1] if len(sys.argv) > 1 else "vocabulary-es.el" + lp_path = sys.argv[2] if len(sys.argv) > 2 else "lang_profile_es.el" + total, nv, nn, na = emit_vocabulary(voc_path) + with open(lp_path, "w", encoding="utf-8") as fh: + fh.write(LANG_PROFILE) + print(f"wrote {voc_path} ({total} entries: {len(_FUNCTION)} fn, {nv} verbs, {nn} nouns, {na} adjs)") + print(f"wrote {lp_path}") + print("lexicon:", M.lexicon_stats()) diff --git a/elp/tests/gen_parity_es.py b/elp/tests/gen_parity_es.py new file mode 100644 index 0000000..6764e4d --- /dev/null +++ b/elp/tests/gen_parity_es.py @@ -0,0 +1,100 @@ +# -*- coding: utf-8 -*- +"""gen_parity_es.py — emit an El parity program that checks the .el Spanish +morphology against the validated Python (UniMorph-backed) realizer. + +Python is the ORACLE. For every lemma in the held-out inventory we embed the +Python-produced form, call the corresponding .el function, and the El program +prints PASS/FAIL per category. Aggregation is done in bash (grep -c), so no +El-side mutable counters are needed. + +Categories: + Vpres verb present-ind-3sg es_conjugate(v,present,third,singular) + Vpret verb preterite-3sg es_conjugate(v,past,third,singular) + Vpart past participle es_participle(v) + Npl noun plural es_pluralize(n) + Gheur noun gender HEURISTIC es_gender(n) [exposes the bug] + Aheur def article via heuristic es_agree_article(n,true,sg) [inherits the bug] + Avocab def article via REAL g es_article_for_gender(realg,...) [the fix] + Ampl adj masc-plural es_inflect_adj(a,m,plural) + Afsg adj fem-singular es_inflect_adj(a,f,singular) + Ctr contraction del/al es_contract(prep, np) +""" +import morphology_es_full as M +import realizer_es as R +from gen_elp_es import _collect_from_specs, _CORE_VERBS, _CORE_NOUNS, _CORE_ADJS + + +def _esc(s): + return str(s).replace('\\', '\\\\').replace('"', '\\"') + + +def _check(cat, lemma, el_call, expected): + return (f' es_check("{cat}", "{_esc(lemma)}", {el_call}, "{_esc(expected)}")') + + +def main(out_path): + v_specs, n_specs, a_specs = _collect_from_specs() + verbs = sorted(set(_CORE_VERBS) | v_specs) + nouns = sorted(set(_CORE_NOUNS) | n_specs) + adjs = sorted(set(_CORE_ADJS) | a_specs) + + lines = [] + lines.append("// gen'd parity checks — Python oracle embedded, El functions called.") + lines.append("fn es_check(cat: String, lemma: String, got: String, exp: String) {") + lines.append(' if str_eq(got, exp) {') + lines.append(' println("PASS " + cat)') + lines.append(' } else {') + lines.append(' println("FAIL " + cat + " " + lemma + " got=" + got + " exp=" + exp)') + lines.append(' }') + lines.append("}") + lines.append("") + lines.append("fn es_parity() {") + + # verbs + for v in verbs: + p0 = M.conjugate(v, "ind", "present", "third", "singular")[0] + p1 = M.conjugate(v, "ind", "preterite", "third", "singular")[0] + pp = M.participle(v)[0] + lines.append(_check("Vpres", v, f'es_conjugate("{_esc(v)}", "present", "third", "singular")', p0)) + lines.append(_check("Vpret", v, f'es_conjugate("{_esc(v)}", "past", "third", "singular")', p1)) + lines.append(_check("Vpart", v, f'es_participle("{_esc(v)}")', pp)) + + # nouns + for n in nouns: + pl = M.inflect_noun(n, "plural")[0] + g = M.noun_gender(n) # REAL lexicon gender + art = R._article(g, "singular", "def", n) # oracle article from real gender + lines.append(_check("Npl", n, f'es_pluralize("{_esc(n)}")', pl)) + lines.append(_check("Gheur", n, f'es_gender("{_esc(n)}")', g)) + lines.append(_check("Aheur", n, f'es_agree_article("{_esc(n)}", "true", "singular")', art)) + lines.append(_check("Avocab", n, f'es_article_for_gender("{_esc(g)}", "{_esc(n)}", "true", "singular")', art)) + + # adjectives + for a in adjs: + mpl = M.inflect_adj(a, "m", "plural")[0] + fsg = M.inflect_adj(a, "f", "singular")[0] + lines.append(_check("Ampl", a, f'es_inflect_adj("{_esc(a)}", "m", "plural")', mpl)) + lines.append(_check("Afsg", a, f'es_inflect_adj("{_esc(a)}", "f", "singular")', fsg)) + + # contractions (mandatory) + ctr_cases = [("de", "el día"), ("a", "el hombre"), ("de", "el mundo"), + ("a", "el país"), ("en", "el mar"), ("de", "el año"), + ("a", "la casa"), ("de", "la ciudad")] + for prep, np in ctr_cases: + exp = R._contract(prep, np) + lines.append(_check("Ctr", prep + "+" + np, f'es_contract("{_esc(prep)}", "{_esc(np)}")', exp)) + + lines.append("}") + lines.append("") + lines.append("fn main() {") + lines.append(" es_parity()") + lines.append("}") + + with open(out_path, "w", encoding="utf-8") as fh: + fh.write("\n".join(lines) + "\n") + print(f"wrote {out_path} ({len(verbs)} verbs, {len(nouns)} nouns, {len(adjs)} adjs)") + + +if __name__ == "__main__": + import sys + main(sys.argv[1] if len(sys.argv) > 1 else "parity_es_checks.el") diff --git a/elp/tests/parity-es-checks.el b/elp/tests/parity-es-checks.el new file mode 100644 index 0000000..1e713f2 --- /dev/null +++ b/elp/tests/parity-es-checks.el @@ -0,0 +1,1035 @@ +// gen'd parity checks — Python oracle embedded, El functions called. +fn es_check(cat: String, lemma: String, got: String, exp: String) { + if str_eq(got, exp) { + println("PASS " + cat) + } else { + println("FAIL " + cat + " " + lemma + " got=" + got + " exp=" + exp) + } +} + +fn es_parity() { + es_check("Vpres", "abrazar", es_conjugate("abrazar", "present", "third", "singular"), "abraza") + es_check("Vpret", "abrazar", es_conjugate("abrazar", "past", "third", "singular"), "abrazó") + es_check("Vpart", "abrazar", es_participle("abrazar"), "abrazado") + es_check("Vpres", "abrir", es_conjugate("abrir", "present", "third", "singular"), "abre") + es_check("Vpret", "abrir", es_conjugate("abrir", "past", "third", "singular"), "abrió") + es_check("Vpart", "abrir", es_participle("abrir"), "abierto") + es_check("Vpres", "aceptar", es_conjugate("aceptar", "present", "third", "singular"), "acepta") + es_check("Vpret", "aceptar", es_conjugate("aceptar", "past", "third", "singular"), "aceptó") + es_check("Vpart", "aceptar", es_participle("aceptar"), "aceptado") + es_check("Vpres", "acordar", es_conjugate("acordar", "present", "third", "singular"), "acuerda") + es_check("Vpret", "acordar", es_conjugate("acordar", "past", "third", "singular"), "acordó") + es_check("Vpart", "acordar", es_participle("acordar"), "acordado") + es_check("Vpres", "amar", es_conjugate("amar", "present", "third", "singular"), "ama") + es_check("Vpret", "amar", es_conjugate("amar", "past", "third", "singular"), "amó") + es_check("Vpart", "amar", es_participle("amar"), "amado") + es_check("Vpres", "anunciar", es_conjugate("anunciar", "present", "third", "singular"), "anuncia") + es_check("Vpret", "anunciar", es_conjugate("anunciar", "past", "third", "singular"), "anunció") + es_check("Vpart", "anunciar", es_participle("anunciar"), "anunciado") + es_check("Vpres", "aprobar", es_conjugate("aprobar", "present", "third", "singular"), "aprueba") + es_check("Vpret", "aprobar", es_conjugate("aprobar", "past", "third", "singular"), "aprobó") + es_check("Vpart", "aprobar", es_participle("aprobar"), "aprobado") + es_check("Vpres", "aumentar", es_conjugate("aumentar", "present", "third", "singular"), "aumenta") + es_check("Vpret", "aumentar", es_conjugate("aumentar", "past", "third", "singular"), "aumentó") + es_check("Vpart", "aumentar", es_participle("aumentar"), "aumentado") + es_check("Vpres", "ayudar", es_conjugate("ayudar", "present", "third", "singular"), "ayuda") + es_check("Vpret", "ayudar", es_conjugate("ayudar", "past", "third", "singular"), "ayudó") + es_check("Vpart", "ayudar", es_participle("ayudar"), "ayudado") + es_check("Vpres", "bajar", es_conjugate("bajar", "present", "third", "singular"), "baja") + es_check("Vpret", "bajar", es_conjugate("bajar", "past", "third", "singular"), "bajó") + es_check("Vpart", "bajar", es_participle("bajar"), "bajado") + es_check("Vpres", "besar", es_conjugate("besar", "present", "third", "singular"), "besa") + es_check("Vpret", "besar", es_conjugate("besar", "past", "third", "singular"), "besó") + es_check("Vpart", "besar", es_participle("besar"), "besado") + es_check("Vpres", "buscar", es_conjugate("buscar", "present", "third", "singular"), "busca") + es_check("Vpret", "buscar", es_conjugate("buscar", "past", "third", "singular"), "buscó") + es_check("Vpart", "buscar", es_participle("buscar"), "buscado") + es_check("Vpres", "caer", es_conjugate("caer", "present", "third", "singular"), "cae") + es_check("Vpret", "caer", es_conjugate("caer", "past", "third", "singular"), "cayó") + es_check("Vpart", "caer", es_participle("caer"), "caído") + es_check("Vpres", "cambiar", es_conjugate("cambiar", "present", "third", "singular"), "cambia") + es_check("Vpret", "cambiar", es_conjugate("cambiar", "past", "third", "singular"), "cambió") + es_check("Vpart", "cambiar", es_participle("cambiar"), "cambiado") + es_check("Vpres", "caminar", es_conjugate("caminar", "present", "third", "singular"), "camina") + es_check("Vpret", "caminar", es_conjugate("caminar", "past", "third", "singular"), "caminó") + es_check("Vpart", "caminar", es_participle("caminar"), "caminado") + es_check("Vpres", "cantar", es_conjugate("cantar", "present", "third", "singular"), "canta") + es_check("Vpret", "cantar", es_conjugate("cantar", "past", "third", "singular"), "cantó") + es_check("Vpart", "cantar", es_participle("cantar"), "cantado") + es_check("Vpres", "celebrar", es_conjugate("celebrar", "present", "third", "singular"), "celebra") + es_check("Vpret", "celebrar", es_conjugate("celebrar", "past", "third", "singular"), "celebró") + es_check("Vpart", "celebrar", es_participle("celebrar"), "celebrado") + es_check("Vpres", "cerrar", es_conjugate("cerrar", "present", "third", "singular"), "cierra") + es_check("Vpret", "cerrar", es_conjugate("cerrar", "past", "third", "singular"), "cerró") + es_check("Vpart", "cerrar", es_participle("cerrar"), "cerrado") + es_check("Vpres", "comenzar", es_conjugate("comenzar", "present", "third", "singular"), "comienza") + es_check("Vpret", "comenzar", es_conjugate("comenzar", "past", "third", "singular"), "comenzó") + es_check("Vpart", "comenzar", es_participle("comenzar"), "comenzado") + es_check("Vpres", "comer", es_conjugate("comer", "present", "third", "singular"), "come") + es_check("Vpret", "comer", es_conjugate("comer", "past", "third", "singular"), "comió") + es_check("Vpart", "comer", es_participle("comer"), "comido") + es_check("Vpres", "condenar", es_conjugate("condenar", "present", "third", "singular"), "condena") + es_check("Vpret", "condenar", es_conjugate("condenar", "past", "third", "singular"), "condenó") + es_check("Vpart", "condenar", es_participle("condenar"), "condenado") + es_check("Vpres", "confirmar", es_conjugate("confirmar", "present", "third", "singular"), "confirma") + es_check("Vpret", "confirmar", es_conjugate("confirmar", "past", "third", "singular"), "confirmó") + es_check("Vpart", "confirmar", es_participle("confirmar"), "confirmado") + es_check("Vpres", "conocer", es_conjugate("conocer", "present", "third", "singular"), "conoce") + es_check("Vpret", "conocer", es_conjugate("conocer", "past", "third", "singular"), "conoció") + es_check("Vpart", "conocer", es_participle("conocer"), "conocido") + es_check("Vpres", "contar", es_conjugate("contar", "present", "third", "singular"), "cuenta") + es_check("Vpret", "contar", es_conjugate("contar", "past", "third", "singular"), "contó") + es_check("Vpart", "contar", es_participle("contar"), "contado") + es_check("Vpres", "contratar", es_conjugate("contratar", "present", "third", "singular"), "contrata") + es_check("Vpret", "contratar", es_conjugate("contratar", "past", "third", "singular"), "contrató") + es_check("Vpart", "contratar", es_participle("contratar"), "contratado") + es_check("Vpres", "costar", es_conjugate("costar", "present", "third", "singular"), "cuesta") + es_check("Vpret", "costar", es_conjugate("costar", "past", "third", "singular"), "costó") + es_check("Vpart", "costar", es_participle("costar"), "costado") + es_check("Vpres", "crear", es_conjugate("crear", "present", "third", "singular"), "crea") + es_check("Vpret", "crear", es_conjugate("crear", "past", "third", "singular"), "creó") + es_check("Vpart", "crear", es_participle("crear"), "creado") + es_check("Vpres", "crecer", es_conjugate("crecer", "present", "third", "singular"), "crece") + es_check("Vpret", "crecer", es_conjugate("crecer", "past", "third", "singular"), "creció") + es_check("Vpart", "crecer", es_participle("crecer"), "crecido") + es_check("Vpres", "creer", es_conjugate("creer", "present", "third", "singular"), "cree") + es_check("Vpret", "creer", es_conjugate("creer", "past", "third", "singular"), "creyó") + es_check("Vpart", "creer", es_participle("creer"), "creído") + es_check("Vpres", "dar", es_conjugate("dar", "present", "third", "singular"), "da") + es_check("Vpret", "dar", es_conjugate("dar", "past", "third", "singular"), "dio") + es_check("Vpart", "dar", es_participle("dar"), "dado") + es_check("Vpres", "deber", es_conjugate("deber", "present", "third", "singular"), "debe") + es_check("Vpret", "deber", es_conjugate("deber", "past", "third", "singular"), "debió") + es_check("Vpart", "deber", es_participle("deber"), "debido") + es_check("Vpres", "decir", es_conjugate("decir", "present", "third", "singular"), "dice") + es_check("Vpret", "decir", es_conjugate("decir", "past", "third", "singular"), "dijo") + es_check("Vpart", "decir", es_participle("decir"), "dicho") + es_check("Vpres", "dejar", es_conjugate("dejar", "present", "third", "singular"), "deja") + es_check("Vpret", "dejar", es_conjugate("dejar", "past", "third", "singular"), "dejó") + es_check("Vpart", "dejar", es_participle("dejar"), "dejado") + es_check("Vpres", "desaparecer", es_conjugate("desaparecer", "present", "third", "singular"), "desaparece") + es_check("Vpret", "desaparecer", es_conjugate("desaparecer", "past", "third", "singular"), "desapareció") + es_check("Vpart", "desaparecer", es_participle("desaparecer"), "desaparecido") + es_check("Vpres", "descubrir", es_conjugate("descubrir", "present", "third", "singular"), "descubre") + es_check("Vpret", "descubrir", es_conjugate("descubrir", "past", "third", "singular"), "descubrió") + es_check("Vpart", "descubrir", es_participle("descubrir"), "descubierto") + es_check("Vpres", "despedir", es_conjugate("despedir", "present", "third", "singular"), "despide") + es_check("Vpret", "despedir", es_conjugate("despedir", "past", "third", "singular"), "despidió") + es_check("Vpart", "despedir", es_participle("despedir"), "despedido") + es_check("Vpres", "detener", es_conjugate("detener", "present", "third", "singular"), "detiene") + es_check("Vpret", "detener", es_conjugate("detener", "past", "third", "singular"), "detuvo") + es_check("Vpart", "detener", es_participle("detener"), "detenido") + es_check("Vpres", "dimitir", es_conjugate("dimitir", "present", "third", "singular"), "dimite") + es_check("Vpret", "dimitir", es_conjugate("dimitir", "past", "third", "singular"), "dimitió") + es_check("Vpart", "dimitir", es_participle("dimitir"), "dimitido") + es_check("Vpres", "doler", es_conjugate("doler", "present", "third", "singular"), "duele") + es_check("Vpret", "doler", es_conjugate("doler", "past", "third", "singular"), "dolió") + es_check("Vpart", "doler", es_participle("doler"), "dolido") + es_check("Vpres", "dormir", es_conjugate("dormir", "present", "third", "singular"), "duerme") + es_check("Vpret", "dormir", es_conjugate("dormir", "past", "third", "singular"), "durmió") + es_check("Vpart", "dormir", es_participle("dormir"), "dormido") + es_check("Vpres", "durar", es_conjugate("durar", "present", "third", "singular"), "dura") + es_check("Vpret", "durar", es_conjugate("durar", "past", "third", "singular"), "duró") + es_check("Vpart", "durar", es_participle("durar"), "durado") + es_check("Vpres", "empezar", es_conjugate("empezar", "present", "third", "singular"), "empieza") + es_check("Vpret", "empezar", es_conjugate("empezar", "past", "third", "singular"), "empezó") + es_check("Vpart", "empezar", es_participle("empezar"), "empezado") + es_check("Vpres", "encontrar", es_conjugate("encontrar", "present", "third", "singular"), "encuentra") + es_check("Vpret", "encontrar", es_conjugate("encontrar", "past", "third", "singular"), "encontró") + es_check("Vpart", "encontrar", es_participle("encontrar"), "encontrado") + es_check("Vpres", "entender", es_conjugate("entender", "present", "third", "singular"), "entiende") + es_check("Vpret", "entender", es_conjugate("entender", "past", "third", "singular"), "entendió") + es_check("Vpart", "entender", es_participle("entender"), "entendido") + es_check("Vpres", "entrar", es_conjugate("entrar", "present", "third", "singular"), "entra") + es_check("Vpret", "entrar", es_conjugate("entrar", "past", "third", "singular"), "entró") + es_check("Vpart", "entrar", es_participle("entrar"), "entrado") + es_check("Vpres", "entregar", es_conjugate("entregar", "present", "third", "singular"), "entrega") + es_check("Vpret", "entregar", es_conjugate("entregar", "past", "third", "singular"), "entregó") + es_check("Vpart", "entregar", es_participle("entregar"), "entregado") + es_check("Vpres", "escapar", es_conjugate("escapar", "present", "third", "singular"), "escapa") + es_check("Vpret", "escapar", es_conjugate("escapar", "past", "third", "singular"), "escapó") + es_check("Vpart", "escapar", es_participle("escapar"), "escapado") + es_check("Vpres", "escribir", es_conjugate("escribir", "present", "third", "singular"), "escribe") + es_check("Vpret", "escribir", es_conjugate("escribir", "past", "third", "singular"), "escribió") + es_check("Vpart", "escribir", es_participle("escribir"), "escrito") + es_check("Vpres", "escuchar", es_conjugate("escuchar", "present", "third", "singular"), "escucha") + es_check("Vpret", "escuchar", es_conjugate("escuchar", "past", "third", "singular"), "escuchó") + es_check("Vpart", "escuchar", es_participle("escuchar"), "escuchado") + es_check("Vpres", "esperar", es_conjugate("esperar", "present", "third", "singular"), "espera") + es_check("Vpret", "esperar", es_conjugate("esperar", "past", "third", "singular"), "esperó") + es_check("Vpart", "esperar", es_participle("esperar"), "esperado") + es_check("Vpres", "estar", es_conjugate("estar", "present", "third", "singular"), "está") + es_check("Vpret", "estar", es_conjugate("estar", "past", "third", "singular"), "estuvo") + es_check("Vpart", "estar", es_participle("estar"), "estado") + es_check("Vpres", "estudiar", es_conjugate("estudiar", "present", "third", "singular"), "estudia") + es_check("Vpret", "estudiar", es_conjugate("estudiar", "past", "third", "singular"), "estudió") + es_check("Vpart", "estudiar", es_participle("estudiar"), "estudiado") + es_check("Vpres", "existir", es_conjugate("existir", "present", "third", "singular"), "existe") + es_check("Vpret", "existir", es_conjugate("existir", "past", "third", "singular"), "existió") + es_check("Vpart", "existir", es_participle("existir"), "existido") + es_check("Vpres", "explicar", es_conjugate("explicar", "present", "third", "singular"), "explica") + es_check("Vpret", "explicar", es_conjugate("explicar", "past", "third", "singular"), "explicó") + es_check("Vpart", "explicar", es_participle("explicar"), "explicado") + es_check("Vpres", "firmar", es_conjugate("firmar", "present", "third", "singular"), "firma") + es_check("Vpret", "firmar", es_conjugate("firmar", "past", "third", "singular"), "firmó") + es_check("Vpart", "firmar", es_participle("firmar"), "firmado") + es_check("Vpres", "ganar", es_conjugate("ganar", "present", "third", "singular"), "gana") + es_check("Vpret", "ganar", es_conjugate("ganar", "past", "third", "singular"), "ganó") + es_check("Vpart", "ganar", es_participle("ganar"), "ganado") + es_check("Vpres", "gritar", es_conjugate("gritar", "present", "third", "singular"), "grita") + es_check("Vpret", "gritar", es_conjugate("gritar", "past", "third", "singular"), "gritó") + es_check("Vpart", "gritar", es_participle("gritar"), "gritado") + es_check("Vpres", "guardar", es_conjugate("guardar", "present", "third", "singular"), "guarda") + es_check("Vpret", "guardar", es_conjugate("guardar", "past", "third", "singular"), "guardó") + es_check("Vpart", "guardar", es_participle("guardar"), "guardado") + es_check("Vpres", "gustar", es_conjugate("gustar", "present", "third", "singular"), "gusta") + es_check("Vpret", "gustar", es_conjugate("gustar", "past", "third", "singular"), "gustó") + es_check("Vpart", "gustar", es_participle("gustar"), "gustado") + es_check("Vpres", "haber", es_conjugate("haber", "present", "third", "singular"), "ha") + es_check("Vpret", "haber", es_conjugate("haber", "past", "third", "singular"), "hubo") + es_check("Vpart", "haber", es_participle("haber"), "habido") + es_check("Vpres", "hablar", es_conjugate("hablar", "present", "third", "singular"), "habla") + es_check("Vpret", "hablar", es_conjugate("hablar", "past", "third", "singular"), "habló") + es_check("Vpart", "hablar", es_participle("hablar"), "hablado") + es_check("Vpres", "hacer", es_conjugate("hacer", "present", "third", "singular"), "hace") + es_check("Vpret", "hacer", es_conjugate("hacer", "past", "third", "singular"), "hizo") + es_check("Vpart", "hacer", es_participle("hacer"), "hecho") + es_check("Vpres", "ir", es_conjugate("ir", "present", "third", "singular"), "va") + es_check("Vpret", "ir", es_conjugate("ir", "past", "third", "singular"), "fue") + es_check("Vpart", "ir", es_participle("ir"), "ido") + es_check("Vpres", "jugar", es_conjugate("jugar", "present", "third", "singular"), "juega") + es_check("Vpret", "jugar", es_conjugate("jugar", "past", "third", "singular"), "jugó") + es_check("Vpart", "jugar", es_participle("jugar"), "jugado") + es_check("Vpres", "lavar", es_conjugate("lavar", "present", "third", "singular"), "lava") + es_check("Vpret", "lavar", es_conjugate("lavar", "past", "third", "singular"), "lavó") + es_check("Vpart", "lavar", es_participle("lavar"), "lavado") + es_check("Vpres", "leer", es_conjugate("leer", "present", "third", "singular"), "lee") + es_check("Vpret", "leer", es_conjugate("leer", "past", "third", "singular"), "leyó") + es_check("Vpart", "leer", es_participle("leer"), "leído") + es_check("Vpres", "llamar", es_conjugate("llamar", "present", "third", "singular"), "llama") + es_check("Vpret", "llamar", es_conjugate("llamar", "past", "third", "singular"), "llamó") + es_check("Vpart", "llamar", es_participle("llamar"), "llamado") + es_check("Vpres", "llegar", es_conjugate("llegar", "present", "third", "singular"), "llega") + es_check("Vpret", "llegar", es_conjugate("llegar", "past", "third", "singular"), "llegó") + es_check("Vpart", "llegar", es_participle("llegar"), "llegado") + es_check("Vpres", "llevar", es_conjugate("llevar", "present", "third", "singular"), "lleva") + es_check("Vpret", "llevar", es_conjugate("llevar", "past", "third", "singular"), "llevó") + es_check("Vpart", "llevar", es_participle("llevar"), "llevado") + es_check("Vpres", "llover", es_conjugate("llover", "present", "third", "singular"), "llueve") + es_check("Vpret", "llover", es_conjugate("llover", "past", "third", "singular"), "llovió") + es_check("Vpart", "llover", es_participle("llover"), "llovido") + es_check("Vpres", "mirar", es_conjugate("mirar", "present", "third", "singular"), "mira") + es_check("Vpret", "mirar", es_conjugate("mirar", "past", "third", "singular"), "miró") + es_check("Vpart", "mirar", es_participle("mirar"), "mirado") + es_check("Vpres", "morir", es_conjugate("morir", "present", "third", "singular"), "muere") + es_check("Vpret", "morir", es_conjugate("morir", "past", "third", "singular"), "murió") + es_check("Vpart", "morir", es_participle("morir"), "muerto") + es_check("Vpres", "mostrar", es_conjugate("mostrar", "present", "third", "singular"), "muestra") + es_check("Vpret", "mostrar", es_conjugate("mostrar", "past", "third", "singular"), "mostró") + es_check("Vpart", "mostrar", es_participle("mostrar"), "mostrado") + es_check("Vpres", "nacer", es_conjugate("nacer", "present", "third", "singular"), "nace") + es_check("Vpret", "nacer", es_conjugate("nacer", "past", "third", "singular"), "nació") + es_check("Vpart", "nacer", es_participle("nacer"), "nacido") + es_check("Vpres", "ocultar", es_conjugate("ocultar", "present", "third", "singular"), "oculta") + es_check("Vpret", "ocultar", es_conjugate("ocultar", "past", "third", "singular"), "ocultó") + es_check("Vpart", "ocultar", es_participle("ocultar"), "ocultado") + es_check("Vpres", "ofrecer", es_conjugate("ofrecer", "present", "third", "singular"), "ofrece") + es_check("Vpret", "ofrecer", es_conjugate("ofrecer", "past", "third", "singular"), "ofreció") + es_check("Vpart", "ofrecer", es_participle("ofrecer"), "ofrecido") + es_check("Vpres", "olvidar", es_conjugate("olvidar", "present", "third", "singular"), "olvida") + es_check("Vpret", "olvidar", es_conjugate("olvidar", "past", "third", "singular"), "olvidó") + es_check("Vpart", "olvidar", es_participle("olvidar"), "olvidado") + es_check("Vpres", "oír", es_conjugate("oír", "present", "third", "singular"), "oye") + es_check("Vpret", "oír", es_conjugate("oír", "past", "third", "singular"), "oyó") + es_check("Vpart", "oír", es_participle("oír"), "oído") + es_check("Vpres", "parecer", es_conjugate("parecer", "present", "third", "singular"), "parece") + es_check("Vpret", "parecer", es_conjugate("parecer", "past", "third", "singular"), "pareció") + es_check("Vpart", "parecer", es_participle("parecer"), "parecido") + es_check("Vpres", "pasar", es_conjugate("pasar", "present", "third", "singular"), "pasa") + es_check("Vpret", "pasar", es_conjugate("pasar", "past", "third", "singular"), "pasó") + es_check("Vpart", "pasar", es_participle("pasar"), "pasado") + es_check("Vpres", "pedir", es_conjugate("pedir", "present", "third", "singular"), "pide") + es_check("Vpret", "pedir", es_conjugate("pedir", "past", "third", "singular"), "pidió") + es_check("Vpart", "pedir", es_participle("pedir"), "pedido") + es_check("Vpres", "pensar", es_conjugate("pensar", "present", "third", "singular"), "piensa") + es_check("Vpret", "pensar", es_conjugate("pensar", "past", "third", "singular"), "pensó") + es_check("Vpart", "pensar", es_participle("pensar"), "pensado") + es_check("Vpres", "perder", es_conjugate("perder", "present", "third", "singular"), "pierde") + es_check("Vpret", "perder", es_conjugate("perder", "past", "third", "singular"), "perdió") + es_check("Vpart", "perder", es_participle("perder"), "perdido") + es_check("Vpres", "perdonar", es_conjugate("perdonar", "present", "third", "singular"), "perdona") + es_check("Vpret", "perdonar", es_conjugate("perdonar", "past", "third", "singular"), "perdonó") + es_check("Vpart", "perdonar", es_participle("perdonar"), "perdonado") + es_check("Vpres", "poder", es_conjugate("poder", "present", "third", "singular"), "puede") + es_check("Vpret", "poder", es_conjugate("poder", "past", "third", "singular"), "pudo") + es_check("Vpart", "poder", es_participle("poder"), "podido") + es_check("Vpres", "poner", es_conjugate("poner", "present", "third", "singular"), "pone") + es_check("Vpret", "poner", es_conjugate("poner", "past", "third", "singular"), "puso") + es_check("Vpart", "poner", es_participle("poner"), "puesto") + es_check("Vpres", "preocupar", es_conjugate("preocupar", "present", "third", "singular"), "preocupa") + es_check("Vpret", "preocupar", es_conjugate("preocupar", "past", "third", "singular"), "preocupó") + es_check("Vpart", "preocupar", es_participle("preocupar"), "preocupado") + es_check("Vpres", "producir", es_conjugate("producir", "present", "third", "singular"), "produce") + es_check("Vpret", "producir", es_conjugate("producir", "past", "third", "singular"), "produjo") + es_check("Vpart", "producir", es_participle("producir"), "producido") + es_check("Vpres", "prometer", es_conjugate("prometer", "present", "third", "singular"), "promete") + es_check("Vpret", "prometer", es_conjugate("prometer", "past", "third", "singular"), "prometió") + es_check("Vpart", "prometer", es_participle("prometer"), "prometido") + es_check("Vpres", "proponer", es_conjugate("proponer", "present", "third", "singular"), "propone") + es_check("Vpret", "proponer", es_conjugate("proponer", "past", "third", "singular"), "propuso") + es_check("Vpart", "proponer", es_participle("proponer"), "propuesto") + es_check("Vpres", "prosperar", es_conjugate("prosperar", "present", "third", "singular"), "prospera") + es_check("Vpret", "prosperar", es_conjugate("prosperar", "past", "third", "singular"), "prosperó") + es_check("Vpart", "prosperar", es_participle("prosperar"), "prosperado") + es_check("Vpres", "protestar", es_conjugate("protestar", "present", "third", "singular"), "protesta") + es_check("Vpret", "protestar", es_conjugate("protestar", "past", "third", "singular"), "protestó") + es_check("Vpart", "protestar", es_participle("protestar"), "protestado") + es_check("Vpres", "quedar", es_conjugate("quedar", "present", "third", "singular"), "queda") + es_check("Vpret", "quedar", es_conjugate("quedar", "past", "third", "singular"), "quedó") + es_check("Vpart", "quedar", es_participle("quedar"), "quedado") + es_check("Vpres", "querer", es_conjugate("querer", "present", "third", "singular"), "quiere") + es_check("Vpret", "querer", es_conjugate("querer", "past", "third", "singular"), "quiso") + es_check("Vpart", "querer", es_participle("querer"), "querido") + es_check("Vpres", "recordar", es_conjugate("recordar", "present", "third", "singular"), "recuerda") + es_check("Vpret", "recordar", es_conjugate("recordar", "past", "third", "singular"), "recordó") + es_check("Vpart", "recordar", es_participle("recordar"), "recordado") + es_check("Vpres", "recorrer", es_conjugate("recorrer", "present", "third", "singular"), "recorre") + es_check("Vpret", "recorrer", es_conjugate("recorrer", "past", "third", "singular"), "recorrió") + es_check("Vpart", "recorrer", es_participle("recorrer"), "recorrido") + es_check("Vpres", "regresar", es_conjugate("regresar", "present", "third", "singular"), "regresa") + es_check("Vpret", "regresar", es_conjugate("regresar", "past", "third", "singular"), "regresó") + es_check("Vpart", "regresar", es_participle("regresar"), "regresado") + es_check("Vpres", "renacer", es_conjugate("renacer", "present", "third", "singular"), "renace") + es_check("Vpret", "renacer", es_conjugate("renacer", "past", "third", "singular"), "renació") + es_check("Vpart", "renacer", es_participle("renacer"), "renacido") + es_check("Vpres", "saber", es_conjugate("saber", "present", "third", "singular"), "sabe") + es_check("Vpret", "saber", es_conjugate("saber", "past", "third", "singular"), "supo") + es_check("Vpart", "saber", es_participle("saber"), "sabido") + es_check("Vpres", "salir", es_conjugate("salir", "present", "third", "singular"), "sale") + es_check("Vpret", "salir", es_conjugate("salir", "past", "third", "singular"), "salió") + es_check("Vpart", "salir", es_participle("salir"), "salido") + es_check("Vpres", "sentar", es_conjugate("sentar", "present", "third", "singular"), "sienta") + es_check("Vpret", "sentar", es_conjugate("sentar", "past", "third", "singular"), "sentó") + es_check("Vpart", "sentar", es_participle("sentar"), "sentado") + es_check("Vpres", "sentir", es_conjugate("sentir", "present", "third", "singular"), "siente") + es_check("Vpret", "sentir", es_conjugate("sentir", "past", "third", "singular"), "sintió") + es_check("Vpart", "sentir", es_participle("sentir"), "sentido") + es_check("Vpres", "separar", es_conjugate("separar", "present", "third", "singular"), "separa") + es_check("Vpret", "separar", es_conjugate("separar", "past", "third", "singular"), "separó") + es_check("Vpart", "separar", es_participle("separar"), "separado") + es_check("Vpres", "ser", es_conjugate("ser", "present", "third", "singular"), "es") + es_check("Vpret", "ser", es_conjugate("ser", "past", "third", "singular"), "fue") + es_check("Vpart", "ser", es_participle("ser"), "sido") + es_check("Vpres", "sonreír", es_conjugate("sonreír", "present", "third", "singular"), "sonríe") + es_check("Vpret", "sonreír", es_conjugate("sonreír", "past", "third", "singular"), "sonrió") + es_check("Vpart", "sonreír", es_participle("sonreír"), "sonreído") + es_check("Vpres", "soplar", es_conjugate("soplar", "present", "third", "singular"), "sopla") + es_check("Vpret", "soplar", es_conjugate("soplar", "past", "third", "singular"), "sopló") + es_check("Vpart", "soplar", es_participle("soplar"), "soplado") + es_check("Vpres", "sorprender", es_conjugate("sorprender", "present", "third", "singular"), "sorprende") + es_check("Vpret", "sorprender", es_conjugate("sorprender", "past", "third", "singular"), "sorprendió") + es_check("Vpart", "sorprender", es_participle("sorprender"), "sorprendido") + es_check("Vpres", "soñar", es_conjugate("soñar", "present", "third", "singular"), "sueña") + es_check("Vpret", "soñar", es_conjugate("soñar", "past", "third", "singular"), "soñó") + es_check("Vpart", "soñar", es_participle("soñar"), "soñado") + es_check("Vpres", "subir", es_conjugate("subir", "present", "third", "singular"), "sube") + es_check("Vpret", "subir", es_conjugate("subir", "past", "third", "singular"), "subió") + es_check("Vpart", "subir", es_participle("subir"), "subido") + es_check("Vpres", "tener", es_conjugate("tener", "present", "third", "singular"), "tiene") + es_check("Vpret", "tener", es_conjugate("tener", "past", "third", "singular"), "tuvo") + es_check("Vpart", "tener", es_participle("tener"), "tenido") + es_check("Vpres", "terminar", es_conjugate("terminar", "present", "third", "singular"), "termina") + es_check("Vpret", "terminar", es_conjugate("terminar", "past", "third", "singular"), "terminó") + es_check("Vpart", "terminar", es_participle("terminar"), "terminado") + es_check("Vpres", "tocar", es_conjugate("tocar", "present", "third", "singular"), "toca") + es_check("Vpret", "tocar", es_conjugate("tocar", "past", "third", "singular"), "tocó") + es_check("Vpart", "tocar", es_participle("tocar"), "tocado") + es_check("Vpres", "tomar", es_conjugate("tomar", "present", "third", "singular"), "toma") + es_check("Vpret", "tomar", es_conjugate("tomar", "past", "third", "singular"), "tomó") + es_check("Vpart", "tomar", es_participle("tomar"), "tomado") + es_check("Vpres", "trabajar", es_conjugate("trabajar", "present", "third", "singular"), "trabaja") + es_check("Vpret", "trabajar", es_conjugate("trabajar", "past", "third", "singular"), "trabajó") + es_check("Vpart", "trabajar", es_participle("trabajar"), "trabajado") + es_check("Vpres", "vender", es_conjugate("vender", "present", "third", "singular"), "vende") + es_check("Vpret", "vender", es_conjugate("vender", "past", "third", "singular"), "vendió") + es_check("Vpart", "vender", es_participle("vender"), "vendido") + es_check("Vpres", "venir", es_conjugate("venir", "present", "third", "singular"), "viene") + es_check("Vpret", "venir", es_conjugate("venir", "past", "third", "singular"), "vino") + es_check("Vpart", "venir", es_participle("venir"), "venido") + es_check("Vpres", "ver", es_conjugate("ver", "present", "third", "singular"), "ve") + es_check("Vpret", "ver", es_conjugate("ver", "past", "third", "singular"), "vio") + es_check("Vpart", "ver", es_participle("ver"), "visto") + es_check("Vpres", "viajar", es_conjugate("viajar", "present", "third", "singular"), "viaja") + es_check("Vpret", "viajar", es_conjugate("viajar", "past", "third", "singular"), "viajó") + es_check("Vpart", "viajar", es_participle("viajar"), "viajado") + es_check("Vpres", "vivir", es_conjugate("vivir", "present", "third", "singular"), "vive") + es_check("Vpret", "vivir", es_conjugate("vivir", "past", "third", "singular"), "vivió") + es_check("Vpart", "vivir", es_participle("vivir"), "vivido") + es_check("Vpres", "volver", es_conjugate("volver", "present", "third", "singular"), "vuelve") + es_check("Vpret", "volver", es_conjugate("volver", "past", "third", "singular"), "volvió") + es_check("Vpart", "volver", es_participle("volver"), "vuelto") + es_check("Npl", "Barcelona", es_pluralize("Barcelona"), "barcelonas") + es_check("Gheur", "Barcelona", es_gender("Barcelona"), "f") + es_check("Aheur", "Barcelona", es_agree_article("Barcelona", "true", "singular"), "la") + es_check("Avocab", "Barcelona", es_article_for_gender("f", "Barcelona", "true", "singular"), "la") + es_check("Npl", "Madrid", es_pluralize("Madrid"), "madrides") + es_check("Gheur", "Madrid", es_gender("Madrid"), "m") + es_check("Aheur", "Madrid", es_agree_article("Madrid", "true", "singular"), "el") + es_check("Avocab", "Madrid", es_article_for_gender("m", "Madrid", "true", "singular"), "el") + es_check("Npl", "María", es_pluralize("María"), "marías") + es_check("Gheur", "María", es_gender("María"), "f") + es_check("Aheur", "María", es_agree_article("María", "true", "singular"), "la") + es_check("Avocab", "María", es_article_for_gender("f", "María", "true", "singular"), "la") + es_check("Npl", "acuerdo", es_pluralize("acuerdo"), "acuerdos") + es_check("Gheur", "acuerdo", es_gender("acuerdo"), "m") + es_check("Aheur", "acuerdo", es_agree_article("acuerdo", "true", "singular"), "el") + es_check("Avocab", "acuerdo", es_article_for_gender("m", "acuerdo", "true", "singular"), "el") + es_check("Npl", "acusado", es_pluralize("acusado"), "acusados") + es_check("Gheur", "acusado", es_gender("acusado"), "m") + es_check("Aheur", "acusado", es_agree_article("acusado", "true", "singular"), "el") + es_check("Avocab", "acusado", es_article_for_gender("m", "acusado", "true", "singular"), "el") + es_check("Npl", "agua", es_pluralize("agua"), "aguas") + es_check("Gheur", "agua", es_gender("agua"), "f") + es_check("Aheur", "agua", es_agree_article("agua", "true", "singular"), "el") + es_check("Avocab", "agua", es_article_for_gender("f", "agua", "true", "singular"), "el") + es_check("Npl", "amigo", es_pluralize("amigo"), "amigos") + es_check("Gheur", "amigo", es_gender("amigo"), "m") + es_check("Aheur", "amigo", es_agree_article("amigo", "true", "singular"), "el") + es_check("Avocab", "amigo", es_article_for_gender("m", "amigo", "true", "singular"), "el") + es_check("Npl", "amor", es_pluralize("amor"), "amores") + es_check("Gheur", "amor", es_gender("amor"), "m") + es_check("Aheur", "amor", es_agree_article("amor", "true", "singular"), "el") + es_check("Avocab", "amor", es_article_for_gender("m", "amor", "true", "singular"), "el") + es_check("Npl", "anciano", es_pluralize("anciano"), "ancianos") + es_check("Gheur", "anciano", es_gender("anciano"), "m") + es_check("Aheur", "anciano", es_agree_article("anciano", "true", "singular"), "el") + es_check("Avocab", "anciano", es_article_for_gender("m", "anciano", "true", "singular"), "el") + es_check("Npl", "autor", es_pluralize("autor"), "autores") + es_check("Gheur", "autor", es_gender("autor"), "m") + es_check("Aheur", "autor", es_agree_article("autor", "true", "singular"), "el") + es_check("Avocab", "autor", es_article_for_gender("m", "autor", "true", "singular"), "el") + es_check("Npl", "ayuda", es_pluralize("ayuda"), "ayudas") + es_check("Gheur", "ayuda", es_gender("ayuda"), "f") + es_check("Aheur", "ayuda", es_agree_article("ayuda", "true", "singular"), "el") + es_check("Avocab", "ayuda", es_article_for_gender("f", "ayuda", "true", "singular"), "el") + es_check("Npl", "año", es_pluralize("año"), "años") + es_check("Gheur", "año", es_gender("año"), "m") + es_check("Aheur", "año", es_agree_article("año", "true", "singular"), "el") + es_check("Avocab", "año", es_article_for_gender("m", "año", "true", "singular"), "el") + es_check("Npl", "banco", es_pluralize("banco"), "bancos") + es_check("Gheur", "banco", es_gender("banco"), "m") + es_check("Aheur", "banco", es_agree_article("banco", "true", "singular"), "el") + es_check("Avocab", "banco", es_article_for_gender("m", "banco", "true", "singular"), "el") + es_check("Npl", "barco", es_pluralize("barco"), "barcos") + es_check("Gheur", "barco", es_gender("barco"), "m") + es_check("Aheur", "barco", es_agree_article("barco", "true", "singular"), "el") + es_check("Avocab", "barco", es_article_for_gender("m", "barco", "true", "singular"), "el") + es_check("Npl", "baño", es_pluralize("baño"), "baños") + es_check("Gheur", "baño", es_gender("baño"), "m") + es_check("Aheur", "baño", es_agree_article("baño", "true", "singular"), "el") + es_check("Avocab", "baño", es_article_for_gender("m", "baño", "true", "singular"), "el") + es_check("Npl", "beneficio", es_pluralize("beneficio"), "beneficios") + es_check("Gheur", "beneficio", es_gender("beneficio"), "m") + es_check("Aheur", "beneficio", es_agree_article("beneficio", "true", "singular"), "el") + es_check("Avocab", "beneficio", es_article_for_gender("m", "beneficio", "true", "singular"), "el") + es_check("Npl", "billete", es_pluralize("billete"), "billetes") + es_check("Gheur", "billete", es_gender("billete"), "m") + es_check("Aheur", "billete", es_agree_article("billete", "true", "singular"), "el") + es_check("Avocab", "billete", es_article_for_gender("m", "billete", "true", "singular"), "el") + es_check("Npl", "café", es_pluralize("café"), "cafés") + es_check("Gheur", "café", es_gender("café"), "m") + es_check("Aheur", "café", es_agree_article("café", "true", "singular"), "el") + es_check("Avocab", "café", es_article_for_gender("m", "café", "true", "singular"), "el") + es_check("Npl", "calma", es_pluralize("calma"), "calmas") + es_check("Gheur", "calma", es_gender("calma"), "f") + es_check("Aheur", "calma", es_agree_article("calma", "true", "singular"), "la") + es_check("Avocab", "calma", es_article_for_gender("f", "calma", "true", "singular"), "la") + es_check("Npl", "camino", es_pluralize("camino"), "caminos") + es_check("Gheur", "camino", es_gender("camino"), "m") + es_check("Aheur", "camino", es_agree_article("camino", "true", "singular"), "el") + es_check("Avocab", "camino", es_article_for_gender("m", "camino", "true", "singular"), "el") + es_check("Npl", "canción", es_pluralize("canción"), "canciones") + es_check("Gheur", "canción", es_gender("canción"), "f") + es_check("Aheur", "canción", es_agree_article("canción", "true", "singular"), "la") + es_check("Avocab", "canción", es_article_for_gender("f", "canción", "true", "singular"), "la") + es_check("Npl", "candidato", es_pluralize("candidato"), "candidatos") + es_check("Gheur", "candidato", es_gender("candidato"), "m") + es_check("Aheur", "candidato", es_agree_article("candidato", "true", "singular"), "el") + es_check("Avocab", "candidato", es_article_for_gender("m", "candidato", "true", "singular"), "el") + es_check("Npl", "casa", es_pluralize("casa"), "casas") + es_check("Gheur", "casa", es_gender("casa"), "f") + es_check("Aheur", "casa", es_agree_article("casa", "true", "singular"), "la") + es_check("Avocab", "casa", es_article_for_gender("f", "casa", "true", "singular"), "la") + es_check("Npl", "cena", es_pluralize("cena"), "cenas") + es_check("Gheur", "cena", es_gender("cena"), "f") + es_check("Aheur", "cena", es_agree_article("cena", "true", "singular"), "la") + es_check("Avocab", "cena", es_article_for_gender("f", "cena", "true", "singular"), "la") + es_check("Npl", "ciudad", es_pluralize("ciudad"), "ciudades") + es_check("Gheur", "ciudad", es_gender("ciudad"), "f") + es_check("Aheur", "ciudad", es_agree_article("ciudad", "true", "singular"), "la") + es_check("Avocab", "ciudad", es_article_for_gender("f", "ciudad", "true", "singular"), "la") + es_check("Npl", "ciudadano", es_pluralize("ciudadano"), "ciudadanos") + es_check("Gheur", "ciudadano", es_gender("ciudadano"), "m") + es_check("Aheur", "ciudadano", es_agree_article("ciudadano", "true", "singular"), "el") + es_check("Avocab", "ciudadano", es_article_for_gender("m", "ciudadano", "true", "singular"), "el") + es_check("Npl", "color", es_pluralize("color"), "colores") + es_check("Gheur", "color", es_gender("color"), "m") + es_check("Aheur", "color", es_agree_article("color", "true", "singular"), "el") + es_check("Avocab", "color", es_article_for_gender("m", "color", "true", "singular"), "el") + es_check("Npl", "condición", es_pluralize("condición"), "condiciones") + es_check("Gheur", "condición", es_gender("condición"), "f") + es_check("Aheur", "condición", es_agree_article("condición", "true", "singular"), "la") + es_check("Avocab", "condición", es_article_for_gender("f", "condición", "true", "singular"), "la") + es_check("Npl", "corazón", es_pluralize("corazón"), "corazones") + es_check("Gheur", "corazón", es_gender("corazón"), "m") + es_check("Aheur", "corazón", es_agree_article("corazón", "true", "singular"), "el") + es_check("Avocab", "corazón", es_article_for_gender("m", "corazón", "true", "singular"), "el") + es_check("Npl", "costa", es_pluralize("costa"), "costas") + es_check("Gheur", "costa", es_gender("costa"), "f") + es_check("Aheur", "costa", es_agree_article("costa", "true", "singular"), "la") + es_check("Avocab", "costa", es_article_for_gender("f", "costa", "true", "singular"), "la") + es_check("Npl", "crisis", es_pluralize("crisis"), "crisis") + es_check("Gheur", "crisis", es_gender("crisis"), "f") + es_check("Aheur", "crisis", es_agree_article("crisis", "true", "singular"), "la") + es_check("Avocab", "crisis", es_article_for_gender("f", "crisis", "true", "singular"), "la") + es_check("Npl", "crédito", es_pluralize("crédito"), "créditos") + es_check("Gheur", "crédito", es_gender("crédito"), "m") + es_check("Aheur", "crédito", es_agree_article("crédito", "true", "singular"), "el") + es_check("Avocab", "crédito", es_article_for_gender("m", "crédito", "true", "singular"), "el") + es_check("Npl", "culpa", es_pluralize("culpa"), "culpas") + es_check("Gheur", "culpa", es_gender("culpa"), "f") + es_check("Aheur", "culpa", es_agree_article("culpa", "true", "singular"), "la") + es_check("Avocab", "culpa", es_article_for_gender("f", "culpa", "true", "singular"), "la") + es_check("Npl", "damnificado", es_pluralize("damnificado"), "damnificados") + es_check("Gheur", "damnificado", es_gender("damnificado"), "m") + es_check("Aheur", "damnificado", es_agree_article("damnificado", "true", "singular"), "el") + es_check("Avocab", "damnificado", es_article_for_gender("m", "damnificado", "true", "singular"), "el") + es_check("Npl", "demás", es_pluralize("demás"), "demás") + es_check("Gheur", "demás", es_gender("demás"), "m") + es_check("Aheur", "demás", es_agree_article("demás", "true", "singular"), "el") + es_check("Avocab", "demás", es_article_for_gender("m", "demás", "true", "singular"), "el") + es_check("Npl", "dinero", es_pluralize("dinero"), "dineros") + es_check("Gheur", "dinero", es_gender("dinero"), "m") + es_check("Aheur", "dinero", es_agree_article("dinero", "true", "singular"), "el") + es_check("Avocab", "dinero", es_article_for_gender("m", "dinero", "true", "singular"), "el") + es_check("Npl", "día", es_pluralize("día"), "días") + es_check("Gheur", "día", es_gender("día"), "m") + es_check("Aheur", "día", es_agree_article("día", "true", "singular"), "el") + es_check("Avocab", "día", es_article_for_gender("m", "día", "true", "singular"), "el") + es_check("Npl", "economía", es_pluralize("economía"), "economías") + es_check("Gheur", "economía", es_gender("economía"), "f") + es_check("Aheur", "economía", es_agree_article("economía", "true", "singular"), "la") + es_check("Avocab", "economía", es_article_for_gender("f", "economía", "true", "singular"), "la") + es_check("Npl", "elección", es_pluralize("elección"), "elecciones") + es_check("Gheur", "elección", es_gender("elección"), "f") + es_check("Aheur", "elección", es_agree_article("elección", "true", "singular"), "la") + es_check("Avocab", "elección", es_article_for_gender("f", "elección", "true", "singular"), "la") + es_check("Npl", "empleo", es_pluralize("empleo"), "empleos") + es_check("Gheur", "empleo", es_gender("empleo"), "m") + es_check("Aheur", "empleo", es_agree_article("empleo", "true", "singular"), "el") + es_check("Avocab", "empleo", es_article_for_gender("m", "empleo", "true", "singular"), "el") + es_check("Npl", "empresa", es_pluralize("empresa"), "empresas") + es_check("Gheur", "empresa", es_gender("empresa"), "f") + es_check("Aheur", "empresa", es_agree_article("empresa", "true", "singular"), "la") + es_check("Avocab", "empresa", es_article_for_gender("f", "empresa", "true", "singular"), "la") + es_check("Npl", "equipo", es_pluralize("equipo"), "equipos") + es_check("Gheur", "equipo", es_gender("equipo"), "m") + es_check("Aheur", "equipo", es_agree_article("equipo", "true", "singular"), "el") + es_check("Avocab", "equipo", es_article_for_gender("m", "equipo", "true", "singular"), "el") + es_check("Npl", "estación", es_pluralize("estación"), "estaciones") + es_check("Gheur", "estación", es_gender("estación"), "f") + es_check("Aheur", "estación", es_agree_article("estación", "true", "singular"), "la") + es_check("Avocab", "estación", es_article_for_gender("f", "estación", "true", "singular"), "la") + es_check("Npl", "estudiante", es_pluralize("estudiante"), "estudiantes") + es_check("Gheur", "estudiante", es_gender("estudiante"), "m") + es_check("Aheur", "estudiante", es_agree_article("estudiante", "true", "singular"), "el") + es_check("Avocab", "estudiante", es_article_for_gender("m", "estudiante", "true", "singular"), "el") + es_check("Npl", "experto", es_pluralize("experto"), "expertos") + es_check("Gheur", "experto", es_gender("experto"), "m") + es_check("Aheur", "experto", es_agree_article("experto", "true", "singular"), "el") + es_check("Avocab", "experto", es_article_for_gender("m", "experto", "true", "singular"), "el") + es_check("Npl", "fiesta", es_pluralize("fiesta"), "fiestas") + es_check("Gheur", "fiesta", es_gender("fiesta"), "f") + es_check("Aheur", "fiesta", es_agree_article("fiesta", "true", "singular"), "la") + es_check("Avocab", "fiesta", es_article_for_gender("f", "fiesta", "true", "singular"), "la") + es_check("Npl", "flor", es_pluralize("flor"), "flores") + es_check("Gheur", "flor", es_gender("flor"), "f") + es_check("Aheur", "flor", es_agree_article("flor", "true", "singular"), "la") + es_check("Avocab", "flor", es_article_for_gender("f", "flor", "true", "singular"), "la") + es_check("Npl", "foto", es_pluralize("foto"), "fotos") + es_check("Gheur", "foto", es_gender("foto"), "f") + es_check("Aheur", "foto", es_agree_article("foto", "true", "singular"), "la") + es_check("Avocab", "foto", es_article_for_gender("f", "foto", "true", "singular"), "la") + es_check("Npl", "frío", es_pluralize("frío"), "fríos") + es_check("Gheur", "frío", es_gender("frío"), "m") + es_check("Aheur", "frío", es_agree_article("frío", "true", "singular"), "el") + es_check("Avocab", "frío", es_article_for_gender("m", "frío", "true", "singular"), "el") + es_check("Npl", "fuego", es_pluralize("fuego"), "fuegos") + es_check("Gheur", "fuego", es_gender("fuego"), "m") + es_check("Aheur", "fuego", es_agree_article("fuego", "true", "singular"), "el") + es_check("Avocab", "fuego", es_article_for_gender("m", "fuego", "true", "singular"), "el") + es_check("Npl", "fuerza", es_pluralize("fuerza"), "fuerzas") + es_check("Gheur", "fuerza", es_gender("fuerza"), "f") + es_check("Aheur", "fuerza", es_agree_article("fuerza", "true", "singular"), "la") + es_check("Avocab", "fuerza", es_article_for_gender("f", "fuerza", "true", "singular"), "la") + es_check("Npl", "gato", es_pluralize("gato"), "gatos") + es_check("Gheur", "gato", es_gender("gato"), "m") + es_check("Aheur", "gato", es_agree_article("gato", "true", "singular"), "el") + es_check("Avocab", "gato", es_article_for_gender("m", "gato", "true", "singular"), "el") + es_check("Npl", "gobierno", es_pluralize("gobierno"), "gobiernos") + es_check("Gheur", "gobierno", es_gender("gobierno"), "m") + es_check("Aheur", "gobierno", es_agree_article("gobierno", "true", "singular"), "el") + es_check("Avocab", "gobierno", es_article_for_gender("m", "gobierno", "true", "singular"), "el") + es_check("Npl", "gusto", es_pluralize("gusto"), "gustos") + es_check("Gheur", "gusto", es_gender("gusto"), "m") + es_check("Aheur", "gusto", es_agree_article("gusto", "true", "singular"), "el") + es_check("Avocab", "gusto", es_article_for_gender("m", "gusto", "true", "singular"), "el") + es_check("Npl", "hermano", es_pluralize("hermano"), "hermanos") + es_check("Gheur", "hermano", es_gender("hermano"), "m") + es_check("Aheur", "hermano", es_agree_article("hermano", "true", "singular"), "el") + es_check("Avocab", "hermano", es_article_for_gender("m", "hermano", "true", "singular"), "el") + es_check("Npl", "hombre", es_pluralize("hombre"), "hombres") + es_check("Gheur", "hombre", es_gender("hombre"), "m") + es_check("Aheur", "hombre", es_agree_article("hombre", "true", "singular"), "el") + es_check("Avocab", "hombre", es_article_for_gender("m", "hombre", "true", "singular"), "el") + es_check("Npl", "jardín", es_pluralize("jardín"), "jardines") + es_check("Gheur", "jardín", es_gender("jardín"), "m") + es_check("Aheur", "jardín", es_agree_article("jardín", "true", "singular"), "el") + es_check("Avocab", "jardín", es_article_for_gender("m", "jardín", "true", "singular"), "el") + es_check("Npl", "juez", es_pluralize("juez"), "jueces") + es_check("Gheur", "juez", es_gender("juez"), "m") + es_check("Aheur", "juez", es_agree_article("juez", "true", "singular"), "el") + es_check("Avocab", "juez", es_article_for_gender("m", "juez", "true", "singular"), "el") + es_check("Npl", "juicio", es_pluralize("juicio"), "juicios") + es_check("Gheur", "juicio", es_gender("juicio"), "m") + es_check("Aheur", "juicio", es_agree_article("juicio", "true", "singular"), "el") + es_check("Avocab", "juicio", es_article_for_gender("m", "juicio", "true", "singular"), "el") + es_check("Npl", "lentitud", es_pluralize("lentitud"), "lentitudes") + es_check("Gheur", "lentitud", es_gender("lentitud"), "f") + es_check("Aheur", "lentitud", es_agree_article("lentitud", "true", "singular"), "la") + es_check("Avocab", "lentitud", es_article_for_gender("f", "lentitud", "true", "singular"), "la") + es_check("Npl", "ley", es_pluralize("ley"), "leyes") + es_check("Gheur", "ley", es_gender("ley"), "f") + es_check("Aheur", "ley", es_agree_article("ley", "true", "singular"), "la") + es_check("Avocab", "ley", es_article_for_gender("f", "ley", "true", "singular"), "la") + es_check("Npl", "libertad", es_pluralize("libertad"), "libertades") + es_check("Gheur", "libertad", es_gender("libertad"), "f") + es_check("Aheur", "libertad", es_agree_article("libertad", "true", "singular"), "la") + es_check("Avocab", "libertad", es_article_for_gender("f", "libertad", "true", "singular"), "la") + es_check("Npl", "libro", es_pluralize("libro"), "libros") + es_check("Gheur", "libro", es_gender("libro"), "m") + es_check("Aheur", "libro", es_agree_article("libro", "true", "singular"), "el") + es_check("Avocab", "libro", es_article_for_gender("m", "libro", "true", "singular"), "el") + es_check("Npl", "llave", es_pluralize("llave"), "llaves") + es_check("Gheur", "llave", es_gender("llave"), "f") + es_check("Aheur", "llave", es_agree_article("llave", "true", "singular"), "la") + es_check("Avocab", "llave", es_article_for_gender("f", "llave", "true", "singular"), "la") + es_check("Npl", "lluvia", es_pluralize("lluvia"), "lluvias") + es_check("Gheur", "lluvia", es_gender("lluvia"), "f") + es_check("Aheur", "lluvia", es_agree_article("lluvia", "true", "singular"), "la") + es_check("Avocab", "lluvia", es_article_for_gender("f", "lluvia", "true", "singular"), "la") + es_check("Npl", "luna", es_pluralize("luna"), "lunas") + es_check("Gheur", "luna", es_gender("luna"), "f") + es_check("Aheur", "luna", es_agree_article("luna", "true", "singular"), "la") + es_check("Avocab", "luna", es_article_for_gender("f", "luna", "true", "singular"), "la") + es_check("Npl", "luz", es_pluralize("luz"), "luces") + es_check("Gheur", "luz", es_gender("luz"), "f") + es_check("Aheur", "luz", es_agree_article("luz", "true", "singular"), "la") + es_check("Avocab", "luz", es_article_for_gender("f", "luz", "true", "singular"), "la") + es_check("Npl", "madre", es_pluralize("madre"), "madres") + es_check("Gheur", "madre", es_gender("madre"), "f") + es_check("Aheur", "madre", es_agree_article("madre", "true", "singular"), "la") + es_check("Avocab", "madre", es_article_for_gender("f", "madre", "true", "singular"), "la") + es_check("Npl", "mano", es_pluralize("mano"), "manos") + es_check("Gheur", "mano", es_gender("mano"), "f") + es_check("Aheur", "mano", es_agree_article("mano", "true", "singular"), "la") + es_check("Avocab", "mano", es_article_for_gender("f", "mano", "true", "singular"), "la") + es_check("Npl", "mapa", es_pluralize("mapa"), "mapas") + es_check("Gheur", "mapa", es_gender("mapa"), "m") + es_check("Aheur", "mapa", es_agree_article("mapa", "true", "singular"), "el") + es_check("Avocab", "mapa", es_article_for_gender("m", "mapa", "true", "singular"), "el") + es_check("Npl", "mar", es_pluralize("mar"), "mares") + es_check("Gheur", "mar", es_gender("mar"), "m") + es_check("Aheur", "mar", es_agree_article("mar", "true", "singular"), "el") + es_check("Avocab", "mar", es_article_for_gender("m", "mar", "true", "singular"), "el") + es_check("Npl", "marea", es_pluralize("marea"), "mareas") + es_check("Gheur", "marea", es_gender("marea"), "f") + es_check("Aheur", "marea", es_agree_article("marea", "true", "singular"), "la") + es_check("Avocab", "marea", es_article_for_gender("f", "marea", "true", "singular"), "la") + es_check("Npl", "memoria", es_pluralize("memoria"), "memorias") + es_check("Gheur", "memoria", es_gender("memoria"), "f") + es_check("Aheur", "memoria", es_agree_article("memoria", "true", "singular"), "la") + es_check("Avocab", "memoria", es_article_for_gender("f", "memoria", "true", "singular"), "la") + es_check("Npl", "mesa", es_pluralize("mesa"), "mesas") + es_check("Gheur", "mesa", es_gender("mesa"), "f") + es_check("Aheur", "mesa", es_agree_article("mesa", "true", "singular"), "la") + es_check("Avocab", "mesa", es_article_for_gender("f", "mesa", "true", "singular"), "la") + es_check("Npl", "ministro", es_pluralize("ministro"), "ministros") + es_check("Gheur", "ministro", es_gender("ministro"), "m") + es_check("Aheur", "ministro", es_agree_article("ministro", "true", "singular"), "el") + es_check("Avocab", "ministro", es_article_for_gender("m", "ministro", "true", "singular"), "el") + es_check("Npl", "montaña", es_pluralize("montaña"), "montañas") + es_check("Gheur", "montaña", es_gender("montaña"), "f") + es_check("Aheur", "montaña", es_agree_article("montaña", "true", "singular"), "la") + es_check("Avocab", "montaña", es_article_for_gender("f", "montaña", "true", "singular"), "la") + es_check("Npl", "moto", es_pluralize("moto"), "motos") + es_check("Gheur", "moto", es_gender("moto"), "f") + es_check("Aheur", "moto", es_agree_article("moto", "true", "singular"), "la") + es_check("Avocab", "moto", es_article_for_gender("f", "moto", "true", "singular"), "la") + es_check("Npl", "mujer", es_pluralize("mujer"), "mujeres") + es_check("Gheur", "mujer", es_gender("mujer"), "f") + es_check("Aheur", "mujer", es_agree_article("mujer", "true", "singular"), "la") + es_check("Avocab", "mujer", es_article_for_gender("f", "mujer", "true", "singular"), "la") + es_check("Npl", "mundo", es_pluralize("mundo"), "mundos") + es_check("Gheur", "mundo", es_gender("mundo"), "m") + es_check("Aheur", "mundo", es_agree_article("mundo", "true", "singular"), "el") + es_check("Avocab", "mundo", es_article_for_gender("m", "mundo", "true", "singular"), "el") + es_check("Npl", "música", es_pluralize("música"), "músicas") + es_check("Gheur", "música", es_gender("música"), "f") + es_check("Aheur", "música", es_agree_article("música", "true", "singular"), "la") + es_check("Avocab", "música", es_article_for_gender("f", "música", "true", "singular"), "la") + es_check("Npl", "nación", es_pluralize("nación"), "naciones") + es_check("Gheur", "nación", es_gender("nación"), "f") + es_check("Aheur", "nación", es_agree_article("nación", "true", "singular"), "la") + es_check("Avocab", "nación", es_article_for_gender("f", "nación", "true", "singular"), "la") + es_check("Npl", "niebla", es_pluralize("niebla"), "nieblas") + es_check("Gheur", "niebla", es_gender("niebla"), "f") + es_check("Aheur", "niebla", es_agree_article("niebla", "true", "singular"), "la") + es_check("Avocab", "niebla", es_article_for_gender("f", "niebla", "true", "singular"), "la") + es_check("Npl", "nieve", es_pluralize("nieve"), "nieves") + es_check("Gheur", "nieve", es_gender("nieve"), "f") + es_check("Aheur", "nieve", es_agree_article("nieve", "true", "singular"), "la") + es_check("Avocab", "nieve", es_article_for_gender("f", "nieve", "true", "singular"), "la") + es_check("Npl", "niña", es_pluralize("niña"), "niñas") + es_check("Gheur", "niña", es_gender("niña"), "f") + es_check("Aheur", "niña", es_agree_article("niña", "true", "singular"), "la") + es_check("Avocab", "niña", es_article_for_gender("f", "niña", "true", "singular"), "la") + es_check("Npl", "niño", es_pluralize("niño"), "niños") + es_check("Gheur", "niño", es_gender("niño"), "m") + es_check("Aheur", "niño", es_agree_article("niño", "true", "singular"), "el") + es_check("Avocab", "niño", es_article_for_gender("m", "niño", "true", "singular"), "el") + es_check("Npl", "noche", es_pluralize("noche"), "noches") + es_check("Gheur", "noche", es_gender("noche"), "f") + es_check("Aheur", "noche", es_agree_article("noche", "true", "singular"), "la") + es_check("Avocab", "noche", es_article_for_gender("f", "noche", "true", "singular"), "la") + es_check("Npl", "nombre", es_pluralize("nombre"), "nombres") + es_check("Gheur", "nombre", es_gender("nombre"), "m") + es_check("Aheur", "nombre", es_agree_article("nombre", "true", "singular"), "el") + es_check("Avocab", "nombre", es_article_for_gender("m", "nombre", "true", "singular"), "el") + es_check("Npl", "ojo", es_pluralize("ojo"), "ojos") + es_check("Gheur", "ojo", es_gender("ojo"), "m") + es_check("Aheur", "ojo", es_agree_article("ojo", "true", "singular"), "el") + es_check("Avocab", "ojo", es_article_for_gender("m", "ojo", "true", "singular"), "el") + es_check("Npl", "orilla", es_pluralize("orilla"), "orillas") + es_check("Gheur", "orilla", es_gender("orilla"), "f") + es_check("Aheur", "orilla", es_agree_article("orilla", "true", "singular"), "la") + es_check("Avocab", "orilla", es_article_for_gender("f", "orilla", "true", "singular"), "la") + es_check("Npl", "paisaje", es_pluralize("paisaje"), "paisajes") + es_check("Gheur", "paisaje", es_gender("paisaje"), "m") + es_check("Aheur", "paisaje", es_agree_article("paisaje", "true", "singular"), "el") + es_check("Avocab", "paisaje", es_article_for_gender("m", "paisaje", "true", "singular"), "el") + es_check("Npl", "parlamento", es_pluralize("parlamento"), "parlamentos") + es_check("Gheur", "parlamento", es_gender("parlamento"), "m") + es_check("Aheur", "parlamento", es_agree_article("parlamento", "true", "singular"), "el") + es_check("Avocab", "parlamento", es_article_for_gender("m", "parlamento", "true", "singular"), "el") + es_check("Npl", "parte", es_pluralize("parte"), "partes") + es_check("Gheur", "parte", es_gender("parte"), "f") + es_check("Aheur", "parte", es_agree_article("parte", "true", "singular"), "la") + es_check("Avocab", "parte", es_article_for_gender("f", "parte", "true", "singular"), "la") + es_check("Npl", "pasillo", es_pluralize("pasillo"), "pasillos") + es_check("Gheur", "pasillo", es_gender("pasillo"), "m") + es_check("Aheur", "pasillo", es_agree_article("pasillo", "true", "singular"), "el") + es_check("Avocab", "pasillo", es_article_for_gender("m", "pasillo", "true", "singular"), "el") + es_check("Npl", "país", es_pluralize("país"), "países") + es_check("Gheur", "país", es_gender("país"), "m") + es_check("Aheur", "país", es_agree_article("país", "true", "singular"), "el") + es_check("Avocab", "país", es_article_for_gender("m", "país", "true", "singular"), "el") + es_check("Npl", "película", es_pluralize("película"), "películas") + es_check("Gheur", "película", es_gender("película"), "f") + es_check("Aheur", "película", es_agree_article("película", "true", "singular"), "la") + es_check("Avocab", "película", es_article_for_gender("f", "película", "true", "singular"), "la") + es_check("Npl", "perro", es_pluralize("perro"), "perros") + es_check("Gheur", "perro", es_gender("perro"), "m") + es_check("Aheur", "perro", es_agree_article("perro", "true", "singular"), "el") + es_check("Avocab", "perro", es_article_for_gender("m", "perro", "true", "singular"), "el") + es_check("Npl", "persona", es_pluralize("persona"), "personas") + es_check("Gheur", "persona", es_gender("persona"), "f") + es_check("Aheur", "persona", es_agree_article("persona", "true", "singular"), "la") + es_check("Avocab", "persona", es_article_for_gender("f", "persona", "true", "singular"), "la") + es_check("Npl", "petróleo", es_pluralize("petróleo"), "petróleos") + es_check("Gheur", "petróleo", es_gender("petróleo"), "m") + es_check("Aheur", "petróleo", es_agree_article("petróleo", "true", "singular"), "el") + es_check("Avocab", "petróleo", es_article_for_gender("m", "petróleo", "true", "singular"), "el") + es_check("Npl", "pez", es_pluralize("pez"), "peces") + es_check("Gheur", "pez", es_gender("pez"), "f") + es_check("Aheur", "pez", es_agree_article("pez", "true", "singular"), "la") + es_check("Avocab", "pez", es_article_for_gender("f", "pez", "true", "singular"), "la") + es_check("Npl", "plan", es_pluralize("plan"), "planes") + es_check("Gheur", "plan", es_gender("plan"), "m") + es_check("Aheur", "plan", es_agree_article("plan", "true", "singular"), "el") + es_check("Avocab", "plan", es_article_for_gender("m", "plan", "true", "singular"), "el") + es_check("Npl", "policía", es_pluralize("policía"), "policías") + es_check("Gheur", "policía", es_gender("policía"), "f") + es_check("Aheur", "policía", es_agree_article("policía", "true", "singular"), "la") + es_check("Avocab", "policía", es_article_for_gender("f", "policía", "true", "singular"), "la") + es_check("Npl", "portavoz", es_pluralize("portavoz"), "portavoces") + es_check("Gheur", "portavoz", es_gender("portavoz"), "m") + es_check("Aheur", "portavoz", es_agree_article("portavoz", "true", "singular"), "el") + es_check("Avocab", "portavoz", es_article_for_gender("m", "portavoz", "true", "singular"), "el") + es_check("Npl", "portero", es_pluralize("portero"), "porteros") + es_check("Gheur", "portero", es_gender("portero"), "m") + es_check("Aheur", "portero", es_agree_article("portero", "true", "singular"), "el") + es_check("Avocab", "portero", es_article_for_gender("m", "portero", "true", "singular"), "el") + es_check("Npl", "precio", es_pluralize("precio"), "precios") + es_check("Gheur", "precio", es_gender("precio"), "m") + es_check("Aheur", "precio", es_agree_article("precio", "true", "singular"), "el") + es_check("Avocab", "precio", es_article_for_gender("m", "precio", "true", "singular"), "el") + es_check("Npl", "presidente", es_pluralize("presidente"), "presidentes") + es_check("Gheur", "presidente", es_gender("presidente"), "m") + es_check("Aheur", "presidente", es_agree_article("presidente", "true", "singular"), "el") + es_check("Avocab", "presidente", es_article_for_gender("m", "presidente", "true", "singular"), "el") + es_check("Npl", "problema", es_pluralize("problema"), "problemas") + es_check("Gheur", "problema", es_gender("problema"), "m") + es_check("Aheur", "problema", es_agree_article("problema", "true", "singular"), "el") + es_check("Avocab", "problema", es_article_for_gender("m", "problema", "true", "singular"), "el") + es_check("Npl", "programa", es_pluralize("programa"), "programas") + es_check("Gheur", "programa", es_gender("programa"), "m") + es_check("Aheur", "programa", es_agree_article("programa", "true", "singular"), "el") + es_check("Avocab", "programa", es_article_for_gender("m", "programa", "true", "singular"), "el") + es_check("Npl", "proyecto", es_pluralize("proyecto"), "proyectos") + es_check("Gheur", "proyecto", es_gender("proyecto"), "m") + es_check("Aheur", "proyecto", es_agree_article("proyecto", "true", "singular"), "el") + es_check("Avocab", "proyecto", es_article_for_gender("m", "proyecto", "true", "singular"), "el") + es_check("Npl", "puerta", es_pluralize("puerta"), "puertas") + es_check("Gheur", "puerta", es_gender("puerta"), "f") + es_check("Aheur", "puerta", es_agree_article("puerta", "true", "singular"), "la") + es_check("Avocab", "puerta", es_article_for_gender("f", "puerta", "true", "singular"), "la") + es_check("Npl", "pájaro", es_pluralize("pájaro"), "pájaros") + es_check("Gheur", "pájaro", es_gender("pájaro"), "m") + es_check("Aheur", "pájaro", es_agree_article("pájaro", "true", "singular"), "el") + es_check("Avocab", "pájaro", es_article_for_gender("m", "pájaro", "true", "singular"), "el") + es_check("Npl", "razón", es_pluralize("razón"), "razones") + es_check("Gheur", "razón", es_gender("razón"), "f") + es_check("Aheur", "razón", es_agree_article("razón", "true", "singular"), "la") + es_check("Avocab", "razón", es_article_for_gender("f", "razón", "true", "singular"), "la") + es_check("Npl", "raíz", es_pluralize("raíz"), "raíces") + es_check("Gheur", "raíz", es_gender("raíz"), "f") + es_check("Aheur", "raíz", es_agree_article("raíz", "true", "singular"), "la") + es_check("Avocab", "raíz", es_article_for_gender("f", "raíz", "true", "singular"), "la") + es_check("Npl", "recuerdo", es_pluralize("recuerdo"), "recuerdos") + es_check("Gheur", "recuerdo", es_gender("recuerdo"), "m") + es_check("Aheur", "recuerdo", es_agree_article("recuerdo", "true", "singular"), "el") + es_check("Avocab", "recuerdo", es_article_for_gender("m", "recuerdo", "true", "singular"), "el") + es_check("Npl", "reforma", es_pluralize("reforma"), "reformas") + es_check("Gheur", "reforma", es_gender("reforma"), "f") + es_check("Aheur", "reforma", es_agree_article("reforma", "true", "singular"), "la") + es_check("Avocab", "reforma", es_article_for_gender("f", "reforma", "true", "singular"), "la") + es_check("Npl", "región", es_pluralize("región"), "regiones") + es_check("Gheur", "región", es_gender("región"), "f") + es_check("Aheur", "región", es_agree_article("región", "true", "singular"), "la") + es_check("Avocab", "región", es_article_for_gender("f", "región", "true", "singular"), "la") + es_check("Npl", "río", es_pluralize("río"), "ríos") + es_check("Gheur", "río", es_gender("río"), "m") + es_check("Aheur", "río", es_agree_article("río", "true", "singular"), "el") + es_check("Avocab", "río", es_article_for_gender("m", "río", "true", "singular"), "el") + es_check("Npl", "semilla", es_pluralize("semilla"), "semillas") + es_check("Gheur", "semilla", es_gender("semilla"), "f") + es_check("Aheur", "semilla", es_agree_article("semilla", "true", "singular"), "la") + es_check("Avocab", "semilla", es_article_for_gender("f", "semilla", "true", "singular"), "la") + es_check("Npl", "sendero", es_pluralize("sendero"), "senderos") + es_check("Gheur", "sendero", es_gender("sendero"), "m") + es_check("Aheur", "sendero", es_agree_article("sendero", "true", "singular"), "el") + es_check("Avocab", "sendero", es_article_for_gender("m", "sendero", "true", "singular"), "el") + es_check("Npl", "señor", es_pluralize("señor"), "señores") + es_check("Gheur", "señor", es_gender("señor"), "m") + es_check("Aheur", "señor", es_agree_article("señor", "true", "singular"), "el") + es_check("Avocab", "señor", es_article_for_gender("m", "señor", "true", "singular"), "el") + es_check("Npl", "silencio", es_pluralize("silencio"), "silencios") + es_check("Gheur", "silencio", es_gender("silencio"), "m") + es_check("Aheur", "silencio", es_agree_article("silencio", "true", "singular"), "el") + es_check("Avocab", "silencio", es_article_for_gender("m", "silencio", "true", "singular"), "el") + es_check("Npl", "silla", es_pluralize("silla"), "sillas") + es_check("Gheur", "silla", es_gender("silla"), "f") + es_check("Aheur", "silla", es_agree_article("silla", "true", "singular"), "la") + es_check("Avocab", "silla", es_article_for_gender("f", "silla", "true", "singular"), "la") + es_check("Npl", "sol", es_pluralize("sol"), "soles") + es_check("Gheur", "sol", es_gender("sol"), "m") + es_check("Aheur", "sol", es_agree_article("sol", "true", "singular"), "el") + es_check("Avocab", "sol", es_article_for_gender("m", "sol", "true", "singular"), "el") + es_check("Npl", "tarea", es_pluralize("tarea"), "tareas") + es_check("Gheur", "tarea", es_gender("tarea"), "f") + es_check("Aheur", "tarea", es_agree_article("tarea", "true", "singular"), "la") + es_check("Avocab", "tarea", es_article_for_gender("f", "tarea", "true", "singular"), "la") + es_check("Npl", "tema", es_pluralize("tema"), "temas") + es_check("Gheur", "tema", es_gender("tema"), "m") + es_check("Aheur", "tema", es_agree_article("tema", "true", "singular"), "el") + es_check("Avocab", "tema", es_article_for_gender("m", "tema", "true", "singular"), "el") + es_check("Npl", "ti", es_pluralize("ti"), "tis") + es_check("Gheur", "ti", es_gender("ti"), "m") + es_check("Aheur", "ti", es_agree_article("ti", "true", "singular"), "el") + es_check("Avocab", "ti", es_article_for_gender("m", "ti", "true", "singular"), "el") + es_check("Npl", "tiempo", es_pluralize("tiempo"), "tiempos") + es_check("Gheur", "tiempo", es_gender("tiempo"), "m") + es_check("Aheur", "tiempo", es_agree_article("tiempo", "true", "singular"), "el") + es_check("Avocab", "tiempo", es_article_for_gender("m", "tiempo", "true", "singular"), "el") + es_check("Npl", "tipo", es_pluralize("tipo"), "tipos") + es_check("Gheur", "tipo", es_gender("tipo"), "m") + es_check("Aheur", "tipo", es_agree_article("tipo", "true", "singular"), "el") + es_check("Avocab", "tipo", es_article_for_gender("m", "tipo", "true", "singular"), "el") + es_check("Npl", "todo", es_pluralize("todo"), "todos") + es_check("Gheur", "todo", es_gender("todo"), "m") + es_check("Aheur", "todo", es_agree_article("todo", "true", "singular"), "el") + es_check("Avocab", "todo", es_article_for_gender("m", "todo", "true", "singular"), "el") + es_check("Npl", "tormenta", es_pluralize("tormenta"), "tormentas") + es_check("Gheur", "tormenta", es_gender("tormenta"), "f") + es_check("Aheur", "tormenta", es_agree_article("tormenta", "true", "singular"), "la") + es_check("Avocab", "tormenta", es_article_for_gender("f", "tormenta", "true", "singular"), "la") + es_check("Npl", "trabajador", es_pluralize("trabajador"), "trabajadores") + es_check("Gheur", "trabajador", es_gender("trabajador"), "m") + es_check("Aheur", "trabajador", es_agree_article("trabajador", "true", "singular"), "el") + es_check("Avocab", "trabajador", es_article_for_gender("m", "trabajador", "true", "singular"), "el") + es_check("Npl", "tristeza", es_pluralize("tristeza"), "tristezas") + es_check("Gheur", "tristeza", es_gender("tristeza"), "f") + es_check("Aheur", "tristeza", es_agree_article("tristeza", "true", "singular"), "la") + es_check("Avocab", "tristeza", es_article_for_gender("f", "tristeza", "true", "singular"), "la") + es_check("Npl", "ventana", es_pluralize("ventana"), "ventanas") + es_check("Gheur", "ventana", es_gender("ventana"), "f") + es_check("Aheur", "ventana", es_agree_article("ventana", "true", "singular"), "la") + es_check("Avocab", "ventana", es_article_for_gender("f", "ventana", "true", "singular"), "la") + es_check("Npl", "verdad", es_pluralize("verdad"), "verdades") + es_check("Gheur", "verdad", es_gender("verdad"), "f") + es_check("Aheur", "verdad", es_agree_article("verdad", "true", "singular"), "la") + es_check("Avocab", "verdad", es_article_for_gender("f", "verdad", "true", "singular"), "la") + es_check("Npl", "viaje", es_pluralize("viaje"), "viajes") + es_check("Gheur", "viaje", es_gender("viaje"), "m") + es_check("Aheur", "viaje", es_agree_article("viaje", "true", "singular"), "el") + es_check("Avocab", "viaje", es_article_for_gender("m", "viaje", "true", "singular"), "el") + es_check("Npl", "victoria", es_pluralize("victoria"), "victorias") + es_check("Gheur", "victoria", es_gender("victoria"), "f") + es_check("Aheur", "victoria", es_agree_article("victoria", "true", "singular"), "la") + es_check("Avocab", "victoria", es_article_for_gender("f", "victoria", "true", "singular"), "la") + es_check("Npl", "vida", es_pluralize("vida"), "vidas") + es_check("Gheur", "vida", es_gender("vida"), "f") + es_check("Aheur", "vida", es_agree_article("vida", "true", "singular"), "la") + es_check("Avocab", "vida", es_article_for_gender("f", "vida", "true", "singular"), "la") + es_check("Npl", "viento", es_pluralize("viento"), "vientos") + es_check("Gheur", "viento", es_gender("viento"), "m") + es_check("Aheur", "viento", es_agree_article("viento", "true", "singular"), "el") + es_check("Avocab", "viento", es_article_for_gender("m", "viento", "true", "singular"), "el") + es_check("Npl", "voz", es_pluralize("voz"), "voces") + es_check("Gheur", "voz", es_gender("voz"), "f") + es_check("Aheur", "voz", es_agree_article("voz", "true", "singular"), "la") + es_check("Avocab", "voz", es_article_for_gender("f", "voz", "true", "singular"), "la") + es_check("Npl", "vuelta", es_pluralize("vuelta"), "vueltas") + es_check("Gheur", "vuelta", es_gender("vuelta"), "f") + es_check("Aheur", "vuelta", es_agree_article("vuelta", "true", "singular"), "la") + es_check("Avocab", "vuelta", es_article_for_gender("f", "vuelta", "true", "singular"), "la") + es_check("Npl", "árbol", es_pluralize("árbol"), "árboles") + es_check("Gheur", "árbol", es_gender("árbol"), "m") + es_check("Aheur", "árbol", es_agree_article("árbol", "true", "singular"), "el") + es_check("Avocab", "árbol", es_article_for_gender("m", "árbol", "true", "singular"), "el") + es_check("Ampl", "alto", es_inflect_adj("alto", "m", "plural"), "altos") + es_check("Afsg", "alto", es_inflect_adj("alto", "f", "singular"), "alta") + es_check("Ampl", "ambos", es_inflect_adj("ambos", "m", "plural"), "ambos") + es_check("Afsg", "ambos", es_inflect_adj("ambos", "f", "singular"), "ambos") + es_check("Ampl", "antiguo", es_inflect_adj("antiguo", "m", "plural"), "antiguos") + es_check("Afsg", "antiguo", es_inflect_adj("antiguo", "f", "singular"), "antigua") + es_check("Ampl", "azul", es_inflect_adj("azul", "m", "plural"), "azules") + es_check("Afsg", "azul", es_inflect_adj("azul", "f", "singular"), "azul") + es_check("Ampl", "bajo", es_inflect_adj("bajo", "m", "plural"), "bajos") + es_check("Afsg", "bajo", es_inflect_adj("bajo", "f", "singular"), "baja") + es_check("Ampl", "blanco", es_inflect_adj("blanco", "m", "plural"), "blancos") + es_check("Afsg", "blanco", es_inflect_adj("blanco", "f", "singular"), "blanca") + es_check("Ampl", "bondadoso", es_inflect_adj("bondadoso", "m", "plural"), "bondadosos") + es_check("Afsg", "bondadoso", es_inflect_adj("bondadoso", "f", "singular"), "bondadosa") + es_check("Ampl", "bonito", es_inflect_adj("bonito", "m", "plural"), "bonitos") + es_check("Afsg", "bonito", es_inflect_adj("bonito", "f", "singular"), "bonita") + es_check("Ampl", "bueno", es_inflect_adj("bueno", "m", "plural"), "buenos") + es_check("Afsg", "bueno", es_inflect_adj("bueno", "f", "singular"), "buena") + es_check("Ampl", "cansado", es_inflect_adj("cansado", "m", "plural"), "cansados") + es_check("Afsg", "cansado", es_inflect_adj("cansado", "f", "singular"), "cansada") + es_check("Ampl", "corto", es_inflect_adj("corto", "m", "plural"), "cortos") + es_check("Afsg", "corto", es_inflect_adj("corto", "f", "singular"), "corta") + es_check("Ampl", "difícil", es_inflect_adj("difícil", "m", "plural"), "difíciles") + es_check("Afsg", "difícil", es_inflect_adj("difícil", "f", "singular"), "difícil") + es_check("Ampl", "dos", es_inflect_adj("dos", "m", "plural"), "dos") + es_check("Afsg", "dos", es_inflect_adj("dos", "f", "singular"), "dos") + es_check("Ampl", "económico", es_inflect_adj("económico", "m", "plural"), "económicos") + es_check("Afsg", "económico", es_inflect_adj("económico", "f", "singular"), "económica") + es_check("Ampl", "español", es_inflect_adj("español", "m", "plural"), "españoles") + es_check("Afsg", "español", es_inflect_adj("español", "f", "singular"), "española") + es_check("Ampl", "estrecho", es_inflect_adj("estrecho", "m", "plural"), "estrechos") + es_check("Afsg", "estrecho", es_inflect_adj("estrecho", "f", "singular"), "estrecha") + es_check("Ampl", "fascinante", es_inflect_adj("fascinante", "m", "plural"), "fascinantes") + es_check("Afsg", "fascinante", es_inflect_adj("fascinante", "f", "singular"), "fascinante") + es_check("Ampl", "feliz", es_inflect_adj("feliz", "m", "plural"), "felices") + es_check("Afsg", "feliz", es_inflect_adj("feliz", "f", "singular"), "feliz") + es_check("Ampl", "francés", es_inflect_adj("francés", "m", "plural"), "franceses") + es_check("Afsg", "francés", es_inflect_adj("francés", "f", "singular"), "francesa") + es_check("Ampl", "frío", es_inflect_adj("frío", "m", "plural"), "fríos") + es_check("Afsg", "frío", es_inflect_adj("frío", "f", "singular"), "fría") + es_check("Ampl", "fácil", es_inflect_adj("fácil", "m", "plural"), "fáciles") + es_check("Afsg", "fácil", es_inflect_adj("fácil", "f", "singular"), "fácil") + es_check("Ampl", "grande", es_inflect_adj("grande", "m", "plural"), "grandes") + es_check("Afsg", "grande", es_inflect_adj("grande", "f", "singular"), "grande") + es_check("Ampl", "hermoso", es_inflect_adj("hermoso", "m", "plural"), "hermosos") + es_check("Afsg", "hermoso", es_inflect_adj("hermoso", "f", "singular"), "hermosa") + es_check("Ampl", "importante", es_inflect_adj("importante", "m", "plural"), "importantes") + es_check("Afsg", "importante", es_inflect_adj("importante", "f", "singular"), "importante") + es_check("Ampl", "inglés", es_inflect_adj("inglés", "m", "plural"), "ingleses") + es_check("Afsg", "inglés", es_inflect_adj("inglés", "f", "singular"), "inglesa") + es_check("Ampl", "largo", es_inflect_adj("largo", "m", "plural"), "largos") + es_check("Afsg", "largo", es_inflect_adj("largo", "f", "singular"), "larga") + es_check("Ampl", "lento", es_inflect_adj("lento", "m", "plural"), "lentos") + es_check("Afsg", "lento", es_inflect_adj("lento", "f", "singular"), "lenta") + es_check("Ampl", "malo", es_inflect_adj("malo", "m", "plural"), "malos") + es_check("Afsg", "malo", es_inflect_adj("malo", "f", "singular"), "mala") + es_check("Ampl", "mucho", es_inflect_adj("mucho", "m", "plural"), "muchos") + es_check("Afsg", "mucho", es_inflect_adj("mucho", "f", "singular"), "mucha") + es_check("Ampl", "necesario", es_inflect_adj("necesario", "m", "plural"), "necesarios") + es_check("Afsg", "necesario", es_inflect_adj("necesario", "f", "singular"), "necesaria") + es_check("Ampl", "negro", es_inflect_adj("negro", "m", "plural"), "negros") + es_check("Afsg", "negro", es_inflect_adj("negro", "f", "singular"), "negra") + es_check("Ampl", "nuevo", es_inflect_adj("nuevo", "m", "plural"), "nuevos") + es_check("Afsg", "nuevo", es_inflect_adj("nuevo", "f", "singular"), "nueva") + es_check("Ampl", "olvidado", es_inflect_adj("olvidado", "m", "plural"), "olvidados") + es_check("Afsg", "olvidado", es_inflect_adj("olvidado", "f", "singular"), "olvidada") + es_check("Ampl", "oscuro", es_inflect_adj("oscuro", "m", "plural"), "oscuros") + es_check("Afsg", "oscuro", es_inflect_adj("oscuro", "f", "singular"), "oscura") + es_check("Ampl", "pequeño", es_inflect_adj("pequeño", "m", "plural"), "pequeños") + es_check("Afsg", "pequeño", es_inflect_adj("pequeño", "f", "singular"), "pequeña") + es_check("Ampl", "político", es_inflect_adj("político", "m", "plural"), "políticos") + es_check("Afsg", "político", es_inflect_adj("político", "f", "singular"), "política") + es_check("Ampl", "posible", es_inflect_adj("posible", "m", "plural"), "posibles") + es_check("Afsg", "posible", es_inflect_adj("posible", "f", "singular"), "posible") + es_check("Ampl", "rojo", es_inflect_adj("rojo", "m", "plural"), "rojos") + es_check("Afsg", "rojo", es_inflect_adj("rojo", "f", "singular"), "roja") + es_check("Ampl", "rápido", es_inflect_adj("rápido", "m", "plural"), "rápidos") + es_check("Afsg", "rápido", es_inflect_adj("rápido", "f", "singular"), "rápida") + es_check("Ampl", "sabio", es_inflect_adj("sabio", "m", "plural"), "sabios") + es_check("Afsg", "sabio", es_inflect_adj("sabio", "f", "singular"), "sabia") + es_check("Ampl", "silencioso", es_inflect_adj("silencioso", "m", "plural"), "silenciosos") + es_check("Afsg", "silencioso", es_inflect_adj("silencioso", "f", "singular"), "silenciosa") + es_check("Ampl", "social", es_inflect_adj("social", "m", "plural"), "sociales") + es_check("Afsg", "social", es_inflect_adj("social", "f", "singular"), "social") + es_check("Ampl", "trabajador", es_inflect_adj("trabajador", "m", "plural"), "trabajadores") + es_check("Afsg", "trabajador", es_inflect_adj("trabajador", "f", "singular"), "trabajadora") + es_check("Ampl", "triste", es_inflect_adj("triste", "m", "plural"), "tristes") + es_check("Afsg", "triste", es_inflect_adj("triste", "f", "singular"), "triste") + es_check("Ampl", "verde", es_inflect_adj("verde", "m", "plural"), "verdes") + es_check("Afsg", "verde", es_inflect_adj("verde", "f", "singular"), "verde") + es_check("Ampl", "viejo", es_inflect_adj("viejo", "m", "plural"), "viejos") + es_check("Afsg", "viejo", es_inflect_adj("viejo", "f", "singular"), "vieja") + es_check("Ctr", "de+el día", es_contract("de", "el día"), "del día") + es_check("Ctr", "a+el hombre", es_contract("a", "el hombre"), "al hombre") + es_check("Ctr", "de+el mundo", es_contract("de", "el mundo"), "del mundo") + es_check("Ctr", "a+el país", es_contract("a", "el país"), "al país") + es_check("Ctr", "en+el mar", es_contract("en", "el mar"), "en el mar") + es_check("Ctr", "de+el año", es_contract("de", "el año"), "del año") + es_check("Ctr", "a+la casa", es_contract("a", "la casa"), "a la casa") + es_check("Ctr", "de+la ciudad", es_contract("de", "la ciudad"), "de la ciudad") +} + +fn main() { + es_parity() +} diff --git a/elp/tests/parity-es-results.txt b/elp/tests/parity-es-results.txt new file mode 100644 index 0000000..c13737a --- /dev/null +++ b/elp/tests/parity-es-results.txt @@ -0,0 +1,1020 @@ +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +FAIL Vpres acordar got=acorda exp=acuerda +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +FAIL Vpres aprobar got=aproba exp=aprueba +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +FAIL Vpres cerrar got=cerra exp=cierra +PASS Vpret +PASS Vpart +FAIL Vpres comenzar got=comenza exp=comienza +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +FAIL Vpres contar got=conta exp=cuenta +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +FAIL Vpres costar got=costa exp=cuesta +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +FAIL Vpres despedir got=despede exp=despide +FAIL Vpret despedir got=despedió exp=despidió +PASS Vpart +FAIL Vpres detener got=detene exp=detiene +FAIL Vpret detener got=detenió exp=detuvo +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +FAIL Vpres doler got=dole exp=duele +PASS Vpret +PASS Vpart +FAIL Vpres dormir got=dorme exp=duerme +FAIL Vpret dormir got=dormió exp=durmió +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +FAIL Vpres empezar got=empeza exp=empieza +PASS Vpret +PASS Vpart +FAIL Vpres encontrar got=encontra exp=encuentra +PASS Vpret +PASS Vpart +FAIL Vpres entender got=entende exp=entiende +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +FAIL Vpres jugar got=juga exp=juega +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +FAIL Vpres llover got=llove exp=llueve +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +FAIL Vpres morir got=more exp=muere +FAIL Vpret morir got=morió exp=murió +PASS Vpart +FAIL Vpres mostrar got=mostra exp=muestra +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +FAIL Vpres oír got=oÃa exp=oye +FAIL Vpret oír got=oÃó exp=oyó +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +FAIL Vpres pedir got=pede exp=pide +FAIL Vpret pedir got=pedió exp=pidió +PASS Vpart +FAIL Vpres pensar got=pensa exp=piensa +PASS Vpret +PASS Vpart +FAIL Vpres perder got=perde exp=pierde +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +FAIL Vpret poner got=ponió exp=puso +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +FAIL Vpret producir got=produció exp=produjo +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +FAIL Vpret proponer got=proponió exp=propuso +FAIL Vpart proponer got=proponido exp=propuesto +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +FAIL Vpres recordar got=recorda exp=recuerda +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +FAIL Vpres sentar got=senta exp=sienta +PASS Vpret +PASS Vpart +FAIL Vpres sentir got=sente exp=siente +FAIL Vpret sentir got=sentió exp=sintió +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +FAIL Vpres sonreír got=sonreÃa exp=sonríe +FAIL Vpret sonreír got=sonreÃó exp=sonrió +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +FAIL Vpres soñar got=soña exp=sueña +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +PASS Vpres +PASS Vpret +PASS Vpart +FAIL Vpres volver got=volve exp=vuelve +PASS Vpret +PASS Vpart +FAIL Npl Barcelona got=Barcelonas exp=barcelonas +PASS Gheur +PASS Aheur +PASS Avocab +FAIL Npl Madrid got=Madrides exp=madrides +FAIL Gheur Madrid got=unknown exp=m +PASS Aheur +PASS Avocab +FAIL Npl María got=Marías exp=marías +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +FAIL Gheur billete got=unknown exp=m +PASS Aheur +PASS Avocab +PASS Npl +FAIL Gheur café got=unknown exp=m +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +FAIL Gheur corazón got=unknown exp=m +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +FAIL Npl demás got=demases exp=demás +FAIL Gheur demás got=unknown exp=m +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +FAIL Gheur día got=f exp=m +FAIL Aheur día got=la exp=el +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +FAIL Gheur estudiante got=unknown exp=m +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +FAIL Gheur flor got=m exp=f +FAIL Aheur flor got=el exp=la +PASS Avocab +PASS Npl +FAIL Gheur foto got=m exp=f +FAIL Aheur foto got=el exp=la +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +FAIL Gheur hombre got=unknown exp=m +PASS Aheur +PASS Avocab +PASS Npl +FAIL Gheur jardín got=unknown exp=m +PASS Aheur +PASS Avocab +PASS Npl +FAIL Gheur juez got=unknown exp=m +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +FAIL Gheur lentitud got=unknown exp=f +FAIL Aheur lentitud got=el exp=la +PASS Avocab +PASS Npl +FAIL Gheur ley got=unknown exp=f +FAIL Aheur ley got=el exp=la +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +FAIL Gheur llave got=unknown exp=f +FAIL Aheur llave got=el exp=la +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +FAIL Gheur luz got=unknown exp=f +FAIL Aheur luz got=el exp=la +PASS Avocab +PASS Npl +FAIL Gheur madre got=unknown exp=f +FAIL Aheur madre got=el exp=la +PASS Avocab +PASS Npl +FAIL Gheur mano got=m exp=f +FAIL Aheur mano got=el exp=la +PASS Avocab +PASS Npl +FAIL Gheur mapa got=f exp=m +FAIL Aheur mapa got=la exp=el +PASS Avocab +PASS Npl +FAIL Gheur mar got=unknown exp=m +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +FAIL Gheur moto got=m exp=f +FAIL Aheur moto got=el exp=la +PASS Avocab +PASS Npl +FAIL Gheur mujer got=unknown exp=f +FAIL Aheur mujer got=el exp=la +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +FAIL Gheur nieve got=unknown exp=f +FAIL Aheur nieve got=el exp=la +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +FAIL Gheur noche got=unknown exp=f +FAIL Aheur noche got=el exp=la +PASS Avocab +PASS Npl +FAIL Gheur nombre got=unknown exp=m +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +FAIL Gheur parte got=unknown exp=f +FAIL Aheur parte got=el exp=la +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +FAIL Gheur país got=unknown exp=m +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +FAIL Gheur pez got=unknown exp=f +FAIL Aheur pez got=el exp=la +PASS Avocab +PASS Npl +FAIL Gheur plan got=unknown exp=m +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +FAIL Gheur portavoz got=unknown exp=m +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +FAIL Gheur presidente got=unknown exp=m +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +FAIL Gheur razón got=unknown exp=f +FAIL Aheur razón got=el exp=la +PASS Avocab +PASS Npl +FAIL Gheur raíz got=unknown exp=f +FAIL Aheur raíz got=el exp=la +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +FAIL Gheur sol got=unknown exp=m +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +FAIL Gheur ti got=unknown exp=m +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +FAIL Gheur voz got=unknown exp=f +FAIL Aheur voz got=el exp=la +PASS Avocab +PASS Npl +PASS Gheur +PASS Aheur +PASS Avocab +PASS Npl +FAIL Gheur árbol got=unknown exp=m +PASS Aheur +PASS Avocab +PASS Ampl +PASS Afsg +FAIL Ampl ambos got=amboses exp=ambos +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +FAIL Ampl dos got=doses exp=dos +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ampl +PASS Afsg +PASS Ctr +PASS Ctr +PASS Ctr +PASS Ctr +PASS Ctr +PASS Ctr +PASS Ctr +PASS Ctr