Un qualsiasi linguaggio di programmazione può dedurre i domini di una funzione dai domini delle sue funzioni di input?

6

Quindi mi piace lo sviluppo basato sui test e spesso ho voluto un linguaggio di programmazione per assistere alla creazione di routine di test. Ho voluto definire il dominio di una funzione e poi avere qualche 'buddy' di test generare alcuni input test casuali basati sul dominio, alcuni dati di test deliberatamente all'interno del dominio e alcuni deliberatamente all'esterno per testare il caso di errore, anche alcuni deliberatamente sul confine che è dove possono verificarsi più errori.

Sembra possibile con un attributo C # personalizzato adornato su parametri di un metodo. Tuttavia, mi piacerebbe un livello extra di intelligenza che mi piacerebbe domini dedotti, dedotti dai domini delle funzioni di feeder. Dovrei introdurre alcuni esempi di codice a questo punto, il seguente è VBA e illustra un caso in cui (dato un supporto linguistico sufficiente) il dominio di i(x) potrebbe essere dedotto guardando i domini di g(x) e h(x) .

Option Explicit

'* I'd like to define the domain of g(x) to be 2 <= x <= 5 , whilst g(x) maps x->x+1
Function g(x)
    If Not (2 <= x And x <= 5) Then g = CVErr(2011): Exit Function '* VBA domain screened with If

    g = x + 1
End Function

'* I'd like to define the domain of h(x) to be -4 <= x <= 4, whilst h(x) maps x->x^2
Function h(x)    
    If Not (-4 <= x And x <= 4) Then h = CVErr(2011): Exit Function '* VBA domain screened with If

    h = x ^ 2
End Function

Function i(x)
    '* it would be nice if a computer language could understand that the domain of i(x) can 
    '* be inferred from the domains
    '* of g(x) and h(x) and is thus 2 <= x <= 3 
    '* obviating the need for me to write the line explicitly

    i = h(g(x))
End Function

Scusa se questo è un esempio forzato ma nella mia esperienza sorgono istanze del mondo reale.

Credo che in termini formali il linguaggio necessiti di "definizione dichiarativa dei domini di funzione".

Quindi, in teoria, un linguaggio di programmazione potrebbe supportarlo?

Potrebbe essere correlato a Programmazione vincoli - Wikipedia ?

Altri link:

posta S Meaden 14.03.2018 - 13:11
fonte

1 risposta

8

Lascia che D(f) sia il dominio di una funzione f , C(f) il suo codominio e & l'operatore di intersezione. Consenti ulteriore g^-1(M) dei valori del dominio di g che mappano in un certo insieme M . Quindi si può scrivere il dominio di i come

 D(i) =  g^-1 ( C(g) & D(h) )

Quindi, come vedete, c'è più coinvolgimento dei soli domini di g e h , uno ha bisogno di conoscere il codominio di g e il reverse mapping g^-1 per un sottoinsieme arbitrario di quel codominio.

Questo si riduce alla conoscenza del comportamento esatto della funzione g, non solo di quei domini. Quindi, ad eccezione delle funzioni molto semplici o limitate g, l'unico modo generale per ottenerlo è probabilmente di riempire alcune mappe per ogni valore di D(g) e calcolare la mappatura inversa per ogni valore di C(g) & D(h) uno per uno. Questo potrebbe essere possibile per insiemi piccoli e finiti D(g) e D(h) , ma diventa non fattibile quando D(g) e D(h) sono troppo grandi per adattarsi completamente allo spazio di memoria disponibile (ad esempio, quando x in g (x ) è un valore doppio o un intero a 64 bit senza ulteriori restrizioni).

Nota ulteriormente diventa impossibile (in generale) se g si comporta "male" e va in un ciclo infinito. Quindi l'analizzatore dovrebbe risolvere il problema di interruzione .

    
risposta data 14.03.2018 - 13:44
fonte

Leggi altre domande sui tag