La mia comprensione del problema, come inizialmente affermato e quindi aggiornato dai commenti nella risposta di Macke, include quanto segue: 1) entrambi i tipi di bordi (dipendenze e conflitti) sono diretti; 2) se due nodi sono collegati da un bordo, non devono essere collegati da un altro, anche se è dell'altro tipo o al contrario; 3) se un percorso tra due nodi può essere costruito mescolando bordi di tipi diversi, allora questo è un errore, piuttosto che una circostanza che viene ignorata; 4) Se esiste un percorso tra due nodi che utilizzano i bordi di un tipo, allora potrebbe non esserci un altro percorso tra loro che utilizza i bordi dell'altro tipo; 5) non sono consentiti cicli di un singolo tipo di bordo o di tipi di bordi misti (da un'ipotesi dell'applicazione, non sono sicuro che i cicli di solo conflitto siano un errore, ma questa condizione può essere rimossa, in caso contrario).
Inoltre, supporrò che la struttura dei dati utilizzata non impedisca l'espressione di violazioni di questi requisiti (ad esempio, un grafico che viola la condizione 2 non potrebbe essere espresso in una mappa dalla coppia di nodi a (tipo, direzione) se la coppia di nodi sempre ha prima il nodo meno numerato.) Se alcuni errori non possono essere espressi, riduce il numero di casi da considerare.
In realtà ci sono tre grafici che possono essere considerati qui: i due di un solo tipo di bordo e il grafico misto formato dall'unione di uno di ciascuno dei due tipi. Puoi usarlo per generare sistematicamente tutti i grafici fino a un certo numero di nodi. Innanzitutto genera tutti i possibili grafici di N nodi che non hanno più di un bordo tra due coppie ordinate di nodi (coppie ordinate perché questi sono grafici diretti.) Ora prendi tutte le possibili coppie di questi grafici, uno che rappresenta le dipendenze e l'altro che rappresenta i conflitti, e forma l'unione di ogni coppia.
Se la struttura dei dati non è in grado di esprimere violazioni della condizione 2, è possibile ridurre in modo significativo i casi da considerare costruendo solo tutti i possibili grafici di conflitto che si adattano agli spazi dei grafici di dipendenza o viceversa. Altrimenti, puoi rilevare violazioni della condizione 2 mentre formi l'unione.
Su un primo attraversamento del grafico combinato dal primo nodo, è possibile creare l'insieme di tutti i percorsi per ogni nodo raggiungibile e, mentre lo si fa, è possibile verificare la presenza di violazioni di tutte le condizioni (per il rilevamento del ciclo, è possibile usa l'algoritmo di Tarjan .)
Devi solo considerare i percorsi dal primo nodo, anche se il grafico è disconnesso, perché i percorsi di qualsiasi altro nodo appariranno come percorsi dal primo nodo in qualche altro caso.
Se i percorsi a bordo misto possono semplicemente essere ignorati, piuttosto che essere errori (condizione 3), è sufficiente considerare i grafici di dipendenza e conflitto in modo indipendente e verificare che se un nodo è raggiungibile in uno, non è nell'altro.
Se ricordi i percorsi trovati nell'esame dei grafici dei nodi N-1, puoi usarli come punto di partenza per generare e valutare i grafici dei nodi N.
Questo non genera più spigoli dello stesso tipo tra i nodi, ma potrebbe essere esteso per farlo. Ciò aumenterebbe notevolmente il numero di casi, quindi sarebbe meglio se il codice in prova rendesse impossibile rappresentare o, in mancanza, filtrare in anticipo tutti questi casi.
La chiave per scrivere un oracolo come questo è di mantenerlo il più semplice possibile, anche se ciò significa essere inefficienti, in modo da poter stabilire fiducia in esso (idealmente attraverso argomenti per la sua correttezza, supportato da test).
Una volta che hai i mezzi per generare casi di test e ti fidi dell'oracolo che hai creato per separare accuratamente il bene dal male, potresti usarlo per guidare il test automatizzato del codice target. Se ciò non è possibile, la tua prossima opzione migliore è quella di esaminare i risultati per casi distintivi. L'oracolo può classificare gli errori che trova e darti alcune informazioni sui casi accettati, come il numero e la lunghezza dei percorsi di ciascun tipo e se ci sono nodi che sono all'inizio di entrambi i tipi di percorso, e questo potrebbe aiutarti a cercare casi che non hai mai visto prima.