## Grammatica per la traduzione dal linguaggio naturale al Calcolo Relazionale su Tuple ## ## Idea : Per ogni componente della rappresentazione secondo il Calcolo Relazionale ## - Target List : derivata dalle tabelle ricavate e dagli attributi esplicitati nella domanda ## - Range List : costruita raccogliendo le tabelle ricavate dalla domanda ## - Formula Logica : costruita tramite composizione dei predicati presenti nella domanda ## ## 1. 'Quali sono le ricette senza fritture ?' ## { ric.*, mc.*, rmc.* | ric(ricetta), mc(metodocottura), rmc(ricettametodocottura) | ## -descrizione(mc, frittura)} ## ## 2. 'Quali sono le ricette con meno di 500 kcal ?' ## { ric.id, ric.nome, ric.descrizione, ric.energiakcal | ric(ricetta) | ## minore(ric, energiakcal, 500) } ## ## 3. 'Quali sono i piatti con più di 40 grammi di proteine ?' ## { ric.id, ric.nome, ric.descrizione, ric.proteineg | ric(ricetta) | ## maggiore(ric, proteineg, 40) } ## ## 4. 'Quali sono i piatti con meno carboidrati ?' ## { ric.id, ric.nome, ric.descrizione, ric.glucidig | ric(ricetta) | ## ordine(ric, glucidig, asc) } ## ## 5. 'Quali sono le preparazioni delle ricette primaverili ?' ## { ric.*, pre.* | ric(ricetta), pre(preparazione), sta(stagione) | ## descrizione(sta, primavera) } ## ## 8. 'Quali sono le ricette di pesce in ordine di difficoltà ?' ## { ric.*, dif.descrizione | ric(ricetta), dif(difficolta) ## ## 9. 'Quali sono le ricette facili con minore tempopreparazione ?' ## { ric.*, dif.descrizione | ric(ricetta), dif(difficolta) | ## descrizione(dif, facile) | ordine(ric, tempopreparazione, asc) } ## ## 10. 'Quali sono le ricette con cottura in forno o a vapore ?' ## { ric.*, mc.*, rmc.* | ric(ricetta), mc(metodocottura), rmc(ricettametodocottura) | ## ( descrizione(mc, forno) | descrizione(mc, vapore) ) } ## ## 12. 'Quali sono i piatti con pochi carboidrati ?' ## { ric.* | ric(ricetta) | pochi(ric, glucidig) } % start S ################# # Grammar Rules # ################# S[FL=?fl, ORD=?ord] -> VP NP PP[PT=with, FL=?fl, ORD=?ord] S[FL=?fl, ORD=?ord] -> VP NP[FL=?fl] PP[PT=in, ORD=?ord] S[FL=?pp, ORD=?ord] -> VP NP PP[ORD=?ord, FL=?pp] # Frase Verbale VP -> PI[NUM=?num] IV[NUM=?num] # Frase Nominale NP[FL=?fl] -> DET NN[FL=?fl] NP[FL=?fl] -> DET NN PP[PT=of, FL=?fl] NP[FL=?fl] -> NN NP[FL=?fl] NP[FL=<((?adv(?p1))(?p2))(?rl)>] -> ADV[FL=?adv] PP[FL=?p1] PP[RL=?rl, FL=?p2] NP[FL=<((?adv(?pp))(?nn))(?rl)>] -> ADV[FL=?adv] PP[FL=?pp] NN[RL=?rl, FL=?nn] NP[ORD=<(?adj(?rl))(?fl)>] -> ADJ[ORD=?adj] NN[RL=?rl, FL=?fl] NP[FL=<(?adj(?rl))(?fl)>] -> ADJ[-ORD, FL=?adj] NN[RL=?rl, FL=?fl] NP[FL=?fl] -> DET NN ADJ[FL=?fl] NP[FL=?np] -> CARD[FL=?np] NN NP[FL=<(?conj(?p1))(?p2)>] -> PP[FL=?p1] CONJ[FL=?conj] PP[FL=?p2] NP[FL=?fl] -> NN[FL=?fl] # Frase Preposizionale PP[PT=?pt, RL=?rl, FL=?fl, ORD=?ord] -> P[PT=?pt] NP[RL=?rl, FL=?fl, ORD=?ord] PP[PT=?pt, RL=?rl, FL=?fl] -> P[PT=?pt] NN[RL=?rl, FL=?fl] PP[PT=not, FL=<-(?fl)>] -> P[PT=not] NN[FL=?fl] PP[PT=in, ORD=] -> P[PT=in] NN[ORD=?nn] PP[RL=?pp] PP[PT=?pt, FL=?fl] -> P[PT=?pt] CARD[FL=?fl] PP[PT=?pt, FL=?fl] -> P[PT=?pt] NN ADJ[FL=?fl] ################# # Lexical Rules # ################# # Nome Comune NN[ORD=<\x.asc(x, id)>] -> 'ordine' NN[+TABLE, RL=] -> 'ricetta' NN[+TABLE, RL=] -> 'preparazione' NN[+TABLE, RL=] -> 'difficolta' NN[+TABLE, RL=, FL=] -> 'pesce' NN[+TABLE, RL=] -> 'cottura' NN[+TABLE, RL=] -> 'ingredienti' NN[+ATTR, RL=, FL=] -> 'proteineg' NN[+ATTR, RL=, FL=] -> 'glucidig' NN[+ATTR, RL=, FL=] -> 'energiakcal' NN[+ATTR, RL=, FL=] -> 'tempopreparazione' NN[+ATTR, RL=, FL=] -> 'persone' NN[+VAL, RL=, FL=] -> 'forno' NN[+VAL, RL=, FL=] -> 'vapore' NN[+VAL, RL=, FL=] -> 'fritture' NN -> 'grammi' # Verbo Intransitivo IV[NUM=pl] -> 'sono' # Avverbio ADV[FL=<\z y x.maggiore(x, y, z)>] -> 'più' ADV[FL=<\z y x.minore(x, y, z)>] -> 'meno' # Aggettivo ADJ[ORD=<\x y.desc(x, y)>] -> 'più' ADJ[ORD=<\x y.asc(x, y)>] -> 'meno' | 'minore' ADJ[FL=<\x y.poco(x, y)>] -> 'poco' ADJ[FL=<\x y.molto(x, y)>] -> 'molto' ADJ[+TABLE, RL=, FL=] -> 'facili' ADJ[+TABLE, RL=, FL=] -> 'primavera' # Pronome PRON -> 'che' # Aggettivo Cardinale CARD[FL=<4>] -> '4' CARD[FL=<25>] -> '25' CARD[FL=<40>] -> '40' CARD[FL=<500>] -> '500' # Congiunzione CONJ[FL=<\x y.(x | y)>] -> 'o' CONJ[FL=<\x y.(x & y)>] -> 'e' # Preposizione (PT = Preposition Type) P[PT=with] -> 'con' P[PT=not] -> 'senza' P[PT=of] -> 'di' | 'delle' | 'della' P[PT=in] -> 'in' P[PT=at] -> 'a' P[PT=for] -> 'per' # Articolo Determinativo DET[NUM=sg] -> 'il' | 'lo' | 'la' DET[NUM=pl] -> 'i' | 'gli' | 'le' # Pronome Interrogativo PI[NUM=pl, QRT=qual] -> 'Quali'