2011-12-01 4 views
5

La corrispondenza del modello (come trovata in ad esempio Prolog, i linguaggi della famiglia ML e varie shell di sistema esperto) normalmente funziona associando una query a data element per elemento in rigoroso ordine.Corrispondenza del modello con operatori associativi e commutativi

In domini come la dimostrazione automatica di teoremi, tuttavia, è necessario tenere presente che alcuni operatori sono associativi e commutativi. Supponiamo di avere dati

A or B or C 

e query

C or $X 

Andando dalla sintassi superficie questo non corrisponde, ma logicamente dovrebbe corrispondere con $X legato a A or B perché or è associativa e commutativa.

Esiste un sistema esistente, in qualsiasi lingua, che faccia questo genere di cose?

+0

non sono sicuro sono d'accordo con la vostra fusione di Prolog pattern matching vs. ML pattern matching. La corrispondenza del modello ML è puramente sintattica, e in Prolog non credo che sia così. – Gian

+0

Non sto dicendo che sono la stessa cosa, solo che hanno in comune il confronto degli elementi in ordine stretto. – rwallace

+0

Ritengo che un software di dimostrazione teorico dedicato come Otter lo faccia già posizionando le formule logiche in una forma normale e trattando le clausole come strutture dati impostate, il che costa O (n log n) tempo sia per la creazione che per la verifica. In realtà, presumo che abbiano ottimizzazioni preprogrammate per le operazioni per proprietà come associatività e commutatività. –

risposta

6

L'abbinamento di modelli commutativo-associativo è in circolazione dal 1981 and earlier ed è ancora un argomento caldo today.

Ci sono molti sistemi che implementano questa idea e la rendono utile; significa che puoi evitare di scrivere complicate corrispondenze di pattern quando è possibile utilizzare l'associazione o la commutatività per far coincidere il pattern. Sì, può essere costoso; meglio il pattern matcher lo fa automaticamente, che lo fai male a mano.

È possibile visualizzare un esempio in un rewrite system for algebra and simple calculus implementato utilizzando il nostro sistema di trasformazione del programma. In questo esempio, il linguaggio simbolico da elaborare è definito dalle regole grammaticali e quelle regole che hanno proprietà A-C sono contrassegnate. Riscrivi sugli alberi prodotti dall'analisi del linguaggio simbolico vengono automaticamente estesi per corrispondere.

1

Non ho mai incontrato una cosa del genere, e ho appena avuto un aspetto più dettagliato.

C'è un motivo computazionale del suono per non implementarlo di default - si deve essenzialmente generare tutte le combinazioni dell'input prima della corrispondenza del modello, oppure si deve generare il valore completo del cross-product delle clausole di corrispondenza.

Sospetto che il modo usuale per implementare questo sarebbe semplicemente scrivere entrambi i modelli (nel caso binario), cioè avere schemi per entrambi C or $X e $X or C.

A seconda dell'organizzazione di dati di base (di solito è tuple), questo abbinamento di pattern comporterebbe la riorganizzazione dell'ordine di elementi di tupla, il che sarebbe strano (in particolare in un ambiente fortemente tipizzato!). Se invece sono elenchi, allora ti trovi su un terreno ancora più oscuro.

Per inciso, ho il sospetto che l'operazione che si desidera fondamentalmente è modelli di unione disgiunta su insiemi, ad esempio:

foo (Or ({C} disjointUnion {X})) = ... 

L'unico ambiente di programmazione che ho visto che si occupa di set in ogni dettaglio sarebbe Isabelle/HOL e non sono ancora sicuro che sia possibile costruire le corrispondenze di pattern su di esse.

EDIT: Sembra che la funzionalità di Isabelle function (piuttosto che fun) vi permetterà di definire modelli non-costruttore complessi, salvo poi devi dimostrare che essi siano utilizzati in modo coerente, e non è possibile utilizzare più il generatore di codice.

EDIT 2: Il modo in cui ho implementato una funzionalità simile nel corso n operatori commutativi, associativi e transitivo è stata questa:

mie condizioni erano di forma A | B | C | D, mentre le query erano di forma B | C | $X, dove $X è stato permesso di abbinare zero o più cose. Ho pre-ordinato questi usando l'ordinamento lessografico, in modo che le variabili si siano sempre verificate nell'ultima posizione.

Per prima cosa, costruisci tutte le corrispondenze a coppie, ignorando le variabili per ora e registrando quelle che corrispondono in base alle tue regole.

{ (B,B), (C,C) } 

Se trattate questo come un grafo bipartito, allora si sono essenzialmente facendo un problema perfect marriage. Esistono algoritmi veloci per trovarli.

Supponendo che si trova uno, poi cogliendo tutto ciò che non appare sul lato sinistro della vostra relazione (in questo esempio, A e D), e li roba nella variabile $X, e il tuo partner è completare. Ovviamente si può fallire in qualsiasi momento, ma questo avverrà per lo più se non c'è alcuna variabile libera sul RHS, o se esiste un costruttore sul LHS che non corrisponde a nulla (impedendoti di trovare una corrispondenza perfetta).

Scusate se questo è un po 'confuso. È passato un po 'di tempo da quando ho scritto questo codice, ma spero che questo ti aiuti, anche un po'!

Per la cronaca, questo potrebbe essere non essere un buon approccio in tutti i casi. Avevo delle nozioni molto complesse di "match" su sottotermine (cioè, non un'eguaglianza semplice), e quindi set di costruzione o qualsiasi cosa non avrebbero funzionato. Forse funzionerà comunque nel tuo caso e puoi calcolare direttamente i sindacati disgiunti.

+0

Sono d'accordo, il mio pensiero finora su come implementare questo è convertire la rappresentazione basata su tuple in una rappresentazione di insieme in modo da essere in grado di eseguire questo tipo di query in modo ragionevolmente efficiente. Ho pensato che valesse la pena controllare se qualcuno avesse già inventato questa particolare ruota, per prima cosa. – rwallace

+0

Ho implementato qualcosa di simile in un model-checker per bigraphs. La composizione parallela per i bigraph è commutativa, quindi ho dovuto implementare esattamente questa funzionalità. È stato per lo più orribile implementare, devo dire.Il codice è disponibile, ma ho il sospetto che non sarà utile perché è molto legato ad altri codici di corrispondenza del bigraph e difficilmente sarà riusabile in modo utile. Modificherò la mia risposta per delineare il modo in cui l'ho implementata. – Gian

+1

Grazie! upvoted; Non so da chi sia provenuto il downvote. – rwallace

5

Il reindirizzatore di termini maude implementa la corrispondenza di pattern associativi e commutativi.

http://maude.cs.uiuc.edu/

+0

potresti fornire un link più specifico? forse con un esempio di codice? –