V7.2: Da valutare: * MetaLinguaggio di David Delayale per l'implementazione di tattiche V6.3: Da valutare: * Print * Extraction * Opaque/Transparent * SearchIsos * Load di script di tattiche * "Pretty" Parsing * Log dei tempi per ogni possibile richiesta * Undo * Focus/Unfocus (nella prova completa in linguaggio naturale) * Show Tree (resa dell'albero dei sequenti) * Tatticali: - OrElse - Repeat - Do - Info - Try - First - Solve - Abstract - ; - ; [ ... | ... | ... ] - (...) * Assumption * Apply with * LApply * Absurd * Contradiction * Cbv/Lazy Beta Delta Iota Zeta * Red (riduzione di un backbone con delta della testa + beta e iota) * Unfold (equivalente a Hnf dell'occorrenza) * Pattern * Constructor n / Split / Left/ Right/ Exists/ Reflexivity * Elim term quando term ha come tipo un Pi * ElimType (fatta da Zack; metterla disponibile) * Induction su una applicazione * Induction su una ipotesi * Case su una applicazione e su una ipotesi * Intros destrutturante * Decompose * Double Induction * Rewrite (ma eliminare un'uguaglianza o applicare eq_ind_r non funziona gia'?) * Replace (che prende due termini _NON_ convertibili e genera come goal l'uguaglianza dei due). Unificarla con la change, che diventa la replace non overkilling? * Symmetry e Transitivity (basta applicare i due teoremi giusti) * Decide Equality (ma non dovrebbe essere un teorema???) * Compare * Discriminate * Injection * Simplify_eq (== Discriminate o Injection su una ipotesi) * Dependent Rewrite * Inversion [Nota: Derive Inversion genera e salva il teorema!] * Quote (per implementare tattiche riflessive senza scrivere codice ML!!!!) * Tauto/Intuition * Linear * AutoRewrite * Realizer/Program * Scheme * Omega Implementate: * Enunciare un teorema * (Ri)aprire un teorema gia' dimostrato per modificarne certe parti * Check (e successiva possibilita' di applicare reduction tactics) * Exact * Apply/EApply * Cut * Change [Una conversion tactic. Problema: il termine digitato viene parsato nel contesto della conclusione e non in quello della selezione!!!] * Conversion tactics, sia nelle ipotesi che nella conclusione: - Reduce (== Compute) - Hnf - Simpl * Fold * ElimIntrosSimpl * Let...In (= LetTac) * Salvare e caricare una prova incompleta (ma nel posto sbagliato!) * ClearBody * Clear * Ring Da implementare: * Implicit: quando si usano gli implicit, l'input non puo' piu' essere type-checkato, ma bisogna fare una refine (ancora non implementata). Di conseguenza _OGNI_ tattica si rompe. Inoltre l'implementazione di Implicit e' ancora errata in quanto il contesto canonico delle nuove variabili e' sempre vuoto anche se dovrebbe essere uguale a quello di partenza + le nuove variabili introdotte durante il parsing. * Nella type_of NON viene controllato che il metasenv di una current-proof sia ben formato. PUNTO IMPORTANTE: farlo nel metasenv parziale, cosi' da evitare cicli; ma dopo e' un bordello l'unificazione. Oppure fare un semplice controllo di aciclicita'. * ClearBody e Clear NON restringono ancora altre metavariabili. Invece viene sollevata un'eccezione di tipaggio. Esempio: n:nat |- ?1[n] se faccio clear di n dovrei restringere ?1. Se invece prima faccio clear di n in ?1, quando torno su questo goal e faccio clear di n ottengo un'eccezione di CicPp. * La reduction_tactic (in ProofEngine.ml) e' bacatissima, come descritto nei commenti. Fixare. * Reimplementare Cut usando LetIn + applicazione + Intro oppure usando LetIn + ClearBody (soluzione piu' elegante IMHO) * Refine ? Sia [x:=t]r il tipo di [x:t]k e x non occorra mai libera in r. Dovrei forse tornare semplicemente r? ? Cambiare il nome delle META da int a una stringa? [ATTENZIONE: CAMBIAMENTO NELLA DTD] * Fold e' l'inverso di Reduce e quindi non disfa cio' che viene fatto da Simpl e da Whd. Generalizzarlo facendo Reduce e poi Change con ogni termine? Oppure fare una FoldWhd, una FoldHnf, una FoldSimpl, etc.? * Fold localizzato in un termine selezionato * Move e "Unclear" (che fa l'undo di Clear/Move e conversioni nelle ipotesi) Non sono implementabili. Ma avrebbero senso? * queries e roba basata sulle queries: - Search - Locate (anche di tipi induttivi e costruttori) - Auto - EAuto - Prolog (???????????) * Save con tanto di esportazione: esportare nel posto giusto! * Dare una definizione (quasi equivalente a check + unfold, ma mancano gli inner-types) * Dare una definizione induttiva * Intro (Come scegliere i nomi freschi?) e Intros until * Generalize * Fissare il bug di change (ovvero il problema del contesto in cui viene parsato l'input dell'utente) * Tornare un errore se si cerca di applicare una reduction tactic in una ipotesi nella scratch area * Field * JProver. Che rapporto c'e' fra JProver e Tauto/Intuition? * altre contrib da integrare? Da non implementare: * Print All * Compile/Read/Require * Print/Save/Restore States * Let