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 ?

È stato utile?

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 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 .

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 .

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top