Linguaggio di programmazione con abbinamento di modelli negli alberi [chiuso]

1

Mi piacerebbe prototipare un sistema algebrico computerizzato. Un'equazione sarebbe rappresentata da un albero e le regole sarebbero definite - analogamente agli assiomi matematici - specificando un modello (nell'albero) e una regola di ristrutturazione per la parte abbinata dell'albero.

Puoi suggerire un linguaggio di programmazione che potrei sperimentare per testare questo approccio (idealmente non un linguaggio troppo sperimentale)? Fondamentalmente dovrebbe supportare strutture di dati di alto livello come liste (o effettivamente alberi) e rendere facile abbinare l'albero a un modello e anche sostituire una parte di un albero con un sostituto. Quindi riguarda la corrispondenza dei pattern della struttura dei dati di alto livello e una semplice modifica di questo.

EDIT: Ovviamente potrei prendere qualsiasi linguaggio di programmazione per scrivere il programma alla fine, ma sto cercando in particolare qualcosa che renda facile fare la prima idea di prototipazione. Non mi dispiace imparare una nuova lingua (per divertimento).

    
posta Gerenuk 10.05.2012 - 12:21
fonte

3 risposte

13

Esistono molte lingue con supporto per la corrispondenza dei modelli incorporata:

  1. ML (tutti i dialetti)

  2. Haskell - praticamente lo stesso approccio di ML, con un vantaggio significativo, ovvero la libreria Scrap your boilerplate che consente di sbarazzarsi della ricorsione esplicita per la maggior parte dei tipici attività di tree-walking.

  3. Qualsiasi Lisp decente o Scheme , in cui è possibile implementare una corrispondenza di pattern complesso arbitrario con metaprogrammazione. Molte implementazioni includevano già un pattern matching (ad esempio Racket o Bigloo ).

  4. Mathematica . È piuttosto costoso, ma vale la pena guardare, almeno come fonte di idee per essere portato nelle altre lingue. Le sue funzioni di riscrittura dei termini sono particolarmente utili per le applicazioni CAS: link

  5. Prolog . Il suo approccio alla corrispondenza dei modelli (unificazione) è in generale molto più lento di quello che farebbe la ML, ma in alcuni casi potrebbe essere estremamente utile. Fortunatamente, Prolog è facile da incorporare in altre lingue (vedi Schelog ).

risposta data 10.05.2012 - 13:32
fonte
3

Can you suggest a programming language I could experiment with to test this approach (ideally not too experimental language)?

Stai cercando una lingua, ma penso che la tua domanda dovrebbe essere quale tipo di linguaggio di programmazione.

Dopo aver lavorato con Object-oriented ( Imperativo ), Logica , Functional e Dichiarativo linguaggi di programmazione, vorrei suggerire qualcosa nel funzionale famiglia.

Se vuoi non sprecare tempo a analizzare l'input e capire o imparare espressioni-s , quindi suggerirei LISP . Se vuoi qualcosa che ha anche tipi, il che significa che potresti dover analizzare l'input o inserire i dati in una forma molto più vicina a quella che la definizione della struttura dei dati suggerirebbe forse OCaml , Schema o F# .

Per il motivo per cui dovresti usare un linguaggio funzionale su un linguaggio orientato agli oggetti vedi: OCaml for the Masses

Come introduzione generale alla scrittura di un valutatore di espressione di tipi di dati algebrici nei linguaggi funzionali, vedi Scrivi uno schema in 48 ore

    
risposta data 10.05.2012 - 13:27
fonte
2

Il tipo di corrispondenza tra gli alberi di cui hai bisogno non è fornito immediatamente da nessuno dei linguaggi di programmazione menzionati prima. Ad esempio, se si desidera provare a scomporre una somma di molti termini, ciascuno costituito da un numero arbitrario di fattori, i pattern devono essere non lineari (per trovare i fattori comuni) e consentire l'assegnazione dei segmenti (per conservare tutto il resto). Sebbene siano ampiamente disponibili nella corrispondenza delle stringhe, queste caratteristiche sono stranamente assenti nella maggior parte delle implementazioni di corrispondenza dei modelli di alberi.

Puoi guardare Tom ( link ), Egison ( link ) e alla mia lingua di animali Bracmat. (Cerca quello su GitHub, sono fuori dai link mentre sono nuovo su stackexchange). Bracmat è ben oltre la fase sperimentale. Anche se lo uso professionalmente principalmente per l'elaborazione del linguaggio naturale, è iniziato come un piccolo sistema algebrico nel 1988.

Puoi trovare esempi di Egison e Bracmat su rosettacode.

    
risposta data 17.10.2014 - 21:31
fonte