Come dimostrare che la sostituzione di un personaggio in una stringa in entrambi c e JavaScript è equivalente?
-
29-09-2020 - |
Domanda
Vorrei provare alcune prove diverse, in particolare nel dimostrare l'equivalenza dell'attuazione di alcune funzionalità in due diversi linguaggi di programmazione (C e JS in questa domanda).
Si tratta di dimostrare che Sostituzione di un carattere in una stringa equivale in C e JS
in JS, ad esempio, stringhe sono immutabili , mentre in c, stringhe sono mutable . Quindi in JS potresti farlo:
functioni replaceAt(string, index, replacement) {
return string.substr(0, index) + replacement + string.substr(index + replacement.length)
}
.
Mentre è in c potresti semplicemente fare qualcosa del genere:
#include<stdio.h>
int
main() {
char string[11] = "hello world";
string[1] = 'i';
printf("%s", string);
return 0;
}
.
Fondamentalmente, sto cercando di inventare un esempio in cui, il Effetto percepito o risultato desiderato è per tutti gli effetti e gli scopi < forte> lo stesso . Cioè, il risultato finale è che il carattere è stato sostituito in una posizione specifica (la stessa posizione in ogni lingua). Anche se in una lingua la stringa era mutabile , mentre nell'altro è stato immutabile . Ciò che deve essere preso in considerazione qui per fare una prova dicendo che questi sono equivalenti? Come catturaremo la nozione di "parziale equivalenza" o "equivalenza percepita"? (Con questo voglio dire, il risultato è all'incirca lo stesso, quindi vogliamo fare una dichiarazione di prova che questi sono gli stessi per quanto riguarda alcune specifiche).
Soluzione
Inizierei creando una definizione formale della funzione che desideri e dimostrando la correttezza ciascuna delle implementazioni.
Considera la seguente definizione assiomatica:
$$ Sostituzione: stringa * \ mathbb z * char \ to string $$
$$ \ forall c: char. (\ Forall I \ in \ MathBB Z ~. ~ Sostituzione (``, i, c)= ``) $$
$$ \ forall c: char. (\ Forall s: stringa. (\ forall I \ in 0 .. len (s) -1 ~. ~ Sostituzione (s, i, c) [i]= c)) $$
$$ \ forall c: char. (\ Forall s: stringa. (\ Forll I \ in 0 .. len (s) -1 ~. ~ Len (Sostituzione (S, I, C))= Len (s))) $$ < / P >.
$$ \ forall c: char. (\ forall s: stringa. (\ forall I, j \ in 0..len (s) -1. I \ neq j \ implica sostituzione (s, i, c) [j]= s [j]))) $$
$$ \ forall c: char. (\ forall s: stringa. (\ forall I \ in \ mathbbb z. I \ geq len (s) \ implica sostituzione (s , i, c)= s)) $$
Se è possibile dimostrare la correttezza di ogni implementazione a questi assiomi direi che sono equivalenti. Al momento la tua attuazione c non è nemmeno una funzione. La funzione JavaScript prende una stringa e non un char. Nessuno di questi è definito per gli indici superiori al tuo ingresso.
Non ritengo che il confronto dell'attuazione all'attuazione abbia senso in quanto ci sono molte differenze nei modelli di implementazione di ciascuna lingua.