Quali sono gli usi migliori della programmazione logica?
-
03-07-2019 - |
Domanda
Per Logica Programmazione intendo un sotto-paradigma di linguaggi di programmazione dichiarativa. Non confondere questa domanda con " Quali problemi puoi risolvere con if-then-else? & Quot;
Una lingua come Prolog è molto affascinante e vale la pena di apprenderla per motivi di apprendimento, ma devo chiedermi quale classe di problemi del mondo reale sia meglio espressa e risolta da tale lingua. Ci sono lingue migliori? La programmazione logica esiste con un altro nome in linguaggi di programmazione più alla moda? La versione cinica della risposta è una variante del Python Paradox ?
Soluzione
Prototipazione .
Prolog è dinamico ed è stato per 50 anni. Il compilatore è liberale, la sintassi minimalista e "facendo cose" è facile, divertente ed efficiente. SWI-Prolog ha un incorporato (debugger!) e persino un tracciante grafico . Puoi cambiare il codice al volo, usando make / 0
, puoi caricare dinamicamente i moduli, aggiungere alcune righe di codice senza lasciare l'interprete o modificare il file che stai correndo al volo con edit (1)
. Pensi di aver riscontrato un problema con il predicato foobar / 2
?
?- edit(foobar).
E non appena lascerai l'editor, quella cosa verrà ricompilata. Certo, Eclipse fa la stessa cosa per Java, ma Java non è esattamente un linguaggio di prototipazione.
A parte la pura roba di prototipazione, Prolog è incredibilmente adatto per tradurre un pezzo di logica in codice . Quindi, i tester automatici e quel tipo di cose possono essere facilmente scritti in Prolog.
Il primo interprete Erlang è stato scritto in Prolog - e per una ragione, poiché Prolog è molto adatto per l'analisi e la codifica della logica che trovi negli alberi di analisi . In effetti, Prolog viene fornito con un parser integrato! No, non una libreria, è nella sintassi, vale a dire DCG s .
Prolog è molto usato nella PNL, in particolare nella sintassi e nella semantica computazionale .
Ma Prolog è sottoutilizzato e sottovalutato. Sfortunatamente, sembra avere un carattere accademico o "inutilizzabile per qualsiasi scopo reale" stigma. Ma può essere sfruttato molto bene in molte applicazioni del mondo reale che coinvolgono fatti e il calcolo delle relazioni tra fatti. Non è molto adatto per lo scricchiolio dei numeri, ma CS non riguarda solo lo scricchiolio dei numeri.
Altri suggerimenti
Since Prolog = Unificazione sintattica + Concatenamento all'indietro + REPL ,
la maggior parte dei luoghi in cui viene utilizzata l'unificazione sintattica è anche un buon uso per Prolog.
Utilizza l'unificazione sintattica
- Trasformazioni AST
- Tipo Inferenza
- Riscrittura dei termini
- Dimostrazione del teorema
- Elaborazione del linguaggio naturale
- Corrispondenza di motivi
- Generazione di casi di test combinatori
- Estrai sottostrutture da dati strutturati come un documento XML
- Calcolo simbolico, ad es. calcolo
- Database deduttivi
- Sistemi esperti
- Intelligenza artificiale
- Analisi
- Lingue delle query
Constraint Logic Programming (CLP)
Sono già stati menzionati molti casi d'uso molto validi e adatti alla programmazione logica. Vorrei integrare l'elenco esistente con diversi compiti di un'area di applicazione estremamente importante della programmazione logica:
La programmazione logica si fonde perfettamente, più senza soluzione di continuità rispetto ad altri paradigmi, con vincoli , risultando in un framework chiamato Programmazione logica vincolata .
Questo porta a risolutori di vincoli dedicati per diversi domini , come:
- CLP (FD) per integer
- CLP (B) per Booleans
- CLP (Q) per numeri razionali
- CLP (R) per numeri in virgola mobile .
Questi risolutori di vincoli dedicati portano a diversi importanti casi d'uso di programmazione logica che non sono stati menzionati, alcuni dei quali mostrerò di seguito.
Quando si sceglie un sistema Prolog, la potenza e le prestazioni dei suoi risolutori di vincoli sono spesso tra i fattori decisivi, specialmente per gli utenti commerciali.
CLP (FD) & # 8212; Ragionamento sugli interi
In pratica, CLP (FD) è una delle applicazioni più importanti della programmazione logica e viene utilizzata, tra le altre cose, per risolvere compiti delle seguenti aree:
- pianificazione
- allocazione delle risorse
- pianificazione
- ottimizzazione combinatoria
Vedi clpfd per ulteriori informazioni e diversi esempi.
CLP (B) & # 8212; Vincoli booleani
CLP (B) è spesso usato in connessione con:
- Risoluzione dei problemi SAT
- verifica del circuito
- conteggio combinatorio
Vedi clpb .
CLP (Q) & # 8212; Numeri razionali
CLP (Q) è usato per risolvere importanti classi di problemi che si presentano in Operazioni & nbsp; Ricerca :
- programmazione lineare
- programmazione lineare intera
- programmazione lineare a numeri interi misti
Vedi clpq .
Prolog è ideale per problemi non numerici. Questo articolo fornisce alcuni esempi di alcune applicazioni di Prolog e potrebbe aiutarti a capire il tipo di problemi che potrebbe risolvere.
Una delle cose che Prolog ti offre gratuitamente è un algoritmo di ricerca di backtracking: potresti implementarlo tu stesso, ma se il tuo problema è risolto meglio avendo quell'algoritmo disponibile, allora è bello usarlo.
Le due cose in cui l'ho visto essere bravo sono le prove matematiche e la comprensione del linguaggio naturale.
Prolog è eccezionale nel risolvere enigmi e simili. Detto questo, nel campo della risoluzione di puzzle rende la risoluzione di puzzle facile / media più facile e complicata. Tuttavia, scrivere solutori per puzzle a griglia e simili come Hexiom, Sudoku o Nurikabe non è particolarmente difficile.
Una semplice risposta è "costruire sistemi". Il linguaggio usato per costruire Makefile (almeno, la parte per descrivere le dipendenze) è essenzialmente un linguaggio di programmazione logica, sebbene non sia in realtà un "puro" linguaggio di programmazione logica.