prolog ha scritto:Potete darmi un esempio di codice di un PARSER magari in altri linguaggi?
Il sempre gentilissimo
fairyvilje te l'ha suggerito implicitamente, ma io quando leggo queste domande ho come l'impressione che a volte il messaggio non sia chiaro: realizzare un interprete del linguaggio naturale (che
non è un parser, ma qualcosa di molto più complesso) è un compito che richiede moltissimo tempo e soprattutto delle competenze tutt'altro che banali. Già solo la scrittura di un interprete per "little languages" è qualcosa che può richiedere mesi a un programmatore non doverosamente preparato, quindi non credo di esagerare se affermo che per fare un interprete per un linguaggio naturale potrebbe non bastarti tutta la vita che hai davanti.
Giusto per essere chiari, le
basi minime che devi studiare per poter anche solo tentare l'impresa sono le seguenti:
- Un buon linguaggio di programmazione come ad esempio il C... e attenzione, quando dico che devi studiarlo non intendo che devi imparare a scriverci dei programmini: intendo che se nella libreria standard c'è un punto in cui viene definita una macro invece che una funzione vera e propria tu lo devi sapere. Tempo di apprendimento stimato: circa 2-3 anni se programmi ogni giorno e ti cimenti nella scrittura di codice quanto più variegato possibile.
- MATEMATICA, e non lo scrivo in maiuscolo per caso: contrariamente a quanto molti smanettoni credono, l'informatica è prima di tutto matematica: dall'algebra di base alla teoria degli automi basata sui semigruppi passando per la teoria dei grafi e persino per l'analisi funzionale, se vuoi davvero capire cosa stai facendo (e se vuoi maneggiare le semantiche formali - perché di questo si parla quando si parla di interpretare un linguaggio naturale - lo devi capire per forza) devi conoscere quanto più possibile. Tempo di apprendimento stimato: 4-5 anni se impari a velocità supersonica.
- Algoritmica generale con cenni di teoria della complessità (la vedrai meglio dopo): strutture dati fondamentali (liste, tabelle di hash, grafi, code con e senza priorità...) con relativi algoritmi (dei quali, avendo studiato prima la matematica, riuscirai a capire il senso) e loro complessità, programmazione ricorsiva e dinamica (passando per gli algoritmi greedy, che è sempre bene conoscere perché in molti casi ti salvano) e quant'altro. Tempo di apprendimento stimato: 1 anno per avere almeno un'idea di base e aver imparato a pensare come qualcuno che capisce davvero il codice che scrive, probabilmente 2-3 per capire davvero.
- Teoria dei linguaggi formali: cosa sono le grammatiche formali, quali sono e che caratteristiche matematiche hanno gli interpreti per i linguaggi dei vari livelli della gerarchia di Chomsky (e qui capirai perché la teoria dei semigruppi è fondamentale), caratteristiche fondamentali degli automi per linguaggi a lunghezza infinita, differenze tra i vari tipi di macchina di Turing e modelli alternativi (uno tra tutti la macchina di Lambek, ma di modelli ce ne sono tantissimi), collegamento con la teoria della complessità e con i limiti della computazione. Tempo di apprendimento stimato: diciamo 2 anni per essere molto ottimisti, personalmente ritengo che per capire davvero potrebbe volerci molto di più.
- Logiche formali: almeno la logica proposizionale e la logica predicativa vanno conosciute alla perfezione e non meno vanno conosciuti gli algoritmi di minimizzazione e analisi quali ad esempio l'algoritmo DPLL, il vecchio algoritmo di Quine-McCluskey e almeno due versioni di ESPRESSO (l'algoritmo esatto e una delle varie versioni euristiche, per dire). Per completezza andrebbero studiate anche le basi delle logiche modali, ma facciamo finta di niente... Tempo stimato: 6-9 mesi di studio a medio-alto livello di concentrazione, anche perché è fondamentale che ogni spunto di riflessione e approfondimento sia colto e sviluppato.
- Teoria dei linguaggi di programmazione: si tratta probabilmente dell'unico modo sensato per farti vedere delle semantiche formali senza farti fare un frontale contro le difficoltà del linguaggio naturale, per cui è ovviamente necessario che tu sfrutti questa "palestra" nel modo migliore e dunque che impari come si deve cosa sono i linguaggi di programmazione, che caratteristiche hanno e come si definiscono e manipolano le loro sintassi e semantiche, ponendo particolare attenzione ai vari tipi di semantica dinamica e alle differenze tra loro. Fatto ciò, è fortemente raccomandato lo studio della teoria di base dei compilatori come trattata ad esempio nell'Aho-Lam-Sethi-Ulmann, così magari capisci perché quello che vuoi fare non è un semplice parser. Tempo di apprendimento stimato: a mio avviso per le basi minime dell'argomento non meno di 1 anno di studio
assistito (e cioè con l'assistenza di un docente), anche perché trovare libri di livello non troppo alto che spieghino bene le semantiche formali non è facilissimo.
- Teoria del linguaggio naturale: cosa sono i linguaggi naturali in termini formali, come vengono modellati e trattati, quali sono gli strumenti per la loro manipolazione algoritmica e come vengono usati davvero. Tempo di apprendimento stimato: se te la cavi in meno di 1 anno (di studio
assistito) ti faccio un applauso, personalmente stimo che 2 anni siano il minimo sindacale per avere il tempo di capire e applicare almeno i concetti fondamentali.
Questa è la storia, senza mezzi termini. Stando così le cose, a te la scelta: vuoi dedicare i prossimi 10-15 anni a studiare per questo progetto - scelta nobilissima e rispettabile che ti porterà a imparare tantissime cose interessanti e sconosciute anche alla stragrande maggioranza degli informatici - oppure ti aspettavi di potercela fare semplicemente leggendo il codice di un interprete (che è molto più di un parser, lo ribadisco) e quindi ora vuoi mollare?
Una nota a margine: esistono, come ti è già stato detto, librerie che semplificano la scrittura del codice e ti nascondono molti dei dettagli tecnici delle operazioni svolte... questo però non vuol dire che tu non debba sapere esattamente cos'è che non stai programmando esplicitamente, quindi non ti sognare neanche per sbaglio di poter tagliare i tempi di studio. Non mi piace essere il "cattivo" della discussione, perché il mio interesse è motivare le persone a studiare e non farle scappare via, ma è bene non dimenticare mai qual è la realtà delle cose.