Strategia per scrivere un programma di logica

0

Ho avuto difficoltà ad apprendere la programmazione logica finora, e la mia richiesta di risorse esterne su questo sito è stata soddisfatta con qualche obiezione, quindi forse questa domanda risponde meglio sia alle mie esigenze sia ai requisiti di questa comunità:

Esiste un approccio passo-passo alla scrittura di un problema in Prolog o in linguaggi logici correlati? Per esempio, inizialmente ho trovato le funzioni ricorsive difficili da creare da me stesso, anche se potevo più o meno comprendere quelle che leggevo, fino a quando ho appreso il seguente approccio (presentato approssimativamente e solo a scopo di esempio!):

  1. Descrivi il caso base, ovvero la forma più piccola del problema.
  2. Scopri come combinare i risultati dei casi ricorsivi, ad esempio aggiungi numeri, elementi di consen, ecc. Vedendo che ci sono stati alcuni modelli comuni qui ha aiutato immensamente!
  3. Scopri come rompere i risultati di un caso ricorsivo più ampio, cioè cdr in basso, sottrazione, ecc. Ancora una volta, vedere il numero limitato di schemi comuni era la chiave!

Quindi, una descrizione chiara di un processo correlato per affrontare un problema logico potrebbe essere molto utile.

    
posta Ben 02.08.2012 - 16:58
fonte

1 risposta

1

Hmmm, vediamo. Gli elementi più fondamentali dei linguaggi di programmazione sono stato, flusso di controllo e calcolo. La programmazione logica comprende molto di questo in una singola operazione molto potente: l'unificazione.

Invece di stato (variabili globali) che viene modificato tramite assegnazioni, si enfatizzano le variabili locali a assegnazione singola che ricevono valori attraverso l'unificazione con altre strutture. Il flusso di controllo è espresso attraverso parole chiave come if o while ; ma Prolog ha solo un operatore di regola di unificazione generale ( :- ) che definisce quando tentare l'unificazione e di cosa. Invece di cicli con while , in genere si utilizzano i predicati che si chiamano; questo dà risultati simili come loop, e con una certa cura è altrettanto efficiente (anche se più confuso per molti studenti). Anche il flusso di controllo più basilare - il sequenziamento delle operazioni - non è tecnicamente un costrutto di sequenziamento, ma un operatore logico AND ( , ) che si verifica solo per garantire una valutazione da sinistra a destra. Infine, il calcolo viene anche eseguito di solito dall'unificazione piuttosto che dagli operatori, ad es. per operazioni di lista o vincoli di destrutturazione. Anche l'aritmetica può essere fatta attraverso l'unificazione se si usano i numeri di Peano, sebbene questo sia certamente ingombrante, e Prolog ha anche un escape hatch nella normale valutazione aritmetica con is (ma ciò infrange la trasparenza referenziale e va un po 'contro lo spirito del sistema) . La maggior parte del programma Prolog non banale utilizza molti o tutti questi elementi.

Prendi il semplice compito "rovesciare un elenco": quasi tutte le soluzioni che vedi mai usano l'unificazione al posto dei "se" che useresti in altre lingue, distruggendo il binding per manipolare gli elenchi, la ricorsione per generalizzare da un unico elenco di elementi in liste arbitrarie e , per sequenziare il passo ricorsivo e il passo di combinazione. In ultima analisi, usano ancora i fondamenti dell'informatica come "IF" o "A, THEN B", ma sono tutti espressi nel mezzo di termini combinati tramite unificazione, dato potere arbitrario attraverso la ricorsione. È infatti sorprendentemente difficile trovare un predicato istruttivo che non usi la ricorsione in qualche modo. Se hai un esempio di un problema che non riesci a vedere come risolverlo, scrivilo per favore.

    
risposta data 02.08.2012 - 20:00
fonte

Leggi altre domande sui tag