Quando possiamo dire che due programmi sono diversi?


15

Q1. Quando possiamo dire che due programmi (scritti in un linguaggio di programmazione come C ++) sono diversi?

Il primo estremo è dire che due programmi sono equivalenti se sono identici. L'altro estremo è dire che due programmi sono equivalenti se calcolano la stessa funzione (o mostrano lo stesso comportamento osservabile in ambienti simili). Ma questi non sono buoni: non tutti i programmi che controllano la primalità sono uguali. Possiamo aggiungere una riga di codice senza alcun effetto sul risultato e lo considereremmo comunque lo stesso programma.

Q2. I programmi e gli algoritmi sono lo stesso tipo di oggetto? In caso contrario, qual è la definizione di un algoritmo e in cosa differisce dalla definizione di un programma? Quando possiamo dire che due algoritmi sono equivalenti?


Il problema dell'isomorfismo del programma? Non si può chiedere "questo programma è isomorfo rispetto al programma che si ferma sempre?" e recuperare il problema di arresto? Se ci limitiamo al Bounded Halting Program Problem non è solo un isomorfismo grafico?
user834

5
Quando sono uguali due algoritmi? arxiv.org/abs/0811.0811
sdcvvc il

1
Non dipenderebbe interamente dal contesto? Diventando un po 'filosofico qui, ma una sedia imbullonata e una sedia imbullonata capovolta sono la stessa cosa fisicamente ma non la stessa in termini di idea di una sedia.
Rei Miyasaka,

Leggermente fuori tema, ma, dato che le prove sono programmi ... gowers.wordpress.com/2007/10/04/…
Radu GRIGore,

1
Il seguente articolo è molto correlato. L'ho sfogliato solo qualche tempo fa, ma Blass e Gurevic di solito scrivono davvero bene (non ricordo di aver letto nient'altro di Dershowitz, senza dire che di solito non è molto leggibile). research.microsoft.com/en-us/um/people/gurevich/Opera/192.pdf QUANDO SONO DUE ALGORITMI STESSI? ANDREAS BLASS, NACHUM DERSHOWITZ E YURI GUREVICH
kasterma

Risposte:


18

Q1: Esistono molte nozioni di equivalenza del programma (traccia di equivalenza, equivalenza contestuale, equivalenza osservativa, bisimilarità) che possono o meno tenere conto di cose come il tempo, l'utilizzo delle risorse, il non determinismo, la conclusione. Molto lavoro è stato fatto per trovare nozioni utilizzabili di equivalenza del programma. Ad esempio: Teorie basate sul funzionamento dell'equivalenza del programma di Andy Pitts . Ma questo a malapena graffia la superficie. Questo dovrebbe essere utile anche se sei interessato a quando due programmi non sono equivalenti. Si può anche ragionare su programmi non-stop (usando bisimulazione e coinduzione).

D2: Una possibile risposta a una parte di questa domanda è che i programmi interattivi non sono algoritmi (supponendo che uno consideri un algoritmo che prenda tutto il suo input in una volta, ma questa definizione ristretta esclude gli algoritmi online). Un programma potrebbe essere una raccolta di processi interagenti che interagiscono anche con il loro ambiente. Questo certamente non corrisponde alla nozione di algoritmo della teoria di Turing-machine / ricorsione.


IO e gli effetti collaterali in generale non sono affatto coperti dalle nozioni di algoritmo classico.
Raffaello,

15

L'altro estremo è dire che due programmi sono equivalenti se calcolano la stessa funzione (o mostrano lo stesso comportamento osservabile in ambienti simili). Ma questi non sono buoni: non tutti i programmi che controllano la primalità sono uguali. Possiamo aggiungere una riga di codice senza alcun effetto sul risultato e lo considereremmo comunque lo stesso programma.

Questo non è un estremo: l'equivalenza del programma deve essere definita in relazione a una nozione di osservazione.

La definizione più comune nella ricerca PL è l'equivalenza contestuale. In equivalenza contestuale, l'idea è che osserviamo i programmi usandoli come componenti di programmi più grandi (il contesto). Quindi, se due programmi calcolano lo stesso valore finale per tutti i contesti, vengono giudicati uguali. Poiché questa definizione si quantifica su tutti i possibili contesti di programma, è difficile lavorare direttamente. Quindi un tipico programma di ricerca in PL è quello di trovare principi di ragionamento compositivo che implicano equivalenza contestuale.

Tuttavia, questa non è l'unica nozione possibile di osservazione. Ad esempio, possiamo facilmente affermare che il comportamento di memoria, tempo o potenza di un programma è osservabile. In questo caso, valgono meno equivalenze di programma, poiché possiamo distinguere più programmi (ad esempio, mergesort è ora distinguibile da quicksort). Se si desidera (diciamo) progettare linguaggi immuni agli attacchi dei canali di temporizzazione o progettare linguaggi di programmazione limitati nello spazio, questo è il tipo di cosa che si deve fare.

Inoltre, possiamo scegliere di giudicare osservabili alcuni degli stati intermedi di un calcolo. Questo accade sempre per le lingue concorrenti, a causa della possibilità di interferenze. Ma potresti voler prendere questa visione anche per i linguaggi sequenziali, ad esempio, se vuoi assicurarti che nessun calcolo memorizzi i dati non crittografati nella memoria principale, allora devi considerare le scritture nella memoria principale come osservabili.

Fondamentalmente, non esiste un'unica nozione di equivalenza del programma; è sempre relativo alla nozione di osservazione che scegli, e dipende dall'applicazione che hai in mente.


1
Vale la pena sottolineare che non esiste nemmeno una nozione unica di equivalenza contestuale (o congruenza contestuale), ad esempio se il linguaggio di programmazione in questione è interattivo (cioè non produce un valore).
Martin Berger,

α

1
αα

1
@ SamTobin-Hochstadt. Ok, dimentichiamoci del "solito". La sensazione che provo è che stai dicendo la stessa cosa che ha detto Neel, che secondo me è stata abbastanza ben ponderata. La tua idea, che è ancora vaga per me, può essere formalizzata nel quadro di Neel selezionando il giusto tipo di osservazioni e il giusto tipo di contesti di programma.
Uday Reddy

1
λλX.Xλy.y

2

Q2: Penso che le solite definizioni teoriche non distinguano realmente tra algoritmi e programmi, ma "algoritmo" come comunemente usato è più simile a una classe di programmi. Per me un algoritmo è un po 'come un programma con alcune subroutine che non sono state completamente specificate (cioè il loro comportamento desiderato è definito ma non la loro implementazione). Ad esempio, l'algoritmo di eliminazione gaussiana non specifica realmente come deve essere eseguita la moltiplicazione dei numeri interi.

Mi dispiace se questo è ingenuo. Non faccio ricerche PL.


L'idea è probabilmente che ci sono più implementazioni per quelle subroutine e non ti importa quale sia scelto fintanto che funziona secondo le tue specifiche.
Raffaello,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.