Una delle differenze chiave è che le relazioni logiche vengono utilizzate come tecnica per mostrare che una classe di programmi (ad esempio, input per un compilatore) corrisponde a un'altra classe di programmi (ad esempio, l'output del compilatore), mentre vengono utilizzate le relazioni di simulazione per mostrare la corrispondenza tra due programmi.
La somiglianza tra le due nozioni è che entrambe definiscono una relazione utilizzata per mostrare la corrispondenza tra due entità diverse. In un certo senso, si può pensare a una relazione logica come una relazione di simulazione definita induttivamente sulla sintassi dei tipi. Ma esistono diversi tipi di relazioni di simulazione.
Le relazioni logiche possono essere utilizzate per mostrare la corrispondenza tra una lingua come ML e la sua traduzione in linguaggio assembly, come nel documento che leggi. Una relazione logica viene definita induttivamente sulla struttura del tipo. Una relazione logica fornisce un mezzo compositivo per mostrare, ad esempio, che una traduzione è corretta, mostrando che la traduzione è corretta per ciascun costruttore di tipi. Ai tipi di funzione la condizione della condizione di correttezza direbbe qualcosa del genere, la traduzione di questa funzione richiede input ben tradotti in output ben tradotti.
Le relazioni logiche sono una tecnica versatile per i linguaggi basata sul calcolo lambda. Altre applicazioni delle relazioni logiche includono (da qui ): caratterizzare la definibilità lambda, correlare definizioni semantiche denotazionali, caratterizzare il polimorfismo parametrico, modellare l'interpretazione astratta, verificare rappresentazioni di dati, definire semantica completamente astratta e modellare lo stato locale in linguaggi di ordine superiore.
Le relazioni di simulazione sono generalmente utilizzate per mostrare l'equivalenza di due programmi. In genere tali programmi producono un certo tipo di osservazione, come l'invio di messaggi sui canali. Un programma P simula un altro Q se P può fare tutto ciò che Q può fare, anche se forse di più.
La bisimulazione, approssimativamente, è due relazioni di simulazione messe insieme. Dimostri che il programma P e simula il programma Q e che il programma Q può simulare il programma P e hai una bisimulazione, sebbene generalmente siano presenti condizioni aggiuntive. La voce di Wikipedia sulla bisimulazione è un buon punto di partenza (più preciso). Esistono migliaia di varianti dell'idea, ma è un'idea fondamentale che è stata reinventata più o meno nella stessa forma di informatica, logica modale e teoria dei modelli. L' articolo di Sangiorgi offre una meravigliosa storia dell'idea.
Un documento che stabilisce una relazione tra le due nozioni è una nota sulle relazioni logiche tra semantica e sintassi di Andy Pitts che utilizza relazioni logiche, in definitiva una nozione semantica definita sintatticamente, per dimostrare una certa proprietà sulla bisimulazione applicativa , che è una nozione puramente sintattica.