Questo repository contiene due implementazioni del problema del giro del cavallo, una in Haskell e una in Prolog, utilizzando l'algoritmo di Warnsdorff-Squirrel.
Il problema del giro del cavallo consiste nel trovare un percorso in cui un cavallo degli scacchi visita ogni casella di una scacchiera esattamente una volta. È un problema classico di teoria dei grafi e di backtracking.
L'algoritmo di Warnsdorff è una tecnica euristica utilizzata per risolvere il problema del giro del cavallo. L'algoritmo funziona scegliendo sempre la mossa che conduce alla casella con il minor numero di mosse successive possibili, riducendo così le possibilità di stallo. La versione combinata con l'approccio di Squirrel migliora ulteriormente le performance.
L'implementazione in Haskell utilizza una struttura dati bidimensionale (lista di liste) per rappresentare la scacchiera. Le coordinate sono rappresentate come coppie di interi.
- Clona il repository:
git clone https://github.com/yourusername/GiroDelCavallo-PLF.git cd GiroDelCavallo-PLF
- Compila il programma Haskell:
ghc -o giro_cavallo Haskell/squirrelWarnsdroff.hs
- Esegui il programma compilato:
./giro_cavallo
- Inserisci la dimensione della scacchiera e la posizione di partenza del cavaliere quando richiesto.
L'implementazione in Prolog utilizza fatti e regole per rappresentare i movimenti del cavallo e per verificare la validità delle mosse. La scacchiera è rappresentata come una lista di liste.
- Clona il repository:
git clone https://github.com/yourusername/GiroDelCavallo-PLF.git cd GiroDelCavallo-PLF
- Carica il programma Prolog:
gprolog --consult-file squirrelWarnsdroff.pl
- Esegui il programma:
?- main.
- Inserisci la dimensione della scacchiera e la posizione di partenza del cavaliere quando richiesto.
Il repository è organizzato come segue:
GiroDelCavallo-PLF/
│
├── Haskell/
│ └── squirrelWarnsdroff.hs. # Implementazione Haskell
│
└── Prolog/
└── squirrelWarnsdroff.pl # Implementazione Prolog
- Bisogna mettere "italian" per evitare cose del tipo "min-imizza" [-1].
- L'intero N può essere non positivo? Che significa "in tempi ragionevoli"? [-2].
-
Perché N diventa prima naturale e poi \ge 1? (x, y) che limiti ha?
-
Nella matrice i numeri devono essere distinti?
-
Da nessuna parte viene scritto che il cavallo si muove a L [-4].
-
Bisogna spiegare come funzionano l'algoritmo di Warnsdorff e la strategia di Squirrel e se il primo trova sempre la soluzione (quando esiste) come l'algoritmo di backtracking [2].
-
"Ripetizione del processo ricorsivo" è un ossimoro [-1].
-
In Haskell prima di main sarebbe il caso di lasciare una linea vuota [-1].
-
leggiDimensioneScacchiera non è una funzione ma un'azione [-1].
-
Presenza di linee lunghe che andando a capo rovinano l'indentazione [-1].
-
In Prolog si chiamano predicati, non funzioni [-1].
-
Misto di identificatori in italiano e in inglese (StartX) [-1].
- In Prolog dopo "main." e "Inserisci la dimensione della scacchiera (intero compreso tra 5 e 112):" compare "uncaught exception: error(existence_error(procedure,read_line_to_string/2),leggi_dimensione_scacchiera/0)" [-4].
Per Haskell dovete consegnarmi solo il .hs.
- Il tempo di esecuzione di un programma può dipendere anche dall'hardware utilizzato, solo la complessità computazionale non dipende da fattori esterni al programma [-2].
-
Numeri naturali distinti "compresi tra 1 ed N^2" [-1].
-
[X]Che bisogno c'è di usare coordinate che partono da (0, 0) anziché da (1, 1) [-1].
-
[X]Nella definizione generale di "una" matrice quadrata N x N non è affatto detto che i valori contenuti siano compresi tra 1 ed N^2, ciò vale per "la" matrice del problema [-1].
-
Nella progettazione dell'algoritmo non ci devono essere riferimenti ai linguaggi di implementazione (e comunque Haskell ha gli array) [-1].
-
Il passo 4 dovrebbe essere qualcosa del tipo "Se il giro viene completato con successo entro 2 minuti, stampa della scacchiera sotto forma di tabella con i numeri delle mosse del cavallo in ordine crescente, altrimenti stampa di un messaggio ..." [-1].
-
Presenza di linee lunghe che andando a capo rovinano l'indentazione [-1].
-
Evitare di scrivere che è una funzione/azione o un predicato non è accettabile [-1].
-
Seguendo l'ordine top-down inizializzaScacchiera, mossaValida, calcolaAccessibilita, ordinaMosse e aggiornaScacchiera vanno definite dopo risolviGiroCavallo [-1].
- In Prolog la tabella non viene stampata con le colonne allineate (nella sezione di testing i risultati vanno riportati fedelmente) [-1].
Progetto riconsegnato [-4].
-
leggiDimensioneScacchiera è un'azione, non una funzione [-1].
-
Seguendo l'ordine top-down inizializzaScacchiera, mossaValida, calcolaAccessibilita, ordinaMosse e aggiornaScacchiera vanno definite dopo risolviGiroCavallo [-1].
Progetto riconsegnato per la seconda volta [-6].