Quali sono le tecniche formali comuni per dimostrare il codice funzionale corretto?


10

Voglio fornire prove per parti di un programma Haskell che sto scrivendo come parte della mia tesi. Finora, tuttavia, non sono riuscito a trovare un buon lavoro di riferimento.

Il libro introduttivo di Graham Hutton Programmazione in Haskell ( Google Libri ), che ho letto durante l'apprendimento di Haskell, tocca alcune tecniche per ragionare su programmi come

  • ragionamento equazionale
  • usando schemi non sovrapposti
  • elenco induzione

nel capitolo 13 ma non è molto approfondito.

Ci sono libri o articoli che puoi consigliare che forniscono una panoramica più dettagliata delle tecniche di dimostrazione formale per il codice Haskell o altri codici funzionali?

Risposte:


5

Uno dei metodi di fatto per dimostrare i risultati nella programmazione funzionale è tramite il gruppo di Richard Bird.

In particolare, si richiede un approccio approfondito o almeno più completo al ragionamento equazionale e all'induzione dell'elenco e questo è fornito nelle lezioni sulla programmazione funzionale costruttiva .

Più in generale, il testo "Algebra of Programming", di Bird e de Moor, si occupa anche della correttezza di algoritmi funzionali come ottimizzazione e problemi di programmazione dinamica.


Se trovi altre risorse utili per questo problema, ti preghiamo di menzionarle e forse possiamo trasformare questo post in un wiki.


Grazie! Certo, se trovo più risorse, mi assicurerò di aggiungerle al mio post.
FK82,

6

Puoi iniziare con

Gli argomenti includono concetti di base di logica, dimostrazione di teoremi assistiti da computer, assistente di dimostrazione Coq, programmazione funzionale, semantica operativa, logica Hoare e sistemi di tipo statico. L'esposizione è destinata a una vasta gamma di lettori, da studenti universitari avanzati a dottorandi e ricercatori. Non si presume alcun background specifico nella logica o nei linguaggi di programmazione, sebbene un certo grado di maturità matematica sarà utile.

Puoi saltare (o scremare) le parti della teoria del linguaggio di programmazione e imparare solo a gestire le prove formali a partire dalla Prefazione fino a IndPrinciples. Il libro è davvero ben scritto e illuminante.

Quindi potresti voler procedere con

In questo volume imparerai come specificare e verificare (dimostrare la correttezza di) algoritmi di ordinamento, alberi di ricerca binari, alberi di ricerca binari bilanciati e code prioritarie. Prima di usare questo libro, dovresti avere una certa comprensione di questi algoritmi e strutture dati, disponibili in qualsiasi manuale di algoritmi standard per gli studenti universitari. Dovresti comprendere tutto il materiale in Software Foundations Volume 1 (Logic Foundations)

Una nota di avvertimento: VFA è ancora in versione beta!


(Il tuo secondo link si dirige verso il posto sbagliato.) Inoltre, c'è una programmazione funzionale verificata in Agda ; che usa Agda, formalmente un linguaggio di programmazione ma usa unicode e quindi è più vicino alla notazione matematica.
Musa Al-hassy,

Corretto, grazie. Sì, ho letto VFPiA, ma non è di mio gusto.
Anton Trunov,

La ringrazio per la risposta! Penso che ci sia un malinteso. Non sto cercando tecniche funzionali per provare algoritmi (come un assistente di prova), ma tecniche per provare codice funzionale (ad esempio per dimostrare che un'implementazione funzionale di un determinato algoritmo è corretta) @ MusaAl-hassy answer è molto vicino alla mia risposta desiderata. Nel caso in cui mi mancasse e anche i libri che hai citato coprono questo aspetto, ti dispiacerebbe aggiungere i capitoli pertinenti?
FK82,

@ FK82 Ecco una sezione Theorem app_assoc : ∀ l1 l2 l3 : natlist, (l1 ++ l2) ++ l3 = l1 ++ (l2 ++ l3)del capitolo Liste . Questo esempio assomiglia a qualcosa che ti interessa? Cominciano con la programmazione funzionale in Coq, ma poi passano al ragionamento sulle proprietà dei programmi funzionali. I capitoli da Prefazione a IndPrinciples trattano entrambi, e direi che la programmazione e il ragionamento sono intrecciati lì.
Anton Trunov,

1
@ FK82 (1) Sono pienamente d'accordo con questo commento. (2) Potresti voler leggere il libro "Thinking Functionally with Haskell" (2015) di R. Bird. Il libro contiene tonnellate di esempi di ragionamento su Haskell. (3) Inoltre, "Pearls of Functional Algorithm Design" (2010) dello stesso autore potrebbe esserti di aiuto.
Anton Trunov,

5

Si scopre che un'eccellente fonte di tecniche di prova ed esempi per dimostrare cose su linguaggi funzionali puri sono gli assistenti di prova che di solito includono come parte del loro linguaggio di specifica un linguaggio funzionale puro sul quale è possibile ragionare equamente.

Si potrebbe desiderare di consultare un libro come Programmazione certificata con tipi dipendenti per un'introduzione approfondita a questo tipo di ragionamento in un assistente di prova specifico, vale a dire Coq.


Grazie! In realtà sto cercando specifiche tecniche in Haskell . Il mio post è stato modificato per includere tutto il codice funzionale, ma è ben al di sopra delle mie intenzioni.
FK82,

1
Non sono a conoscenza di sistemi progettati per verificare specificamente Haskell, ma vorrei notare che 1) Il nucleo funzionale di Coq (e Agda) è essenzialmente indistinguibile da quello di Haskell (tranne per la limitazione delle funzioni totali ) e 2) Programmi verificati in Coq e Agda possono essere estratti in Haskell (anche se credo che l'estrazione in Haskell sia meglio supportata in Agda, dove Coq è più incentrato su Ocaml)
codice

Buono a sapersi! Ciò implicherebbe tuttavia che riscrivo il mio programma (o le parti pertinenti) in Coq o Agda. Non penso sia ragionevole nel mio caso.
FK82,

Ci sono un paio di "front-end" molto sperimentali che provano a convertire Haskell in Isabelle o provano direttamente le equivalenze usando Isabelle, ma non terrei troppa scorta nella loro maturità. Penso che riscrivere il codice alla fine sarebbe meno lavoro.
cody,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.