Questa scaletta fornisce un percorso strutturato per imparare Prolog, Lisp e Qute, seguendo un approccio progressivo e didattico.
- Cos'è Prolog e perché è diverso dai linguaggi imperativi
- Paradigma della programmazione logica
- Ambiente di sviluppo: installazione di SWI-Prolog
- Primi passi con il REPL (Read-Eval-Print Loop)
- Termini Prolog: atomi, numeri, variabili, strutture
- Convenzioni di naming (atomi minuscoli, variabili maiuscole)
- Fatti semplici: come rappresentare conoscenza
- Query semplici: come interrogare la base di conoscenza
- Commenti e documentazione
- Definizione di regole con
:- - Concetto di clausola (testa e corpo)
- Regole condizionali (if-then)
- Backtracking: come Prolog esplora le soluzioni
- Esempi pratici: genealogia, classificazioni
- Notazione
[Head|Tail] - Operazioni base: append, member, length
- Pattern matching su liste
- Liste annidate
- Concetto di unificazione (
=) - Unificazione vs assegnazione
- Pattern matching strutturale
- Variabili anonime (
_)
- Ricorsione su liste
- Caso base e caso ricorsivo
- Ricorsione su strutture annidate
- Accumulatori e ricorsione tail-recursive
- Esempi: somma, lunghezza, reverse
- Alberi e strutture ricorsive
- Grafi: rappresentazione e attraversamento
- Operatori logici: congiunzione
,(AND), disgiunzione;(OR), negazione\+(NOT) - Precedenza degli operatori
- Combinazioni complesse
- Cut (
!) e controllo del backtracking - Cut verde vs cut rosso
-
failetrue - Alternative al cut:
once/1,if-then-else - Best practices: evitare cut non dichiarativi
- Confronti:
=,\=,==,\==,@<,@> - Aritmetica:
is/2, operatori aritmetici - Type checking:
atom/1,number/1,var/1,nonvar/1 - Input/Output:
write/1,read/1,format/2 - Manipolazione termini:
functor/3,arg/3,=.. - Lettura/scrittura file
- Parsing di dati strutturati
- Negazione come fallimento: uso corretto di
\\+/1con variabili istanziate - Determinismo vs non-determinismo: effetti su prestazioni e chiarezza
- Stream e formati: testo vs binario,
open/3,close/1
- Introduzione ai vincoli su domini finiti
- Dichiarazione:
:- use_module(library(clpfd)) - Vincoli aritmetici:
#=,#<,#>,#\= - Labeling e ricerca di soluzioni
- Esempi: puzzle, scheduling, ottimizzazione
- Definizione domini:
Vars ins Min..Max, domini enumerati e unione intervalli - Vincoli globali:
all_different/1,circuit/1,cumulative/2 - Opzioni di ricerca:
label/1,labeling/2conff,min,max,bisect,down - Strategia: prima vincolare, poi cercare; ridurre il branching con vincoli forti
-
call/1e predicati di ordine superiore -
maplist/3,foldl/4,include/3 - Manipolazione dinamica del codice
- Term expansion e macro
- Tabelle dinamiche (
assert/1,retract/1)
-
must_be/2per validazione input - Gestione errori con
catch/3ethrow/1 - Predicati di validazione custom
- Debugging:
trace/0,spy/1 - Best practices per codice robusto
- Dizionari e associazioni
- Quando usare strutture vs liste
- Serializzazione termini
- Database Prolog
- Integrazione con sistemi esterni
- Sistema esperto semplice
- Parser per linguaggi formali
- Risolutore di puzzle (Sudoku, N-Queens)
- Sistema di raccomandazioni
- Analizzatore sintattico
- Differenze principali: librerie, conformità ISO, comportamento I/O
- CLP(FD): moduli e nomi predicati compatibili/incompatibili
- Debugger e strumenti:
trace/0,gtrace/0(SWI) - Portabilità del codice: direttive condizionali e testing
- Storia e filosofia di Lisp
- Dialetti principali: Common Lisp, Scheme, Clojure
- Ambiente di sviluppo: installazione (SBCL, Clozure CL, o altro)
- REPL e ciclo read-eval-print
- S-expressions: atomi e liste
- Notazione prefissa e parentesi
- Atomi, numeri, stringhe, simboli
- Liste:
(car list),(cdr list),cons - Quote e valutazione:
',quote,eval - Funzioni speciali vs funzioni ordinarie
- Aritmetica numerica:
+,-,*,/,mod,rem - Arrotondamenti:
floor,ceiling,truncate,round - Confronti numerici:
=,/=,<,>,<=,>=
-
defun: definire funzioni - Parametri e argomenti
- Valori di ritorno:
return, valori multipli - Scope e binding: variabili locali e globali
- Documentazione inline con docstrings
- Ricorsione su liste
- Ricorsione tail-recursive
- Operazioni su liste:
append,reverse,member - Liste associative:
assoc,pairlis
- Macro
loopavanzata:for,collect,sum,when,finally - Alternative:
dolist,dotimes,do
- Funzioni come valori first-class
-
lambda: funzioni anonime -
applyefuncall - Closure e lexical scoping
- Mapping:
mapcar,mapcan,map - Folding:
reduce - Esempi pratici di HOF
- Costrutti iterativi:
loop,do,dolist,dotimes - Array e vettori
- Hash tables
- Strutture (
defstruct)
- Stream: input e output
- Lettura/scrittura file
- Formattazione:
format - Parsing e generazione di testo
- Serializzazione
- Namespace e packages
-
defpackageein-package - Export e import
- Organizzazione del codice
- Best practices per modularità
- Perché le macro sono potenti
-
defmacro: definire macro - Backquote e comma:
`,,,,@ - Macro vs funzioni: quando usare cosa
- Esempi:
when,unless, macro custom
- Introduzione a CLOS (Common Lisp Object System)
- Classi:
defclass - Metodi:
defmethod - Eredità multipla
- Generic functions e method combination
- Sistema di condizioni:
error,warn,signal -
handler-caseehandler-bind - Restart e recovery
- Best practices per gestione errori
- Compilazione:
compile-file,load - Dichiarazioni:
declare,optimize - Profiling e debugging
- Tipi e type declarations
- Inline functions
- Interprete Lisp semplice
- Sistema di simboli e valutazione
- Parser e generatore di codice
- Applicazione web (con framework Lisp)
- Tool di automazione
- Quicklisp: gestione pacchetti
- Librerie comuni e utili
- FFI (Foreign Function Interface)
- Integrazione con C e altri linguaggi
- Deployment e distribuzione
- Cos'è Qute: linguaggio ibrido Prolog-Lisp
- Introduzione a Qute: storia e filosofia
- Caratteristiche ibride: logica + funzionale
- Installazione e configurazione ambiente Qute
- REPL e ciclo di sviluppo
- Struttura base di un programma Qute
- Differenze e somiglianze con Prolog e Lisp
- Quando usare Qute vs Prolog vs Lisp
- Sintassi e semantica Qute
- Termini e atomi in Qute
- Liste e strutture dati
- Variabili e binding
- Pattern matching e unificazione
- Commenti e documentazione
- Fatti e regole (stile Prolog)
- Query e risoluzione
- Backtracking in Qute
- Predicati e clausole
- Esempi: database logici, relazioni
- Ordine di valutazione ibrido: chiamate funzionali in contesti logici
- Unificazione su risultati funzionali e simbolici
- Limiti e best practice per evitare non-terminazione
- Definizione di funzioni (stile Lisp)
- Funzioni come valori first-class
- Valutazione eager vs lazy
- Closure e scope
- Ricorsione in Qute
- Combinare predicati e funzioni
- Chiamare funzioni da predicati
- Usare predicati come funzioni
- Pattern matching ibrido
- Esempi di codice ibrido
- Esempi pratici in Qute
- Liste: operazioni logiche e funzionali
- Alberi e strutture ricorsive
- Mapping e filtering
- Accumulatori e folding
- Trasformazioni di dati
- Operatori logici: AND, OR, NOT
- Costrutti condizionali
- Iterazione e ricorsione
- Gestione del backtracking
- Cut e controllo esplicito
- Macro e code generation
- Manipolazione di codice
- Quote e eval
- Predicati di ordine superiore
- Esempi avanzati
- Struttura di progetti Qute
- Namespace e packages
- Import ed export
- Librerie e dipendenze
- Best practices organizzative
Riferimenti consigliati:
Qute_a_prolog_lisp_type_language_for_log.pdf
- Profiling codice Qute
- Ottimizzazione query logiche
- Efficienza funzionale
- Memoization e caching
- Best practices performance
Riferimenti consigliati:
Qute_A_PrologLisp_Type_Language_for_Logic_Programm.pdf
- Sistema che combina logica e funzionale
- Parser con valutazione logica
- Sistema di regole con funzioni
- Trasformazione dati con query logiche
- Integrazione di paradigmi
- Interoperabilità con Prolog
- Interoperabilità con Lisp
- Chiamate a librerie esterne
- Deployment applicazioni Qute
- Tooling e strumenti di sviluppo
- Materiale nella cartella
docs/:Programming In Prolog PDF.pdfPROLOG PROGRAMMING FOR ARTIFICIAL INTELLIGENCE - lvan Bratko.pdfLucidiProlog.pdf- Altri PDF su Prolog nella cartella
- Materiale nella cartella
docs/:Basic_Lisp_Overview_s_Numeric_Functions.pdflisp-p1.pdflispintro.pdfilmiolisp_08-2016-1.pdfDispensa2.pdf
- Materiale nella cartella
docs/:Qute_A_PrologLisp_Type_Language_for_Logic_Programm.pdfQute_a_prolog_lisp_type_language_for_log.pdf
- Esercizi progressivi per ogni fase
- Progetti incrementali che combinano concetti
- Code review e refactoring
- Partecipazione a comunità Prolog, Lisp e Qute
- Definizione domini:
Vars ins Min..Max, domini enumerati e unione intervalli - Vincoli globali:
all_different/1,circuit/1,cumulative/2 - Opzioni di ricerca:
label/1,labeling/2conff,min,max,bisect,down - Strategia: prima vincolare, poi cercare; ridurre il branching con vincoli forti
- Negazione come fallimento: uso corretto di
\+/1con variabili istanziate - Determinismo vs non-determinismo: impatto su prestazioni e chiarezza
- Stream e formati: testo vs binario,
open/3,close/1
- Differenze principali: librerie, conformità ISO, comportamento I/O
- CLP(FD): moduli e nomi predicati compatibili/incompatibili
- Debugger e strumenti:
trace/0,gtrace/0(SWI) - Portabilità del codice: direttive condizionali e testing
- Aritmetica numerica:
+,-,*,/,mod,rem - Arrotondamenti:
floor,ceiling,truncate,round - Confronti numerici:
=,/=,<,>,<=,>=
- Macro
loopavanzata:for,collect,sum,when,finally - Alternative:
dolist,dotimes,do
- Ordine di valutazione ibrido: chiamate funzionali in contesti logici
- Unificazione su risultati funzionali e simbolici
- Limiti e best practice per evitare non-terminazione
Questa scaletta è progettata per un percorso completo di circa 28 settimane:
- Settimane 1-10: Prolog (fondamenti e avanzato)
- Settimane 11-20: Lisp (fondamenti e avanzato)
- Settimane 21-28: Qute (linguaggio ibrido)
Con un ritmo di 2-3 ore di studio per settimana. Adatta il ritmo alle tue esigenze e approfondisci gli argomenti che ti interessano di più. La sezione su Qute presuppone una buona conoscenza sia di Prolog che di Lisp, essendo un linguaggio che combina entrambi i paradigmi.
Buono studio!